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_X

    Danke
    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,
    ...

    ➡ http://www.devmaster.net/engines/



  • 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


Anmelden zum Antworten