Warum ist pD3D schon definiert?
-
Hallo
Ich habe heute ein Spiel begonnen zu programmieren. Doch nun habe ich beim kompilieren 4 Fehler.
Hier ist der Quellcode:
// D3D.h // // DirectX initialisieren // #ifndef D3D_HPP #define D3D_HPP #include <d3d9.h> #include <d3dx9.h> #include "D3DScenario.h" #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 // Klasse erzeugen // class CD3D { public: CD3D (); ~CD3D (); void Init_D3D (HWND hwnd); void Show3DScenario (void); void Clear_D3D (void); IDirect3D9 * d3d; IDirect3DDevice9 * d3ddev; private: long Farbtiefe; long NumBackBuffers; D3DFORMAT BackBufferFormat; bool bFullScreen; HWND hwnd; }; #endif // D3D.cpp // // DirectX initialisieren // #include "D3D.h" CScenario * pScenario = new CScenario; CD3D::~CD3D () { delete (pScenario); } void CD3D::Init_D3D(HWND hwnd) { d3d = Direct3DCreate9 (D3D_SDK_VERSION); D3DDISPLAYMODE d3ddm; if (bFullScreen == FALSE) { d3d->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &d3ddm); } // Ein geeignetes Format für eine Fullscreen-Anwendung feststellen: if (Farbtiefe == 16) { if (SUCCEEDED (d3d->CheckDeviceType (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_R5G6B5, D3DFMT_R5G6B5, FALSE))) { BackBufferFormat = D3DFMT_R5G6B5; } else if (SUCCEEDED (d3d->CheckDeviceType (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X1R5G5B5, D3DFMT_X1R5G5B5, FALSE))) { BackBufferFormat = D3DFMT_X1R5G5B5; } else if (SUCCEEDED (d3d->CheckDeviceType (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X1R5G5B5, D3DFMT_A1R5G5B5, FALSE))) { BackBufferFormat = D3DFMT_A1R5G5B5; } } else if (Farbtiefe == 32) { if (SUCCEEDED (d3d->CheckDeviceType (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, FALSE))) { BackBufferFormat = D3DFMT_X8R8G8B8; } else if (SUCCEEDED (d3d->CheckDeviceType (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DFMT_A8R8G8B8, FALSE))) { BackBufferFormat = D3DFMT_A8R8G8B8; } } //Präsentationsparameter festlegen: // D3DPRESENT_PARAMETERS d3dpp; ZeroMemory (&d3dpp, sizeof (d3dpp)); d3dpp.Windowed = !bFullScreen; d3dpp.BackBufferCount = NumBackBuffers; // z-buffer anlgegen d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 16-Bit z-Buffer if (bFullScreen) { d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP; // Warten, bis der vertikale Elektronenstahl-Rücklauf des // Monitors beendet ist. Surface-Flipping erfolgt synchron // zum Aufbau des Minitorbilds. d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; d3dpp.hDeviceWindow = hwnd; d3dpp.BackBufferFormat = BackBufferFormat; d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight = WINDOW_HEIGHT; } else { d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = d3ddm.Format; BackBufferFormat = d3ddm.Format; } d3d->CreateDevice (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &d3ddev); // Render-States festlegen: // d3ddev->SetRenderState (D3DRS_CULLMODE, D3DCULL_CW); d3ddev->SetRenderState (D3DRS_DITHERENABLE, TRUE); d3ddev->SetRenderState (D3DRS_LIGHTING, TRUE); d3ddev->SetRenderState (D3DRS_ZENABLE, TRUE); return; } void CD3D::Show3DScenario() { d3ddev->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB (0, 0, 0), 1.0f, 0); d3ddev->Clear (0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB (0, 0, 0), 1.0f, 0); d3ddev->BeginScene (); pScenario->NewScene (); d3ddev->EndScene (); d3ddev->Present (NULL, NULL, NULL, NULL); return; } void CD3D::Clear_D3D() { d3d->Release (); d3ddev->Release (); return; } // D3DScenario.h // // Alles was gerendert wird, wird hier initialisiert und beendet // #ifndef D3DSCENARIO_HPP #define D3DSCENARIO_HPP #include "D3D.h" #include "Hilfsfunktionen.h" struct SVertex { D3DXVECTOR3 Position; DWORD Color; static const DWORD dwFVF; }; // Klasse erzeugen // class CScenario { public: CScenario (); ~CScenario (); void NewScene (); private: }; // Klasse erzeugen für das Sternenfeld // class CStarfield { public: void InitStarfield (); void RenderStarfield (); void ClearStarfield (); private: long AnzahlSterne; long HelpColorValue; LPDIRECT3DVERTEXBUFFER9 StarVertex; }; #endif // D3DScenario.cpp // // Alles was gerendert wird, wird hier initialisiert und beendet // #include "D3DScenario.h" const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; CStarfield * pStarfield = new CStarfield; CD3D * pD3D = new CD3D; CScenario::CScenario() { pStarfield = NULL; } void CScenario::NewScene () { pStarfield->InitStarfield (); pStarfield->RenderStarfield (); return; } CScenario::~CScenario () { pStarfield->ClearStarfield (); } void CStarfield::InitStarfield () { pD3D->d3ddev->CreateVertexBuffer (AnzahlSterne * sizeof (SVertex), D3DUSAGE_WRITEONLY, SVertex::dwFVF, D3DPOOL_MANAGED, &StarVertex, NULL); SVertex * pStarVertices; StarVertex->Lock (0, 0, (void**)&pStarVertices, D3DLOCK_NOSYSLOCK); for (long i = 0; i < AnzahlSterne; i++) { pStarVertices[i].Position = D3DXVECTOR3 (frnd (-3.0f, 3.0f), frnd (-2.5f, 2.5f), 5.0f); HelpColorValue = lrnd (50, 200); pStarVertices[i].Color = D3DCOLOR_XRGB (HelpColorValue, HelpColorValue, HelpColorValue); } StarVertex->Unlock (); return; } void CStarfield::RenderStarfield () { // RenderStates festlegen // pD3D->d3ddev->SetRenderState (D3DRS_LIGHTING, FALSE); pD3D->d3ddev->SetRenderState (D3DRS_ZENABLE, FALSE); pD3D->d3ddev->SetFVF (SVertex::dwFVF); pD3D->d3ddev->SetStreamSource (0, StarVertex, 0, sizeof (SVertex)); pD3D->d3ddev->DrawPrimitive (D3DPT_POINTLIST, 0, AnzahlSterne); // RenderStates festlegen // pD3D->d3ddev->SetRenderState (D3DRS_LIGHTING, TRUE); pD3D->d3ddev->SetRenderState (D3DRS_ZENABLE, TRUE); return; } void CStarfield::ClearStarfield () { StarVertex->Release (); return; }
Und hier die 4 Fehler die beim kompilieren herauskommen:
------ Erstellen gestartet: Projekt: erstes DirectX 9 Projekt, Konfiguration: Debug Win32 ------ Kompilieren... D3DScenario.cpp Verknüpfen... GameShell.obj : error LNK2005: "class CD3D * pD3D" (?pD3D@@3PAVCD3D@@A) ist bereits in D3DScenario.obj definiert. D3DScenario.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall CD3D::CD3D(void)" (??0CD3D@@QAE@XZ)" in Funktion ""void __cdecl `dynamic initializer for 'pD3D''(void)" (??__EpD3D@@YAXXZ)". GameShell.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: __thiscall CD3D::CD3D(void)" (??0CD3D@@QAE@XZ)". C:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\erstes DirectX 9 Projekt\Debug\erstes DirectX 9 Projekt.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise. Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\erstes DirectX 9 Projekt\erstes DirectX 9 Projekt\Debug\BuildLog.htm" gespeichert. erstes DirectX 9 Projekt - 4 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
Weiss jemand, warum diese Fehler entstehen?
Gruss Patrick
-
Ich habe das Gefühl das du hier etwas an Quelletxt unetrschlagen hast, der Angegebene Quelltext ist etwas lang, ich hab ihn mal angeschaut und hier muß was fehlen.
-
Xebov schrieb:
Ich habe das Gefühl das du hier etwas an Quelletxt unetrschlagen hast, der Angegebene Quelltext ist etwas lang, ich hab ihn mal angeschaut und hier muß was fehlen.
Jap. GameShell.h und GameShell.cpp wären besonders interessant anzusehen
-
Also hier ist GameShell.h und GameShell.cpp
// GameShell.h // // Das Grundgerüst, das Fenster // #ifndef GAMESHELL_HPP #define GAMESHELL_HPP #include <windows.h> #include "D3D.h" #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) CD3D * pD3D; #endif // GameShell.cpp // // Das Grundgerüst, das Fenster // #include "GameShell.h" LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { pD3D = new CD3D; MSG msg; HWND hwnd; WNDCLASSEX wc; ZeroMemory (&wc, sizeof (wc)); wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbSize = sizeof (WNDCLASSEX); wc.hInstance = hInstance; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbWndExtra = 0; wc.cbClsExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.lpszMenuName = NULL; wc.lpszClassName = "My Window"; wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION); if (!RegisterClassEx (&wc)) { MessageBox (NULL, "Fehler beim registrieren des Fensters", "Fehler aufgetreten", MB_OK | MB_ICONEXCLAMATION); return (0); } hwnd = CreateWindowEx (NULL, "My Window", "My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL); if (hwnd == NULL) { MessageBox (NULL, "Fehler beim kreieren des Fensters", "Fehler aufgetreten", MB_OK | MB_ICONEXCLAMATION); return (0); } pD3D->Init_D3D (hwnd); // Nachrichtenschleife // while (TRUE) { if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { break; } TranslateMessage (&msg); DispatchMessage (&msg); } pD3D->Show3DScenario (); // Wurde die Escape-Taste gedrückt? Wenn ja, dann wird das Programm beendet. // if (KEY_DOWN (VK_ESCAPE)) { PostMessage (hwnd, WM_DESTROY, 0, 0); } } pD3D->Clear_D3D (); return (msg.wParam); } LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; switch (msg) { case WM_CREATE: { return (0); } break; case WM_PAINT: { hdc = BeginPaint (hwnd, &ps); EndPaint (hwnd, &ps); return (0); } break; case WM_DESTROY: { PostQuitMessage (0); return (0); } break; default: { } break; } return (DefWindowProc (hwnd, msg, wParam, lParam)); }
-
Da sind einige Fehler in dem Quelltext drin.
Memoryleaks:
//GameShell.cpp pD3D = new CD3D; //D3DScenario.cpp CStarfield * pStarfield = new CStarfield; CD3D * pD3D = new CD3D;
Das wird alles nicht freigegeben.
Das hier:
//D3D.cpp CScenario * pScenario = new CScenario; CD3D::~CD3D () { delete (pScenario); }
sieht ziemlich fehlerträchtig aus, CD3D ist kein Singleton damit sind multible aufrufe des destruktors vorprogrammiert, vor allem da du in 2 Headern ne globale Variable hast die auf diese Klasse läuft wirds hier noch gut knallen wenn der Code mal läuft, da der zeiger nach dem löschen nicht NULL ist sodnern immernoch auf den alten Bereich zeigt.
Dein Zugriff auf CD3D hat auch einige Fehler.
//D3DScenario.cpp CD3D * pD3D = new CD3D; pD3D->d3ddev->SetFVF (SVertex::dwFVF); //GameShell.cpp pD3D = new CD3D; pD3D->Init_D3D (hwnd);
Hier würde auch nix gehen, der Grund beide cpp Dateien haben global eine Variable vom Typ CD3D, das Problem jeder hat seine eigene. in GameShell initalisierst du darauf direct3D, aber in D3DScenario willste damit arbeiten nur in seienr Instanz gibt es kein initalisiertes Direct3D. Informiere dich hier mal bitte über Singleton Klassen und das Schlüsselwort extern, die könen hier viel bewirken, vor allem die Singleton Klasse die ist nämlich für Verwaltungsklassen die man nur einmal braucht wie geschaffen.
Das includieren ind en headern finde ich unschön, ich würde dir raten hie reinen "Sammel-Header" anzulegen, der alle header Includiert die dein projekt hat und dann zentral eingebunden wird, macht die fehlersuche leichter und erspart einem das durcheinander die Pfade zu verfolgen, hab ich bei meinem Projekt auch gemacht.
Was deine 3 Fehler angeht die du gepostet hast, für die musste ich eben auch gut rumsuchen, hoffe ich liege soweit richtig bin mir bei Nr1 nicht ganz sicher.
Fehler Nr1:
Bin ich mir unsicher er liegt wohl daran das du CD3D *pD3D einmal in D3DSzenario.cpp und einmal in GameShell.h Deffinierst. Man sollte keine globalen Variablen in header deffinieren.Fehler Nr2 & Nr3:
D3D.h - Deklariert einen Konstruktor
D3D.cpp - hier solte der Konstruktor Deffiniert/Implemetiert sein, er is aber schlicht nicht da.Du musst ganz schön reparieren, selbst wenn du die Fehler alle 3 Löst wird es trotzdem nicht funktionieren.
Dinge die du dir unbedingt anschaun soltest:
extern
Singleton Klassen
Und etwas mehr übersicht bei den header Includes würde dem ganzen sicher nicht Schaden.
-
Ich hab jetzt zwar nicht alles gelesen, doch ich hatte auch ab und an diesen Fehler und nur selten war das ein Fehler im Quellcode.
Manchmal hat es gereicht einfach die Projektmappe unter "Erstellen" zu bereinigen bzw neu zu erstellen, sodass alte Dateien die sowas enthalten könnten gelöscht werden. Soll heißen, manchmal treten einfach Konflikte mit alten Dateien auf.
Unter anderem hat das schon ab und an dazu geführt, dass selbst nach einer neuen Compilierung sachem im Programm erschienen (z.B. Text), die im Quellcode gar nicht mehr vorhanden waren.
-
Ich habe nun diese Fehler verbessert, doch nun kommt noch einen Fehler, denn ich noch nie gesehen habe.
Hier ist nochmals der Code:
// D3D.h // // DirectX initialisieren // #ifndef D3D_HPP #define D3D_HPP #include <d3d9.h> #include <d3dx9.h> #include "D3DVariablen.h" #include "D3DScenario.h" #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 // Klasse erzeugen // class CD3D { public: ~CD3D (); void Init_D3D (HWND hwnd); void Show3DScenario (void); void Clear_D3D (void); private: long Farbtiefe; long NumBackBuffers; D3DFORMAT BackBufferFormat; bool bFullScreen; HWND hwnd; }; #endif // D3D.cpp // // DirectX initialisieren // #include "D3D.h" CScenario * pScenario = new CScenario; CD3D::~CD3D () { if (pScenario) { delete (pScenario); pScenario = NULL; } } void CD3D::Init_D3D(HWND hwnd) { g_pD3D->d3d = Direct3DCreate9 (D3D_SDK_VERSION); D3DDISPLAYMODE d3ddm; if (bFullScreen == FALSE) { g_pD3D->d3d->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &d3ddm); } // Ein geeignetes Format für eine Fullscreen-Anwendung feststellen: if (Farbtiefe == 16) { if (SUCCEEDED (g_pD3D->d3d->CheckDeviceType (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_R5G6B5, D3DFMT_R5G6B5, FALSE))) { BackBufferFormat = D3DFMT_R5G6B5; } else if (SUCCEEDED (g_pD3D->d3d->CheckDeviceType (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X1R5G5B5, D3DFMT_X1R5G5B5, FALSE))) { BackBufferFormat = D3DFMT_X1R5G5B5; } else if (SUCCEEDED (g_pD3D->d3d->CheckDeviceType (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X1R5G5B5, D3DFMT_A1R5G5B5, FALSE))) { BackBufferFormat = D3DFMT_A1R5G5B5; } } else if (Farbtiefe == 32) { if (SUCCEEDED (g_pD3D->d3d->CheckDeviceType (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DFMT_X8R8G8B8, FALSE))) { BackBufferFormat = D3DFMT_X8R8G8B8; } else if (SUCCEEDED (g_pD3D->d3d->CheckDeviceType (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DFMT_A8R8G8B8, FALSE))) { BackBufferFormat = D3DFMT_A8R8G8B8; } } //Präsentationsparameter festlegen: // D3DPRESENT_PARAMETERS d3dpp; ZeroMemory (&d3dpp, sizeof (d3dpp)); d3dpp.Windowed = !bFullScreen; d3dpp.BackBufferCount = NumBackBuffers; // z-buffer anlgegen d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // 16-Bit z-Buffer if (bFullScreen) { d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP; // Warten, bis der vertikale Elektronenstahl-Rücklauf des // Monitors beendet ist. Surface-Flipping erfolgt synchron // zum Aufbau des Minitorbilds. d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; d3dpp.hDeviceWindow = hwnd; d3dpp.BackBufferFormat = BackBufferFormat; d3dpp.BackBufferWidth = WINDOW_WIDTH; d3dpp.BackBufferHeight = WINDOW_HEIGHT; } else { d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = d3ddm.Format; BackBufferFormat = d3ddm.Format; } g_pD3D->d3d->CreateDevice (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pD3D->d3ddev); // Render-States festlegen: // g_pD3D->d3ddev->SetRenderState (D3DRS_CULLMODE, D3DCULL_CW); g_pD3D->d3ddev->SetRenderState (D3DRS_DITHERENABLE, TRUE); g_pD3D->d3ddev->SetRenderState (D3DRS_LIGHTING, TRUE); g_pD3D->d3ddev->SetRenderState (D3DRS_ZENABLE, TRUE); return; } void CD3D::Show3DScenario() { g_pD3D->d3ddev->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB (0, 0, 0), 1.0f, 0); g_pD3D->d3ddev->Clear (0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB (0, 0, 0), 1.0f, 0); g_pD3D->d3ddev->BeginScene (); pScenario->NewScene (); g_pD3D->d3ddev->EndScene (); g_pD3D->d3ddev->Present (NULL, NULL, NULL, NULL); return; } // D3DScenario.h // // Alles was gerendert wird, wird hier initialisiert und beendet // #ifndef D3DSCENARIO_HPP #define D3DSCENARIO_HPP #include "D3D.h" #include "Hilfsfunktionen.h" struct SVertex { D3DXVECTOR3 Position; DWORD Color; static const DWORD dwFVF; }; // Klasse erzeugen // class CScenario { public: CScenario (); ~CScenario (); void NewScene (); private: }; // Klasse erzeugen für das Sternenfeld // class CStarfield { public: void InitStarfield (); void RenderStarfield (); void ClearStarfield (); private: long AnzahlSterne; long HelpColorValue; LPDIRECT3DVERTEXBUFFER9 StarVertex; }; #endif // D3DScenario.cpp // // Alles was gerendert wird, wird hier initialisiert und beendet // #include "D3DScenario.h" const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; CStarfield * pStarfield = new CStarfield; CScenario::CScenario() { pStarfield = NULL; } void CScenario::NewScene () { pStarfield->InitStarfield (); pStarfield->RenderStarfield (); return; } CScenario::~CScenario () { pStarfield->ClearStarfield (); } void CStarfield::InitStarfield () { g_pD3D->d3ddev->CreateVertexBuffer (AnzahlSterne * sizeof (SVertex), D3DUSAGE_WRITEONLY, SVertex::dwFVF, D3DPOOL_MANAGED, &StarVertex, NULL); SVertex * pStarVertices; StarVertex->Lock (0, 0, (void**)&pStarVertices, D3DLOCK_NOSYSLOCK); for (long i = 0; i < AnzahlSterne; i++) { pStarVertices[i].Position = D3DXVECTOR3 (frnd (-3.0f, 3.0f), frnd (-2.5f, 2.5f), 5.0f); HelpColorValue = lrnd (50, 200); pStarVertices[i].Color = D3DCOLOR_XRGB (HelpColorValue, HelpColorValue, HelpColorValue); } StarVertex->Unlock (); return; } void CStarfield::RenderStarfield () { // RenderStates festlegen // g_pD3D->d3ddev->SetRenderState (D3DRS_LIGHTING, FALSE); g_pD3D->d3ddev->SetRenderState (D3DRS_ZENABLE, FALSE); g_pD3D->d3ddev->SetFVF (SVertex::dwFVF); g_pD3D->d3ddev->SetStreamSource (0, StarVertex, 0, sizeof (SVertex)); g_pD3D->d3ddev->DrawPrimitive (D3DPT_POINTLIST, 0, AnzahlSterne); // RenderStates festlegen // g_pD3D->d3ddev->SetRenderState (D3DRS_LIGHTING, TRUE); g_pD3D->d3ddev->SetRenderState (D3DRS_ZENABLE, TRUE); return; } void CStarfield::ClearStarfield () { StarVertex->Release (); return; } // GameShell.h // // Das Grundgerüst, das Fenster // #ifndef GAMESHELL_HPP #define GAMESHELL_HPP #include <windows.h> #include "D3D.h" #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) CD3D * pD3D; #endif // GameShell.cpp // // Das Grundgerüst, das Fenster // #include "GameShell.h" LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { pD3D = new CD3D; MSG msg; HWND hwnd; WNDCLASSEX wc; ZeroMemory (&wc, sizeof (wc)); wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbSize = sizeof (WNDCLASSEX); wc.hInstance = hInstance; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbWndExtra = 0; wc.cbClsExtra = 0; wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.lpszMenuName = NULL; wc.lpszClassName = "My Window"; wc.hIconSm = LoadIcon (NULL, IDI_APPLICATION); if (!RegisterClassEx (&wc)) { MessageBox (NULL, "Fehler beim registrieren des Fensters", "Fehler aufgetreten", MB_OK | MB_ICONEXCLAMATION); return (0); } hwnd = CreateWindowEx (NULL, "My Window", "My Window", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL); if (hwnd == NULL) { MessageBox (NULL, "Fehler beim kreieren des Fensters", "Fehler aufgetreten", MB_OK | MB_ICONEXCLAMATION); return (0); } pD3D->Init_D3D (hwnd); // Nachrichtenschleife // while (TRUE) { if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { break; } TranslateMessage (&msg); DispatchMessage (&msg); } pD3D->Show3DScenario (); // Wurde die Escape-Taste gedrückt? Wenn ja, dann wird das Programm beendet. // if (KEY_DOWN (VK_ESCAPE)) { PostMessage (hwnd, WM_DESTROY, 0, 0); } } g_pD3D->Clear_D3D (); return (msg.wParam); } LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; switch (msg) { case WM_CREATE: { return (0); } break; case WM_PAINT: { hdc = BeginPaint (hwnd, &ps); EndPaint (hwnd, &ps); return (0); } break; case WM_DESTROY: { PostQuitMessage (0); return (0); } break; default: { } break; } return (DefWindowProc (hwnd, msg, wParam, lParam)); } #ifndef TSINGLETON #define TSINGLETON template <class T> class TSingleton { protected: // Membervariablen static T * m_pSingleton; // Statisches Objekt public: // Membervariablen // Destruktor // virtual ~TSingleton () { } // Get // // Aufgabe: Wenn nötig, statisches Objekt erzeugen und // Zeiger darauf zurückgeben // inline static T * Get () { // Existiert schon eine Instanz? if (!m_pSingleton) { m_pSingleton = new T; // Nein, dann neue Instanz erzeugen } // Zeiger auf die Instanz zurückgeben return (m_pSingleton); } // Get // Statisches Objekt freigeben // static void Del () { // Gab es eine Instanz? if (m_pSingleton) { delete (m_pSingleton); // Ja, dann freigeben m_pSingleton = NULL; // und Zeiger auf NULL setzen } } // Del }; // Die statische Variable erzeugen // template <class T> T * TSingleton<T>::m_pSingleton = 0; #endif
Und hier der Fehler:
------ Erstellen gestartet: Projekt: erstes DirectX 9 Projekt, Konfiguration: Debug Win32 ------ Kompilieren... D3D.cpp Verknüpfen... Das Manifest wird eingebettet... mt.exe : general error c101008a: Failed to save the updated manifest to the file ".\Debug\erstes DirectX 9 Projekt.exe.embed.manifest". Falscher Parameter. Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\patrick\Eigene Dateien\Visual Studio 2008\Projects\erstes DirectX 9 Projekt\erstes DirectX 9 Projekt\Debug\BuildLog.htm" gespeichert. erstes DirectX 9 Projekt - 1 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
Weiss jemand was ich nun falsch gemacht habe?
Gruss Patrick
-
Das sieht eher aus als wär das ein anderer Fehler. Mach einfach mal projekt bereinigen und lass alles neu Compilen.
Und noch ein paar Worte zu deienr Singleton Template Klasse. Die erfüllt das Singleton Konzept nicht.
So hier sieht eine Singleton Klasse aus:
class Singleton { private: Konstruktor; Copykonstruktor; Operator= public: Destruktor; static GetInstance; };
Konstruktor, Copykonstruktor und = müssen privat sein damit von außerhalb wirklich keine Instanz erstellt werden kann.
Bei der Implementierung von GetInstance scheiden sich die Geister, ich bevorzuge das hier:
static Singleton& GetInstance() { static Singleton TheOne; return TheOne; };
Zu dem thema gibts im C++ Forum einiges, da sind auch andere varianten aufgeführt.
Ein Template würde ich dir nicht Empfehlen, weil du damit nicht sicherstellen kannst das wirklich nur eine Instanzd er Zielklasse da ist und weild er Zugriff Umständlich ist.