Noob und Fehler
-
hi,
ich will jetzt auch mti der Spieleprogrammierung anfangen.
Habe Visual C++ und das DXSDK.Jetzt habe ich folgenden code:
#define WIN32_LEAN_AND_MEAN // MFC ist überflüssig also schalten wir sie ab #include <windows.h> // include aller windows header #include <D3DX8.h> // include der DX8 header #define WNDCLASSNAME "DirectX8 Lesson 1" // Hier werden die DX8 Libs für den Linker eingefügt // Ihr könnt es auch über die Link Liste einstellen // (in VC++: Projekt->Einstellungen->Linker) // Ich erledige das hier um mir unnötige Fragen zu erparen #pragma comment(lib,"d3d8.lib") #pragma comment(lib,"d3dx8.lib") // Funktions Header void FatalError(const char *FehlerMsg); void FatalError(HRESULT hr,const char *FehlerMsg); LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam); void InitWindow(void); void KillWindow(void); void D3DInit(void); void D3DShutdown(void); void D3DInitScene(void); void D3DKillScene(void); D3DFORMAT D3DFind16BitMode(void); void D3DRender(void); HWND mainhwnd=NULL; HINSTANCE maininstance=NULL; bool run=true; // Status des Programmes ( Läuft, Läuft nicht ) // Das main Direct3D Interface, es wird zum initialisieren und schließen von // D3D benötigt LPDIRECT3D8 lpd3d=NULL; // Das main D3DDevice wird zum Rendern benutzt und Spiegelt den Bildschirm mit allen Funktionen // wieder. Wenn wir das D3DRender Interface erstellen, verändern oder rendern, machen wir das // über dieses Interface IDirect3DDevice8 *lpd3ddevice=NULL; // *** WINMAIN der Hauptteil des Programmes int APIENTRY WinMain(HINSTANCE p_instance,HINSTANCE p_prev_instance,LPSTR p_cmd_line,int p_show){ MSG msg; maininstance=p_instance; InitWindow(); // Erstellen des Fensters D3DInit(); // Initialisieren von D3D D3DInitScene(); while(run) { if(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } D3DRender(); // Zeichne unsere Grafiken } // Lösche die D3D Scene bevor wir D3D beenden D3DKillScene(); // Lösche D3D D3DShutdown(); // Schließe das Programm KillWindow(); // Programm ohne Fehlermeldung beenden return 0; } // Mit dieser Funktion initialisieren wir D3D void D3DInit(void){ HRESULT hr; D3DPRESENT_PARAMETERS d3dpp; //Erstelle Direct3D! Muß immer als erstes erstellt werden //Immer D3D_SDK_VERSION als Version setzen lpd3d = Direct3DCreate8( D3D_SDK_VERSION ); if(!lpd3d ){ FatalError("Fehler beim erstellen von Direct3D"); } // Setze D3DPRESENT_PARAMETERS auf 0, sonst könnten wir probleme mit älteren // Eintragungen bzw. unkontrollierbaren Ergebnissen bekommen! // Sollten wir bei allen DirectX Strukturen machen ZeroMemory(&d3dpp,sizeof(d3dpp)); // Hiermit werden alte Frames gelöscht, denn wir brauchen sie nicht d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = mainhwnd; //Dies ist unser HWND d3dpp.BackBufferCount= 1; // 1 Backbuffer d3dpp.Windowed = FALSE; d3dpp.BackBufferWidth = 640; d3dpp.BackBufferHeight = 480; d3dpp.BackBufferFormat = D3DFind16BitMode(); //Nachdem wir die D3DPRESENT_PARAMETERS Struktur ausgefüllt haben, sind wir // endlich so weit unser D3D Device zu erstellen hr=lpd3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mainhwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &lpd3ddevice); if(FAILED(hr)){ FatalError(hr,"Error creating device\n"); } } // *** D3DShutdown hier werden die Resourcen von D3D wieder freigegeben void D3DShutdown(void){ if(lpd3ddevice){ lpd3ddevice->Release(); lpd3ddevice=NULL; } if(lpd3d){ lpd3d->Release(); lpd3d=NULL; } } void D3DInitScene(void) { } void D3DKillScene(void) { } D3DFORMAT D3DFind16BitMode(void) { HRESULT hr; hr=lpd3d->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_R5G6B5, // Format Primary D3DFMT_R5G6B5, // Format Buffer FALSE); if(SUCCEEDED(hr)) return D3DFMT_R5G6B5; hr=lpd3d->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_X1R5G5B5,D3DFMT_X1R5G5B5,FALSE); if(SUCCEEDED(hr)) return D3DFMT_X1R5G5B5; FatalError("Der erforderliche D3D Modus wird von ihrer Karte nicht unterstützt"); return (D3DFORMAT)NULL; } void D3DRender(void){ static unsigned char red=0,green=0,blue=0; blue++; lpd3ddevice->Clear(0, // Wieviel Rechtecke löschen? 0 Löscht alle NULL, //Pointer zu den Rechtecken. NULL = Ganzer Bildschirm D3DCLEAR_TARGET, D3DCOLOR_XRGB(red,green,blue), //Hintergrundfarbe 1.0f, // Lösche ZBuffer ( Wir haben momentan noch keinen ) 0 ); if(SUCCEEDED(lpd3ddevice->BeginScene())) { // Hier wird später alles stehen, was gerendert werden soll lpd3ddevice->EndScene(); } // Zeige Resultate auf dem Bildschirm lpd3ddevice->Present(NULL, NULL, NULL, NULL ); } // Hier erstellen wir das Windowsfenster void InitWindow(void) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_OWNDC; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = maininstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = WNDCLASSNAME; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Registriere die Windows Klasse if(!RegisterClassEx(&wc)) { FatalError("Fehler beim registrieren der Windowsklasse"); } mainhwnd=CreateWindowEx(NULL, WNDCLASSNAME, "Lesson1", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, 400, 400, NULL, NULL, maininstance, NULL); if(!mainhwnd){ FatalError("Fehler beim erstellen des Fensters"); } ShowWindow(mainhwnd,SW_SHOW); UpdateWindow(mainhwnd); SetFocus(mainhwnd); } void KillWindow(void) { if(mainhwnd){ if(!DestroyWindow(mainhwnd)) { MessageBox(NULL,"Destroy Window Failed",WNDCLASSNAME,MB_OK|MB_ICONERROR|MB_TOPMOST); } else { MSG msg; while(PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)) { DispatchMessage(&msg); } } mainhwnd=NULL; } } void FatalError(const char *FehlerMsg) { D3DKillScene(); D3DShutdown(); KillWindow(); OutputDebugString( FehlerMsg ); OutputDebugString("\n"); MessageBox(NULL, FehlerMsg,WNDCLASSNAME, MB_OK ); exit(5); } void FatalError(HRESULT hr,const char *FehlerMsg) { char buffer[255]; D3DXGetErrorStringA(hr,buffer,250); strcat(buffer,"\n"); strcat(buffer,FehlerMsg); D3DKillScene(); D3DShutdown(); KillWindow(); OutputDebugString( buffer ); OutputDebugString("\n"); MessageBox(NULL, buffer,WNDCLASSNAME, MB_OK ); exit(5); } LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam){ switch(msg){ case WM_KEYDOWN: switch(wparam) { case VK_ESCAPE: run=false; } return 0; case WM_CLOSE: run=false; return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return (DefWindowProc(hwnd,msg,wparam,lparam)); }
Aus den Tutorials habe ich herrausgelesen das jetzt eigentlich ein Fullscreen Window mit Schwarzem Hintergrund aber bei mir kommt beim Kombilieren ein Fehler:
--------------------Configuration: Lesson1 - Win32 Debug--------------------
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/Lesson1.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.Lesson1.exe - 2 error(s), 0 warning(s)
So ein ähnlicher Fehler kommt auch wenn ich etwas aus den DXSDK Samples Kombiliere.....
Ich hoffe ihr könnt mir helfen....
Mfg
Bennet
-
Das liegt daran, dass du ein Win32-Konsolen Projekt erstellt hast und nicht Win32 Application.
Jedenfalls kommt mir dieser Fehler in diesem Zusammenhang bekannt vor.
cu para
-
Am Anfang das Projekt als "Win32 Projekt" erstellen, nicht Konsole.
Da war ich mit meinem 2-Finger-Suchsystem wohl was langsam
[ Dieser Beitrag wurde am 10.02.2003 um 21:39 Uhr von Wanderer editiert. ]
-
Jo, ich denke auch, es liegt daran...
Kannst Du auch im Nachhinein in den Projekteinstellungen ändern.Trotzdem: Du hättest erstmal den Fehler posten können. Und nicht tausend Seiten Codeausschnitt...
Next time weißt'e bescheid...
Ciao...
Sarge
-
k thx!
Mfg
Bennet
-
Boa ey... sorry noch ne Frage ^^"
--------------------Configuration: 3D Test2 - Win32 Debug--------------------
Linking...
lighting.obj : error LNK2001: unresolved external symbol "public: virtual int thiscall CD3DApplication::Run(void)" (?Run@CD3DApplication@@UAEHXZ)
lighting.obj : error LNK2001: unresolved external symbol "public: virtual long __thiscall CD3DApplication::Create(struct HINSTANCE__ *)" (?Create@CD3DApplication@@UAEJPAUHINSTANCE@@@Z)
lighting.obj : error LNK2001: unresolved external symbol "public: virtual void thiscall CD3DApplication::Pause(int)" (?Pause@CD3DApplication@@UAEXH@Z)
lighting.obj : error LNK2001: unresolved external symbol "public: virtual long __thiscall CD3DApplication::MsgProc(struct HWND__ *,unsigned int,unsigned int,long)" (?MsgProc@CD3DApplication@@UAEJPAUHWND@@IIJ@Z)
lighting.obj : error LNK2001: unresolved external symbol "protected: virtual long __thiscall CD3DApplication::AdjustWindowForChange(void)" (?AdjustWindowForChange@CD3DApplication@@MAEJXZ)
lighting.obj : error LNK2001: unresolved external symbol "public: __thiscall CD3DFont::CD3DFont(char *,unsigned long,unsigned long)" (??0CD3DFont@@QAE@PADKK@Z)
lighting.obj : error LNK2001: unresolved external symbol "public: __thiscall CD3DApplication::CD3DApplication(void)" (??0CD3DApplication@@QAE@XZ)
lighting.obj : error LNK2001: unresolved external symbol "public: long __thiscall CD3DFont::InitDeviceObjects(struct IDirect3DDevice8 *)" (?InitDeviceObjects@CD3DFont@@QAEJPAUIDirect3DDevice8@@@Z)
lighting.obj : error LNK2001: unresolved external symbol "public: long __thiscall CD3DFont::RestoreDeviceObjects(void)" (?RestoreDeviceObjects@CD3DFont@@QAEJXZ)
lighting.obj : error LNK2001: unresolved external symbol _D3DXMatrixPerspectiveFovLH@20
lighting.obj : error LNK2001: unresolved external symbol _D3DXMatrixLookAtLH@16
lighting.obj : error LNK2001: unresolved external symbol "void __cdecl D3DUtil_InitMaterial(struct _D3DMATERIAL8 &,float,float,float,float)" (?D3DUtil_InitMaterial@@YAXAAU_D3DMATERIAL8@@MMMM@Z)
lighting.obj : error LNK2001: unresolved external symbol _D3DXCreateCylinder@32
lighting.obj : error LNK2001: unresolved external symbol _D3DXCreateSphere@24
lighting.obj : error LNK2001: unresolved external symbol "public: long __thiscall CD3DFont::DrawTextA(float,float,unsigned long,char *,unsigned long)" (?DrawTextA@CD3DFont@@QAEJMMKPADK@Z)
lighting.obj : error LNK2001: unresolved external symbol _D3DXMatrixInverse@12
lighting.obj : error LNK2001: unresolved external symbol _D3DXMatrixRotationX@8
lighting.obj : error LNK2001: unresolved external symbol _D3DXMatrixRotationZ@8
lighting.obj : error LNK2001: unresolved external symbol _D3DXMatrixTranslation@16
lighting.obj : error LNK2001: unresolved external symbol "public: long __thiscall CD3DFont::InvalidateDeviceObjects(void)" (?InvalidateDeviceObjects@CD3DFont@@QAEJXZ)
lighting.obj : error LNK2001: unresolved external symbol "public: long __thiscall CD3DFont::DeleteDeviceObjects(void)" (?DeleteDeviceObjects@CD3DFont@@QAEJXZ)
lighting.obj : error LNK2001: unresolved external symbol "public: __thiscall CD3DFont::~CD3DFont(void)" (??1CD3DFont@@QAE@XZ)
lighting.obj : error LNK2001: unresolved external symbol _D3DXMatrixMultiply@12
Debug/3D Test2.exe : fatal error LNK1120: 23 unresolved externals
Error executing link.exe.3D Test2.exe - 24 error(s), 0 warning(s)
Das war beim DX SDK dabei.... aber es klappt nicht! Es ist eine Win32 Appi!
Mfg
Bennet
-
DX8 Libs-/Include Dateien zu deinem Projekt linken.
-
Hmmmm und steht da auch irgendwo welche Dateien ich linken muss?
Ich habe es mal versucht aber es klappt net... wo stelle ich das ein?Danke für Antworten
Mfg
Bennet
-
In Deinem Compiler mußt Du unter "Verzeichnisse" o.ä. einstellen, daß er include- / lib-Dateien zuerst im DirectX SDK Verzeichnis suchen soll.
Zudem mußt Du lib-Dateien entweder "manuell" zu Deinem Projekt hinzufügen, damit sie in Betracht gezogen werden, oder mit der #pragma-Direktive.
Ich weiß ja nicht welchen Compiler Du benutzt, dazu schreibst Du ja nix.
Aber in Visual C++ würde ich an Deiner Stelle Projekt->Dem Projekt hinzufügen->Dateien... (o. so ä.) wählen, lib-Dateien wählen, und den ganzen Inhalt des DirectX-SDK\lib Ordners auswählen.
Meistens brauchst Du noch die winmm.lib - diese liegt im lib-Ordner des Compilers.Ciao, Sarge
-
In den .dwss (oder .dsps?) sollten die entsprechenden Linkereinstellungen doch schon vorgenommen worden sein, oder?
Achte einfach auf dir Reihenfolge der Lib-Dirs!
-
Ich benutze den Compiler da der Bei VC++ dabei is also Build und compile DATEI.CPP ^^
Mfg
Bennet
-
Sind diese ganzen Fehlerquellen nicht in der FAQ aufgelistet, ich denke schon!
-
hat hier jemand das DX SDK?
Dann frag ich mal so:
Öffne bitte das Sample im C++ Ordner "lightning" und jetzt sagt mir ganz genau was ich machen muss(vom anfang bis zum Ende)!
Anhand dieses Beispieles werde ich dann ja auch die anderen 3D Proggs zum laufen bekommen *hoff*Danke für Antworten!
Mfg
Bennet
-
Mir fällt grad noch ein Fehler auf, der unpassende Threadname.
[ Dieser Beitrag wurde am 11.02.2003 um 18:58 Uhr von TGGC editiert. ]
-
Die MSVC++ solltest du schon beherrschen können wenn du dich an die Spieleprogrammierung ranwagst.
Such mal im Internet nach irgendeinem Tutorial, ich glaube nicht das hier einer Lust hat dir das alles zu erklären (wozu gibts eigentlich die Dokumentation)
-
Mhhh...
Du meinst sicher "Lighting", nich' "Lightning"...!!
Und das befindet sich im "Direct3D"-Ordner im "C++"-Ordner des "Samples"-Ordners des DirectX 9 SDKs... *g*Ich teile durch mein Gehirn über die Nervenbahnen meinen Synapsen der Arm-Muskeln mit, daß sie durch Bewegung der Maus den Maus-Cursor auf das VC++ Menü "Datei" schieben, und mein rechter Zeigefinger dann auf die linke Maustaste klicken soll.
Als nächstes wähle ich "Arbeitsbereich öffnen...", wühle mich durch die ganzen Ordner in obengenanntes Verzeichnis, öffne "Lighting.dsw", und wähle dann im Menü "Erstellen"->"Alles neu erstellen"...
Dann dreht meine CPU ein paar Runden, alsdann erscheint "0 Fehler, 0 Warnung(en)" in der Output-Leiste unten, und ich klicke im "Erstellen"-Menü auf "Ausführen von Lighting.exe", woraufhin dat Dingen läuft...Noch irgendwat!?
Sarge
hat hier jemand das DX SDK?
Dann frag ich mal so:
Öffne bitte das Sample im C++ Ordner "lightning" und jetzt sagt mir ganz genau was ich machen muss(vom anfang bis zum Ende)!
Anhand dieses Beispieles werde ich dann ja auch die anderen 3D Proggs zum laufen bekommen *hoff*
Danke für Antworten!Mfg
Bennet