Problem beim Kompilieren der Beispiele des Buches 3d-Spieleprogrammierung



  • Hier der Code
    (Den Code habe ich von der CD kopiert und eingefügt, sollte also klappen...)

    #include <Windows.h>
    #include <TriBase.h>
    #include <D3D9.h>
    #include "..//..//Allgemeines//Direct3DEnum.h"
    #include "..//..//Allgemeines//InitWindow.h"
    #include "..//..//Allgemeines//InitDirect3D.h"
    #include "Resource.h"
    
    struct SVertex
    {
    	tbVector3			vPosition;	// Position des Vertex
    	DWORD				dwColor;	// Farbe des Vertex
    	static const DWORD	dwFVF;		// Vertexformat (statisch)
    };
    
    const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;
    
    // ******************************************************************5
    // Globale Variablen
    SDirect3DParameters	g_Direct3DParameters;	// Direct3D-Parameter
    float				g_fTime = 0.0f;			// Zeitzähler
    SVertex				g_aTriangleVertex[3];	// Die drei Vertizes des Dreiecks
    
    // ******************************************************************
    // Render-Funktion
    tbResult Render(float fNumSecsPassed)
    {
    	HRESULT		hResult;
    	tbMatrix	mRotation;		// Rotationsmatrix
    	tbMatrix	mTranslation;	// Translationsmatrix
    	tbMatrix	mWorld;			// Vereinende Weltmatrix
    
    	// Rotations- und Translationsmatrix des Dreiecks erzeugen
    	mRotation = tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 90.0f));
    	mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f));
    
    	// Beide Matrizen kombinieren und als Weltmatrix einsetzen
    	mWorld = mRotation * mTranslation;
    	g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));
    
    	// -------------------------------------------------------------
    
    	// Den Bildpuffer und den Z-Buffer leeren
    	if(FAILED(hResult = g_pD3DDevice->Clear(0,
    											NULL,
    											D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
    											D3DCOLOR_XRGB(0, 0, 63),
    											1.0f,
    											0)))
    	{
    		// Fehler beim Leeren!
    		MessageBoxA(g_hWindow, "Fehler beim Leeren der Puffer!",
    			       "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    	}
    
    	// Szene beginnen
    	g_pD3DDevice->BeginScene();
    
    	// Nun das Dreieck zeichnen
    	if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,	// Dreiecksliste
    											          1,					// 1 Dreieck
    													  g_aTriangleVertex,	// Vertexdaten
    													  sizeof(SVertex))))	// Vertexgröße
    	{
    		// Fehler beim Zeichnen!
    		MessageBoxA(g_hWindow, "Fehler beim Zeichnen des Dreiecks!",
    			       "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult, TB_STOP);
    	}
    
    	// Szene beenden
    	g_pD3DDevice->EndScene();
    
    	// Der große Moment: den Bildpuffer sichtbar machen
    	g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
    
    	return TB_OK;
    }
    
    // ******************************************************************
    // Move-Funktion
    tbResult Move(float fNumSecsPassed)
    {
    	// Zeitzähler erhöhen
    	g_fTime += fNumSecsPassed;
    
    	return TB_OK;
    }
    
    // ******************************************************************
    // Herunterfahren der Szene
    tbResult ExitScene()
    {
    	return TB_OK;
    }
    
    // ******************************************************************
    // Herunterfahren der Anwendung
    tbResult ExitApplication()
    {
    	// Szene herunterfahren
    	ExitScene();
    
    	// Direct3D und Fenster herunterfahren
    	ExitDirect3D();
    	ExitWindow();
    
    	// Engine herunterfahren
    	tbExit();
    
    	return TB_OK;
    }
    
    // ******************************************************************
    // Initialisieren der Szene
    tbResult InitScene()
    {
    	HRESULT		hResult;
    	tbMatrix	mProjection;
    	float		fAspect;
    
    	// Vertexformat setzen - Positions- und Farbangabe
    	if(FAILED(hResult = g_pD3DDevice->SetFVF(SVertex::dwFVF)))
    	{
    		// Fehler beim Setzen des Vertexformats!
    		TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR);
    	}
    
        // Beleuchtung und Culling ausschalten, Dithering aktivieren
    	g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    	g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    	g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);
    
    	// Das Bildseitenverhältnis berechnen
    	fAspect =   (float)(g_Direct3DParameters.VideoMode.Width)
    	          / (float)(g_Direct3DParameters.VideoMode.Height);
    
    	// Die Projektionsmatrix erzeugen
    	mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f),	// Sichtfeld: 90° (180°)
    					                 fAspect,				// Bildseitenverhältnis
    					                 0.1f,					// Nahe Clipping-Ebene
    					                 100.0f);				// Ferne Clipping-Ebene
    
    	// Projektionsmatrix einsetzen
    	g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));
    
    	// Initialisieren des Dreiecks
    	g_aTriangleVertex[0].vPosition	= tbVector3( 0.0f,  1.0f, 0.0f);
    	g_aTriangleVertex[1].vPosition	= tbVector3( 1.0f, -1.0f, 0.0f);
    	g_aTriangleVertex[2].vPosition	= tbVector3(-1.0f, -1.0f, 0.0f);
    	g_aTriangleVertex[0].dwColor	= tbColor(1.0f, 0.0f, 0.0f);
    	g_aTriangleVertex[1].dwColor	= tbColor(0.0f, 1.0f, 0.0f);
    	g_aTriangleVertex[2].dwColor	= tbColor(0.0f, 0.0f, 1.0f);
    
    	return TB_OK;
    }
    
    // ******************************************************************
    // Initialisierungsfunktion
    tbResult InitApplication()
    {
    	tbResult Result;
    
    	// TriBase-Engine initialisieren
    	tbInit();
    
    	// Direct3D-Optionen abfragen (vom Benutzer gewählt)
    	Result = GetDirect3DParameters(&g_Direct3DParameters);
    	if(Result == TB_ERROR)
    	{
    		// Es trat ein Fehler auf!
    		MessageBoxA(NULL, "Fehler beim Abzählen!", "Fehler",
    			       MB_OK | MB_ICONEXCLAMATION);
    		return TB_ERROR;
    	}
    	else if(Result == TB_CANCELED)
    	{
    		// Der Dialog wurde abgebrochen!
    		return TB_CANCELED;
    	}
    
    	// Fenster initialisieren. Die Größe hängt vom gewählten
    	// Videomodus ab, der in der Parameterstruktur gespeichert ist.
    	if(InitWindow(g_Direct3DParameters.VideoMode.Width,
    		          g_Direct3DParameters.VideoMode.Height,
    				  "Beispielprogramm Nr. 3: Das erste Dreieck",
    				  LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1))))
    	{
    		// Fehler beim Erstellen des Fensters!
    		MessageBoxA(NULL, "Fehler beim Erstellen des Fensters!",
    			       "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		return TB_ERROR;
    	}
    
    	// Direct3D mit den abgefragten Einstellungen initialisieren
    	if(InitDirect3D(&g_Direct3DParameters,
    		            g_hWindow))
    	{
    		// Fehler!
    		MessageBoxA(g_hWindow, "Fehler beim Initialisieren von Direct3D!",
    			       "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		ExitApplication();
    		return TB_ERROR;
    	}
    
    	// Szene initialisieren
    	if(InitScene())
    	{
    		// Fehler!
    		MessageBoxA(g_hWindow, "Fehler beim Initialisieren der Szene!",
    			       "Fehler", MB_OK | MB_ICONINFORMATION);
    		ExitApplication();
    		return TB_ERROR;
    	}
    
    	// Alles OK!
    	return TB_OK;
    }
    
    // ******************************************************************
    // Windows-Hauptfunktion
    int WINAPI WinMain(HINSTANCE hInstance,
    				   HINSTANCE hPrevInstance,
    				   char* pcCmdLine,
    				   int iShowCmd)
    {
    	tbResult Result;
    
    	// Initialisierung
    	Result = InitApplication();
    	if(Result == TB_CANCELED) return 0;
    	else if(Result)
    	{
    		MessageBoxA(NULL, "Fehler beim Initialisieren der Anwendung!",
    			       "Fehler", MB_OK | MB_ICONEXCLAMATION);
    		return 1;
    	}
    
    	// Nachrichtenschleife
    	tbDoMessageLoop(Render, Move);
    
    	// Herunterfahren
    	ExitApplication();
    
    	return 0;
    }
    
    // ******************************************************************
    


  • In Zeile 234 cancelt der immer bei mir, und wenn ich diese Zeile weglasse, kommen die Fehler



  • Ps: Der Fehler kommt in Zeile
    40 vor, also bei

    g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));
    

    (ist doch nur ein Fehler)



  • Vielleicht wurde für g_pD3DDevice kein Speicher reserviert, weil im Auto sagt er bei g_pD3DDevice

    g_pD3DDevice 0x0000000000
    ->IUnknow {...}
    ->_vfprt CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden



  • Ich hab den Fehler jetzt etwas lokalisisiert:
    Bei der Funktion InitApplication gibt er mit TB_CANCELED zurück (in zeile 171 Result = GetDirect3DParameters(&g_Direct3DParameters);)
    Das komische ist, darüber steht was von

    // Direct3D-Optionen abfragen (vom Benutzer gewählt)
    bei mir kommt aber nicht so ein Abfragungsfenster o.O



  • Wow, 21500 Ergebnisse, wenn man bei Google "kompelieren" eingibt (liest man hier ja auch öfter mal). Bald steht's im Duden. 😃



  • na gut dann eben "kompilieren" 🙂

    (so, berichtigt)



  • Weiß keiner, was das Problem ist? 😞



  • Kannst du denn die Fertigen Projekte aus dem Buch kompilieren?



  • Die sind schon kompiliert, ich kann die .exe ausführen, da kommen keine Fehler.
    Wenn ich die Projekte kompilieren will, kommt eine Message Box, die mir sagt, dass das Programm nicht starten kann, da die Datei "\Projects\03 - Das erste Dreieck\Debug\Dreieck.exe" nicht gefunden werden kann.



  • Die Tuer schrieb:

    Die sind schon kompiliert, ich kann die .exe ausführen, da kommen keine Fehler.
    Wenn ich die Projekte kompilieren will, kommt eine Message Box, die mir sagt, dass das Programm nicht starten kann, da die Datei "\Projects\03 - Das erste Dreieck\Debug\Dreieck.exe" nicht gefunden werden kann.

    Wofür braucht man denn die .exe für das Kompilieren? Bei mir funktioniert das alles problemlos: einfach den Ordner "03 - Das erste Dreieck" auf die Festplatte ziehen, dann die Pfade für die Include-Dateien anpassen (Die Include-Dateien "Allgemeines.h", "InitDirect3D.h" und "InitWindow.h") und dann sollte das Erstellen klappen. Oder wie erstellst du das Projekt?



  • Ich habe alle Pfade dem Programm hinzugefügt, aber wenn ich auf den Debug-Butten oder auf F5 drücke, sagt er immer, dass er die Debug\Dreieck.exe ausführen will.
    Wenn ich das selbe im Release-Modus mache, kommt das gleiche, nur dann eben mir Release\Dreieck.exe. Ich verstehe auch nicht, warum er nicht kompelieren will, sondern die .exe Dateien starten will 😕



  • Du kannst im Projektmappen-Explorer (linke Seite) mit der rechten Maustaste auf das Projekt klicken und dann "Neu Erstellen" auswählen. Hinterher müsstest du die .exe manuell ausführen. Wo die .exe gespeichert wird, kann man glaube ich auch festlegen.



  • Ich habs jetzt probiert, jetzt kommt aber ein Fehler, dass afxres.h fehlt.
    Was ist das für eine Datei und woher bekomm ich die ?



  • Ich hatte aus Versehen in meinem vorherigem Projekt afxres.h vergessen 🙄



  • Hat denn keiner eine Ahnung, wofür afxres.h ist und woher ich die bekomme ? 😞



  • Die Tuer schrieb:

    Hat denn keiner eine Ahnung, wofür afxres.h ist und woher ich die bekomme ? 😞

    Nein, aber in den Projekten aus dem Buch (Das Buch hab ich auch) ist mir noch nie eine "afxres.h" untergekommen.



  • Bei Google nach afxres.h gesucht und der 2. Beitrag war ein Treffer...
    Du brauchst die Vorgängerversion vom Platform SDK, dann sollte es klappen. Hier nochmal der Link dazu:
    http://www.spieleprogrammierer.de/index.php?page=Thread&postID=172093

    mkG Nas



  • afxres.h hat was mit MFC zu tun und mit der Tatsache dass das Tribase Projekt vor laaanger Zeit mit einer anderen Version von Visual Studio gemacht wurde und daher eben nicht einfach out of the box mit aktuellen Visual Studio Versionen läuft (dass es mal sowas wie eine Express Edition geben würde hat damals noch nichtmal Microsoft gewusst).
    Anyway, die Probleme die du hier hattest und hast sind nicht neu und wurden im Forum zum Buch schon sicherlicher über 100 Mal diskutiert, schau einfach mal dort vorbei, was diese Dinge angeht kann dir dort sicher eher geholfen werden: http://www.spieleprogrammierer.de/index.php?page=Thread&postID=177646#post177646



  • Jetzt kommt noch eine andere Fehlermeldung 🙄
    Und zwar diese hier:

    1>LINK : fatal error LNK1000: Internal error during IncrBuildImage
    

    Ich habe schon versucht, den fix zu installieren, hat aber nicht geklappt, da der Installer sagt, dass ich nicht richtige Version habe, obwohl das für VS2008 gemacht ist.

    ps: ich habe VS2008 Express


Anmelden zum Antworten