![]() |
FormAktivate usw. werden übersprungen
Hi
Ich hab mir vor ein paar Tagen das Buch Game Programming für Kids gekauft.Das war natürlich super und ich hab sofort mit dem 1. Kapitel angefangen. Als dann mein 1. Programm(is nur ein Standbild^^) nicht funzte und ich lies ich es in Einzelschritten laufen und bemerkte, dass die Hauptunit(Ich weiß nich wie ich das sonst nennen soll) garnicht genutzt wird(d.h. es lädt erst alle Dateien die ich hinter uses gesetzt habe, dann kommt es zu der 'hautunit' zurück und lässt die FormCreate usw. Anweisungen einfach aus und geht über zu end.) Hier is der Code :
Delphi-Quellcode:
Auf ner CD die beim Buch dabei war sind alle Projekte schon fertig drauf.Bei dem Projekt auf der CD funzt es komischerweise.(Hab mir auch schon den text von dem Cd-Projekt kopiert, es tritt aber der gleiche fehler auf)
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. Ich hoffe dass mir jemand helfen kann :( MfG IKEA |
Re: FormAktivate usw. werden übersprungen
Naja, du musst auch irgendwo (z.B. in einem initialization-Abschnitt oder dem Anweisungsblock des Programms) die Methoden dem Ereignis zuweisen.
Delphi-Quellcode:
So zum Beispiel.
Form1.OnActivate:=Form1.FormActivate;
|
Re: FormAktivate usw. werden übersprungen
Wird den eine Instanz von TPlay erzeugt?
|
Re: FormAktivate usw. werden übersprungen
Hi ikea
erst mal herzlich wilkommen in der DP :dp: Mal eine kurze Frage: Fängst du gerade an zu proggen? Oder hast du damit gute Erfahrungen und versuchst die ersten Schritte in Game-Programmierung? Wenn du die erste Frage bejaen kannst und die zweite nicht, dann empfehle ich dir mit etwas einfacherem anzufangen. Das Problem mit dem kopieren von 'ner Menge Code ohne ihn zu verstehen fängt damit an, dass, wenn etwas nicht läuft, man eigentlich absolut null Durchblick bekommt und außer rumprobieren ohne Plan den Fehler nicht findet. Gehe Schritt für Schritt vor und lerne zuerst wie das so alles funzt mit den Klassen, Proceduren, Function, Variablen .... API ... Hast du dann so in etwa einen Plan, nehm dir was schwereres vor. gruß oki |
Re: FormAktivate usw. werden übersprungen
Vielen Dank für die vielen Antworten.
Ich hab das Problem nun gelöst MfG IKEA |
Re: FormAktivate usw. werden übersprungen
Hi IKEA,
und was wars nun? |
Re: FormAktivate usw. werden übersprungen
Zitat:
![]() mfg Christian |
Re: FormAktivate usw. werden übersprungen
Zitat:
edit: oh, da stehts ja... lala :stupid: :oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz