unit Versuch;
// Nur Anzeige von BSP-Welt (ohne Bewegungen)
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
// Genesis_for_Delphi-Units
G4D_Genesis, G4D_BaseType, G4D_XForm3D, G4D_geTypes, G4D_Vfile,
GDriver;
type
TPlay =
class(TForm)
procedure FormCreate (Sender: TObject);
procedure FormActivate (Sender: TObject);
procedure FormDestroy (Sender: TObject);
procedure FormClick (Sender: TObject);
procedure FormKeyPress (Sender: TObject;
var Key: Char);
private
{ Private-Deklarationen }
Engine : pgeEngine;
// 3D-Engine
World : pgeWorld;
// World/Level
Camera : pgeCamera;
// Kamera/Betrachter
Driver : pgeDriver;
// Grafiktreiber
DMode : pgeDriver_Mode;
// Grafikmodus
XForm : geXForm3D;
// Matrix für Welt->Betrachter
isRunning: Boolean;
// Schalter für Spiel (ein/aus)
CW8087 : DWord;
// FPU-Kontrollwert
procedure ExitError (Txt:
String);
procedure CreateGame;
procedure RunGame;
procedure FreeGame;
public
{ Public-Deklarationen }
end;
const
Pfad = '
.\levels\';
BSP_Datei = '
World0.bsp';
GVersion = '
GPlay1';
OK = GE_TRUE;
// Kontrollwert für Engine-Methoden
MaxWidth = 640;
// Max. Screenbreite
MaxHeight = 480;
// Max. Screenhöhe
MCW_EM = DWORD($133f);
// für evtl. Division-durch-Null-Fehler
var
Play : TPlay;
// Spiel-"Unterlage"
GHandle : HWnd;
// Handle des Formulars
GInstance : LongInt;
// Handle der Applikation
implementation
{$R *.DFM}
procedure TPlay.ExitError (Txt:
String);
begin
// Fehlermeldung anzeigen, Programm abbrechen
ShowMessage (Txt); halt;
end;
procedure TPlay.CreateGame;
var
WorldScreen: geRect;
// Anzeigefläche
WorldName:
String;
// Name der BSP-Datei (Welt/Level)
WorldFile: pgeVFile;
// BSP-Datei (Welt/Level)
begin
// Anzeigefläche festlegen
with WorldScreen
do
begin
Left := 0; Right := MaxWidth - 1;
Top := 0; Bottom := MaxHeight - 1;
end;
// Koordinaten-Matrix setzen
geXForm3D_SetIdentity (@XForm);
// Kamera initialisieren
Camera:= geCamera_Create (2.0, @WorldScreen);
if Camera =
nil then
ExitError('
Kamera kann nicht installiert werden!');
// BSP-Datei laden
WorldName := Pfad + BSP_Datei;
WorldFile := geVFile_OpenNewSystem (
nil,
GE_VFILE_TYPE_DOS, PChar(WorldName),
nil, GE_VFILE_OPEN_READONLY);
// Wenn Datei ok, Welt/Level erzeugen
if WorldFile <>
nil then
begin
World := geWorld_Create(WorldFile);
geVFile_Close(WorldFile);
end;
if World =
nil then
ExitError ('
Welt/Level lässt sich nicht erzeugen!');
// Welt/Level mit 3D-Engine verknüpfen
if geEngine_AddWorld(Engine, World) <> OK
then
ExitError ('
Welt/Level lässt sich nicht einbinden!');
end;
procedure TPlay.RunGame;
begin
// Spielmodus auf "Laufen" einstellen
isRunning := true;
// Solange Spiel "läuft"
while isRunning
do
begin
// ggf. auf Ereignisse reagieren (z.B. Tastatur/Maus)
Application.ProcessMessages;
// 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) <> OK
then
ExitError ('
BeginFrame gescheitert!');
// Welt/Level rendern und darstellen
if geEngine_RenderWorld (Engine, World, Camera, 0.0) <> OK
then
ExitError ('
Rendering gescheitert!');
// Rendering beenden
if geEngine_EndFrame(Engine) <> OK
then
ExitError ('
EndFrame gescheitert!');
end;
end;
procedure TPlay.FreeGame;
begin
// Kamera, Welt und Engine freigeben
if Camera <>
nil then geCamera_Destroy (@Camera);
if World <>
nil then geWorld_Free (World);
if Engine <>
nil then geEngine_Free (Engine);
// Zeiger "nullen"
Camera :=
nil; World :=
nil; Engine :=
nil;
end;
procedure TPlay.FormCreate(Sender: TObject);
var AppDir:
String;
begin
// Wert von ControlWord speichern, Division durch Null "ausschalten"
CW8087 := Default8087CW;
Set8087CW(MCW_EM);
// Handle/Instanz von Formular/Applikation für 3D-Engine festlegen
GHandle := Self.Handle;
GInstance := hInstance;
// Pfad der Applikation ermitteln
AppDir := ExtractFilePath (Application.Exename);
// 3D-Engine initialisieren
Engine := geEngine_CreateWithVersion
(GHandle, GVersion, PChar(AppDir), GE_VERSION);
if Engine =
nil then
ExitError ('
3D-Engine kann nicht gestartet werden!');
// Treiber auswählen (Methode aus Unit GDriver)
SetDriver (GInstance, GHandle, Engine, Driver, DMode);
end;
procedure TPlay.FormActivate(Sender: TObject);
begin
// Grafiktreiber/modus überprüfen
if (Driver =
nil)
or (DMode =
nil)
then
ExitError ('
Kein Grafiktreiber/modus ausgewählt!');
// Grafiktreiber/modus initialisieren
if geEngine_SetDriverAndMode(Engine, Driver, DMode) <> OK
then
ExitError ('
Grafikinitialisierung fehlgeschlagen!');
// Anzeigedaten für Engine ausschalten
geEngine_EnableFrameRateCounter(Engine, GE_FALSE);
// Spiel initialisieren
CreateGame;
// Wiederholungs-Schleife für Spielverlauf
RunGame;
// Formular (bei Spielende) schließen
Close;
end;
procedure TPlay.FormDestroy(Sender: TObject);
begin
// Spiel "freigeben"
FreeGame;
// Alten FPU-Kontrollwert wiederherstellen
Set8087CW (CW8087);
end;
procedure TPlay.FormClick(Sender: TObject);
begin
isRunning := false;
end;
procedure TPlay.FormKeyPress(Sender: TObject;
var Key: Char);
begin
if Ord(Key) = VK_ESCAPE
then isRunning := false;
end;
end.