Genesis3d Problem mit BCB! BITTE HELFT MIR :((
-
Hi erstmal,
ich hab mir jetzt das Buch "Spieleprogrammierung mit C++ und Genesis3d" angeschafft. Aber ich habe folgendes Problem: Nachdem ich das Programm korrekt kompiliert wurde, starte ich das Programm und sehe das Genesis3d Logo! Nur leider passiert jetzt auch nix mehr! Nicht mal mit Escape kann ich das Programm wieder beenden!
Kann mir bitte jemand sagen, was da falsch ist?
Hier der komplette Code:
Headerdatei://--------------------------------------------------- // Game1.h : // Header mit Klassendeklaration von TGame //--------------------------------------------------- // #define _BCB // nur für Borland C++Builder #include <windows.h> #include "include\genesis.h" class TGame { public: // Eigenschaften geEngine *Engine; // 3D-Engine geWorld *World; // World/Level geCamera *Camera; // Kamera/Betrachter geDriver *Driver; // Grafiktreiber geDriver_Mode *DMode; // Grafikmodus geXForm3d XForm; // Welt-Matrix bool isRunning; // Spielmodus an/aus // Methoden void CreateGame (void); void RunGame (void); void FreeGame (void); void SetDriver (void); void ExitError (char *Txt); } ; // Pfad- und Dateinamen const char *Pfad = ".\\levels\\"; const char *BSP_Datei = "World0.bsp"; const char *GVersion = "GPlay1"; // Globale Konstanten const int MaxWidth = 640; // Max. Screenbreite const int MaxHeight = 480; // Max. Screenhöhe // Globalvariable HWND GHandle; // Handle des "Spielfensters"Rest:
//--------------------------------------------------- // Game1.cpp : // Nur Anzeige von BSP-Welt (ohne Bewegungen) //--------------------------------------------------- #include "Game1.h" // Spielobjekt TGame Game; // Vorwärtsdeklaration (für Fensterereignisse) LRESULT CALLBACK WndProc (HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam); // Windows-Hauptfunktion mit Game-Schleife int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // Fensterklasse initialisieren WNDCLASS Win; // Objekt der Fensterklasse MSG msg; // Aktuelle Meldung // Extrabytes für Klassen/Fensterinstanz Win.cbClsExtra = 0; Win.cbWndExtra = 0; // Instanz der Fensterklasse Win.hInstance = hInstance; // Symbol und Cursor der Fensterklasse Win.hIcon = LoadIcon(hInstance, IDI_APPLICATION); Win.hCursor = LoadCursor(NULL, IDC_ARROW); // Hintergrundfarbe (schwarz) und Fensterstil Win.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); Win.style = CS_HREDRAW | CS_VREDRAW; // Verknüpfung mit Ereignis-Routine Win.lpfnWndProc = WndProc; // Name der Fensterklasse Win.lpszClassName = GVersion; Win.lpszMenuName = NULL; // kein Menü // Registrierung der Fensterklasse RegisterClass (&Win); // Fenster erzeugen GHandle = CreateWindow (Win.lpszClassName, "Genesis3D - [Esc]=Ende", WS_TILED, CW_USEDEFAULT, CW_USEDEFAULT, MaxWidth, MaxHeight, NULL, NULL, hInstance, NULL); if (!GHandle) { return 0; // nicht ok } // Mauszeiger verbergen ShowCursor (false); // Fenster zeigen und "auffrischen" ShowWindow (GHandle, nCmdShow); UpdateWindow (GHandle); // Spielinitialisierung Game.CreateGame (); // Spielmodus auf "Laufen" einstellen Game.isRunning = true; // Solange Spiel "läuft" while (Game.isRunning) { // evtl. Fenstereignisse abfragen while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) { // Spielverlauf Game.RunGame (); if (!GetMessage(&msg, NULL, 0, 0)) { Game.isRunning = false; break; } // Ereignisdaten auswerten (lassen) TranslateMessage (&msg); DispatchMessage (&msg); } } // Programm-/Spielende Game.FreeGame (); return 1; // ok } // Verarbeitung der Fensterereignisse LRESULT CALLBACK WndProc (HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { // Ereignis auswerten switch (iMessage) { case WM_KEYDOWN: { switch (wParam) { case VK_ESCAPE: // Spielende mit [Esc]-Taste { PostMessage(hWnd, WM_QUIT, 0, 0); } } } // ansonsten Ereignis an "Default-Handler" default: return DefWindowProc (hWnd, iMessage, wParam, lParam); } return 0; } //--------------------------------------------------- // Spiel initialisieren/"aufbauen" void TGame::CreateGame (void) { geRect WorldScreen; // Anzeigefläche char WorldName[64]; // Name der Welt/Level geVFile *WorldFile; // BSP-Datei (Welt/Level) // 3D-Engine initialisieren Engine = geEngine_Create (GHandle, GVersion, "."); if (!Engine) ExitError ("3D-Engine kann nicht gestartet werden!"); // Anzeigedaten für Engine ausschalten geEngine_EnableFrameRateCounter(Engine, GE_FALSE); // Treiber auswählen SetDriver (); // Anzeigefläche festlegen WorldScreen.Left = 0; WorldScreen.Right = MaxWidth - 1; WorldScreen.Top = 0; WorldScreen.Bottom = MaxHeight - 1; // Koordinaten-Matrix setzen geXForm3d_SetIdentity (&XForm); // Kamera initialisieren Camera = geCamera_Create (2.0, &WorldScreen); if (!Camera) ExitError ("Kamera kann nicht installiert werden!"); // BSP-Datei laden strcpy (WorldName, Pfad); strcat (WorldName, BSP_Datei); WorldFile = geVFile_OpenNewSystem (NULL, GE_VFILE_TYPE_DOS, WorldName, NULL, GE_VFILE_OPEN_READONLY); // Wenn Datei ok, Welt/Level erzeugen if (WorldFile) { World = geWorld_Create(WorldFile); geVFile_Close(WorldFile); }; if (!World) ExitError ("Welt/Level lässt sich nicht erzeugen!"); // Welt/Level mit 3D-Engine verknüpfen if (!geEngine_AddWorld(Engine, World)) ExitError ("Welt/Level lässt sich nicht einbinden!"); } //--------------------------------------------------- // Spiel "in Szene setzen" void TGame::RunGame (void) { // Koordinaten und Winkel ausrichten geXForm3d_SetIdentity (&XForm); geXForm3d_RotateX (&XForm, 0.0); geXForm3d_RotateY (&XForm, 0.0); geXForm3d_RotateZ (&XForm, 0.0); geXForm3d_Translate (&XForm, 0.0, 0.0, 0.0); geCamera_SetWorldSpaceXForm (Camera, &XForm); // Rendering starten if (!geEngine_BeginFrame(Engine, Camera, GE_TRUE)) ExitError ("BeginFrame gescheitert!"); // Welt/Level rendern und darstellen if (!geEngine_RenderWorld (Engine, World, Camera, 0.0)) ExitError ("Rendering gescheitert!"); // Rendering beenden if (!geEngine_EndFrame(Engine)) ExitError ("EndFrame gescheitert!"); } //--------------------------------------------------- // Spiel "abbauen" void TGame::FreeGame (void) { // Kamera, Welt und Engine freigeben if (Camera) geCamera_Destroy (&Camera); if (World) geWorld_Free (World); if (Engine) { geEngine_ShutdownDriver(Engine); geEngine_Free (Engine); } // Zeiger "nullen" Camera = NULL; World = NULL; Engine = NULL; } //-------------------------------------------------- // Grafiktreiber/modus wählen/setzen void TGame::SetDriver (void) { geDriver_System *DriverSystem; long Breite, Hoehe; // Treibersystem "einbetten" DriverSystem = geEngine_GetDriverSystem (Engine); if (!DriverSystem) ExitError ("Kein Treibersystem gefunden!"); // DirectX-Grafiktreiber aufnehmen Driver = geDriver_SystemGetNextDriver (DriverSystem, NULL); if (!Driver) ExitError ("Treiber nicht gefunden!"); // Suchschleife für Grafikmodus DMode = geDriver_GetNextMode (Driver, NULL); // Liste nach passendem Modus durchsuchen while(true) { if (!DMode) ExitError ("Falscher Treibermodus!"); // Auflösungswerte ermitteln bb geDriver_ModeGetWidthHeight (DMode, &Breite, &Hoehe); // Wenn Maße passen, Schleife verlassen if (Breite == MaxWidth && Hoehe == MaxHeight) break; // Ansonsten weitersuchen DMode = geDriver_GetNextMode (Driver, DMode); } // Grafiktreiber/modus überprüfen if ((!Driver) || (!DMode)) ExitError ("Kein passender Grafiktreiber/modus!"); // Grafiktreiber/modus initialisieren if (!geEngine_SetDriverAndMode (Engine, Driver, DMode)) ExitError ("Grafikinitialisierung fehlgeschlagen!"); RunGame(); } //-------------------------------------------------- // Spielabbruch bei Fehler void TGame::ExitError (char *Txt) { // Fehlermeldung anzeigen, Programm abbrechen MessageBox (NULL, Txt, "Fehler", 48); FreeGame(); _exit (EXIT_FAILURE); }Sorry, dass es so groß ist, aber ich habe keine Ahnung in welcher Stelle der Fehler stecken könnte und deshalb hab ich euch mal alles gepostet!
Wär echt sehr nett wenn ihr mir helfen könntet! Ich verzweifle schon daran x_XDanke
h3x0g3n
-
Wenn der Code sich compilieren lässt und das erzeugte Programm sich starten lässt, dann wird das Problem wohl eher bei deinem COde liegen als beim BCB.
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Spiele-/Grafikprogrammierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ja sry! ich habe gedacht ich tus mal bei BCB rein, weil es ja n Unterschied macht mit was man des Programm schreibt!
Trotzdem THX fürs Verschieben
-
hast du die datei auch in nem ordner, in dem ein ordner namens levels ist?
also so
C:\genesis.cpp usw
C:\levels\worldxx.bsp
-
jo daran liegts nicht

-
Auch auf die Gefahr hin, daß rapso mich einen Newbie-beschimpfenden Doofbatz nennt ;), würde ich Dir dringend abraten, Dich mit dem uralten Krüppelswerk von Genesis3D zu beschäftigen...
-
Ja ich heut früh auch rausgefunden, dass Genesis3d nicht kompatibel mit den neuen Grafikkarten und der HT-Technologie ist!
Deswegen guck ich mir jetzt mal Irrlicht an!
Oder kennt jemand noch eine andere gute 3dEngine?Danke Sgt. Nukem
-
h3x0g3n schrieb:
Ja ich heut früh auch rausgefunden, dass Genesis3d nicht kompatibel mit den neuen Grafikkarten und der HT-Technologie ist!
Vor allem schleppen die noch 'nen Software-Renderer mit (entstand zu Zeiten der "3D-AddOn-Karten" 3DFX Voodoo etc.), etc. pp
h3x0g3n schrieb:
Deswegen guck ich mir jetzt mal Irrlicht an!
Oder kennt jemand noch eine andere gute 3dEngine?Irrlicht,
CrystalSource,
NebulaDevice,
OGRE,
...
-
Also ich hatte das Problem auch.
Hast du windows XP?Wenn ja lies weiter wenn nein kann ich dir leider nicht helfen.
Du musst einfach die kompilierte exe also wenn du dem Buch folgst die GPlay.exe nehmen dann rechte Maustaste drauf->eigenschaften->kompatiblitätsmodus oder so und dann im Windows 98/Me modus aussführen.
-
ich empfehl Ogre, Irrlicht ist zwar auch gut, aber Ogre sieht noch viel besser aus