![]() |
Andorra 2D - graues Fenster
Hallo Leute!
Ich wollte jetzt einmal ein etwas "größeres" Projekt mit Lazarus angehen und kam auf die Idee ein 2d-Billardspiel zu programmieren. Da ich auf diverse Probleme gestoßen bin, habe ich mir gedacht, dass ich eine Bibliothek benutze (also zum Beispiel SDL oder Direct-X). Weil Andorra 2d aber extra für 2d-Spiele erstellt wurde und dort unter Lazarus auch Open GL unterstützt wird, habe ich Andorra 2d genommen und kompliliert. Beim Tutorial habe ich allerdings folgendes Problem: Bei mir kommt nicht der erhoffte Spruch "Andorra 2d works with Lazarus, too" im schwarzen Fenster, sondern nur das ganz normale graue Fenster "Form1". Der Name "Form1" verschwindet oben aus der Leiste und wenn ich Buttons über den Objektinspektor einbaue, dann werden diese in der laufenden Anwendung nicht gezeigt. Auch wenn ich die Fensterfarbe über den Objektinspektor verändere, bleibt das Fenster nach dem Programmstart grau. Ich hoffe ihr könnt mir helfen und bedanke mich jetzt schonmal. Der Link zum Tutorial und der so abkopierte Quellcode - Anmerkung: an einer Stelle steht dort @Idle, dort muss das @ weg soweit ich weiß ![]() |
AW: Andorra 2D - graues Fenster
Zitat:
Wenn ja, dann kann das gar nicht gut gehen. Über ein OpenGL-Fenster kannst du keine VCL/LCL-Controls legen. Edit: Meiner Meinung nach fehlt da auch noch in der Idle-Procedure ein "Done := false" am Schluss, oder täusche ich mich da? |
AW: Andorra 2D - graues Fenster
Ja, ich muss gestehen, dass ich genau das versucht habe. Allerdings würde mich auch viel mehr interessieren, wieso der Quellcode bei nicht so funktioniert, wie er im Tutorial angegeben wird...
Hier mein Quellcode:
Delphi-Quellcode:
Das Programm startet jetzt, aber danach tritt sofort ein SIGSEGV Fehler aus...
unit Unit1;
{$MODE DELPHI} interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, AdDraws, AdClasses; type { TForm1 } TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { private declarations } public procedure Idle(Sender: TObject; var Done:boolean); AdDraw : TAdDraw; { public declarations } end; var Form1: TForm1; implementation procedure TForm1.FormCreate(Sender: TObject); begin AdDraw := TAdDraw.Create(self); AdDraw.DllName := 'AndorraOGLLaz.dll'; AdDraw.Initialize; Application.OnIdle := Idle; end; procedure TForm1.FormDestroy(Sender: TObject); begin AdDraw.Free; end; procedure TForm1.Idle(Sender: TObject; var Done:boolean); begin AdDraw.ClearSurface(0); AdDraw.BeginScene; with AdDraw.Canvas do begin Font := AdDraw.Fonts.GenerateFont('Arial', 24, []); TextOut(0,0,'Andorra 2D...'); Font := AdDraw.Fonts.GenerateFont('Arial', 10, []); TextOut(0,30,'...works with Lazarus too'); end; AdDraw.EndScene; AdDraw.Flip; Done := false; end; initialization {$I Unit1.lrs} end. Dann springt der Cursor in eine Unit namens "AdFontFactory" in die Zeile "FLastKey := nil;" Wo liegt jetzt der Fehler? |
AW: Andorra 2D - graues Fenster
Was passiert denn, wenn du nach
Delphi-Quellcode:
noch ein
AdDraw.Flip;
Delphi-Quellcode:
setzt?
Done := false;
Ich befürchte, das Idle wird so nur einmal ausgeführt. |
AW: Andorra 2D - graues Fenster
Das mit dem
Delphi-Quellcode:
sollte nicht die Lösung des Problems sein...
Idle := false
Kannst du mal Testen, was passiert, wenn du nicht "Form1" als Parameter für TAdDraw.Create übergibst sondern "nil"? |
AW: Andorra 2D - graues Fenster
Also ich habe den Parameter "self" ausprobiert und auch den Parameter "nil" jedes Mal tritt jetzt dieser SIGSEGV exception Fehler auf. Mein Quellcode steht oben
|
AW: Andorra 2D - graues Fenster
Zitat:
Verwendest du eigentlich Linux oder Windows, kompilierst du für 32 oder 64 Bit? Edit: Gerade nochmal mit dem neusten Paket unter Linux getestet: Nachdem ich alle Abhängigkeiten installiert hatte und einige Symlinks für die gesuchten Bibliotheken erstellt habe lief zumindest die "NonVCL" Demo mit Lazarus ohne Probleme. Ich Denke dein Problem könnte sein, dass du noch die folgenden Units einbinden musst:
Delphi-Quellcode:
Und füge mal wie in allen anderen Tutorials beschrieben die Fehlerbehandlung für den Fall ein dass die Initialisierung fehlschlägt und lasse dir mittels TAdDraw.GetLastError die letzte Fehlermeldung ausgeben.
AdComponentWindow, AdStdWindow
|
AW: Andorra 2D - graues Fenster
Hi!
1. Verwendest du Windows oder Linux? 32 oder 64 Bit? 2. Ich vermute die Anwendung kann die AndorraOGLLaz.dll nicht finden. Liegt die denn im selben Verzeichnis, in dem auch die Anwendung erzeugt wird (im Fall von Windows)? Gruß, Sven |
AW: Andorra 2D - graues Fenster
Folgendes hat sich geändert: Ich habe die dll in den Ordner der Exe kopiert. Ich habe die Fehlerbehandlung eingebaut und tatsächlich beschwert er sich nun, dass die Initialisierung fehlgeschlagen ist.
Ich benutze übrigens Windows 32Bit. Hier mein momentaner Quellcode:
Delphi-Quellcode:
Woran könnte es liegen, dass die Initialisierung fehl geschlagen ist?
unit Unit1;
{$MODE DELPHI} interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, AdDraws, AdClasses,AdComponentWindow,AdStdWindow; type { TForm1 } TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { private declarations } public procedure Idle(Sender: TObject; var Done:boolean); AdDraw : TAdDraw; { public declarations } end; var Form1: TForm1; implementation { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin AdDraw := TAdDraw.Create(Form1); AdDraw.DllName := 'AndorraOGLLaz.dll'; if AdDraw.Initialize then begin Application.OnIdle := Idle; end else begin ShowMessage('Error while initializing Andorra 2D. Try to use another display'+ 'mode or another video adapter.'); halt; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin AdDraw.Free; end; procedure TForm1.Idle(Sender: TObject; var Done:boolean); begin AdDraw.ClearSurface(0); AdDraw.BeginScene; with AdDraw.Canvas do begin Font := AdDraw.Fonts.GenerateFont('Arial', 24, []); TextOut(0,0,'Andorra 2D...'); Font := AdDraw.Fonts.GenerateFont('Arial', 10, []); TextOut(0,30,'...works with Lazarus too'); end; AdDraw.EndScene; AdDraw.Flip; Done := false; end; initialization {$I Unit1.lrs} end. Muss ich noch irgendetwas in den Ordner kopieren, in dem meine .exe-Datei liegt? |
AW: Andorra 2D - graues Fenster
Bau doch mal statt der festen Meldung ein
Delphi-Quellcode:
in deine Routine ein. Dann bekommst du vielleicht einen etwas aussagekräftigeren Fehler.
ShowMessage(AdDraw.GetLastError);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:55 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 by Thomas Breitkreuz