S
Game.cpp:
//---------------------------------------------------
// 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
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!");
}
//--------------------------------------------------
// Spielabbruch bei Fehler
void TGame::ExitError (char *Txt)
{
// Fehlermeldung anzeigen, Programm abbrechen
MessageBox (NULL, Txt, "Fehler", 48);
FreeGame();
_exit (EXIT_FAILURE);
}
und Game.h:
//---------------------------------------------------
// 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"
Da steht irgendwas von Treiber nicht gefunden!