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


Anmelden zum Antworten