![]() |
[OpenGL] Startmenü
Hallo DP'ler,
ich versuche gerade ein Startmenü für ein OpenGL Spiel zu erstellen.
Delphi-Quellcode:
So bekomme ich den Text einwandfrei angezeigt, so wies soll. Dies ist also reiner Text.
s := TStringSprite.CreateString('Weiter', 4, 9.2, 0.5, 0.5, FontSprites.STRING_ALIGNMENT_LEFT);
s.Font := Constants.FontTexture; s.Space := 0.5; s.Z := 0; s.Alignment := FontSprites.STRING_ALIGNMENT_LEFT; Map.AddSprite(s); Da dies aber für jeden Menüeintrag ziemlich viel Code wäre und das Menü noch optisch aufgebessert werden soll, habe ich eine eigene Unit erstellt. In dieser habe ich eine Funktion für den oben genannten Code geschrieben (oder es versucht^^). Die Unit sieht wie folgt aus:
Delphi-Quellcode:
Das Problem ist nun, das ich wenn ich versuche diese Funktion in der "GameEngine.pas" aufzurufen (Dort wird auch der Text ausgegeben (s. Quellcode #1) erhalte ich einen undefinierte Bezeichnung.
unit BullsMenu;
interface uses Sprites, FontSprites, Constants; implementation function BMenuItem(eintrag:TStringSprite; x,y,width,height: Single; Align: Integer): TStringSprite; VAR Map : TTextureSprite; BEGIN eintrag := TStringSprite.CreateString(String(eintrag), x, y, width, height, align); eintrag.Font := Constants.FontTexture; eintrag.Space := 0.5; eintrag.Z := 0; eintrag.Alignment := FontSprites.STRING_ALIGNMENT_LEFT; Map.AddSprite(eintrag); END; END. Dort wird diese so aufgerufen:
Delphi-Quellcode:
Vielen Dank schonmal für eure Hilfe!
BMenuItem('Start', 4, 9.2, 0.5, 0.5, FontSprites.STRING_ALIGNMENT_LEFT);
|
Re: [OpenGL] Startmenü
Die Funktion muss noch im interface deklariert werden:
Delphi-Quellcode:
unit BullsMenu;
interface uses Sprites, FontSprites, Constants; // hier: function BMenuItem(eintrag:TStringSprite; x,y,width,height: Single; Align: Integer): TStringSprite; implementation function BMenuItem(eintrag:TStringSprite; x,y,width,height: Single; Align: Integer): TStringSprite; VAR Map : TTextureSprite; BEGIN eintrag := TStringSprite.CreateString(String(eintrag), x, y, width, height, align); eintrag.Font := Constants.FontTexture; eintrag.Space := 0.5; eintrag.Z := 0; eintrag.Alignment := FontSprites.STRING_ALIGNMENT_LEFT; Map.AddSprite(eintrag); END; END. |
Re: [OpenGL] Startmenü
Ah danke :wall: (dummer Fehler)
EDIT: Bevor es zu "Missverständnissen" kommt. Ich rufe die Funktion nun so auf.
Delphi-Quellcode:
In der Funktion war aber noch ein Fehler (Variablen Deklaration). Richtig ist die Unit so:
BMenuItem('Start', 4, 9.2, 0.5, 0.5, FontSprites.STRING_ALIGNMENT_LEFT);
Delphi-Quellcode:
"eintrag" war vorher als TStringSprite deklariert.
unit BullsMenu;
interface uses Sprites, FontSprites, Constants; function BMenuItem(eintrag:String; x,y,width,height: Single; Align: Integer): TStringSprite; implementation function BMenuItem(eintrag:String; x,y,width,height: Single; Align: Integer): TStringSprite; VAR Map : TTextureSprite; BEGIN TStringSprite(eintrag) := TStringSprite.CreateString(eintrag, x, y, width, height, align); TStringSprite(eintrag).Font := Constants.FontTexture; TStringSprite(eintrag).Space := 0.5; TStringSprite(eintrag).Z := 0; TStringSprite(eintrag).Alignment := FontSprites.STRING_ALIGNMENT_LEFT; Map.AddSprite(TStringSprite(eintrag)); END; END. |
Re: [OpenGL] Startmenü
Ähm, zuerst castest du ein TStringSprite auf einen string, und jetzt umgekehrt? :gruebel:
Delphi-Quellcode:
Meinst du vielleicht nicht eher
TStringSprite(eintrag)
Delphi-Quellcode:
:glaskugel:
result
|
Re: [OpenGL] Startmenü
Also so wäre besser?
Delphi-Quellcode:
Anstelle von
unit BullsMenu;
interface uses Sprites, FontSprites, Constants; function BMenuItem(eintrag:String; x,y,width,height: Single; Align: Integer): TStringSprite; implementation function BMenuItem(eintrag:String; x,y,width,height: Single; Align: Integer): TStringSprite; VAR Map : TTextureSprite; BEGIN // Änderungen ANFANG result := TStringSprite.CreateString(eintrag, x, y, width, height, align); result.Font := Constants.FontTexture; result.Space := 0.5; result.Z := 0; result.Alignment := FontSprites.STRING_ALIGNMENT_LEFT; Map.AddSprite(result); // Änderungen ENDE END; END.
Delphi-Quellcode:
Also beides funktionert. Aber was ist daran der Vor/Nachteil?
unit BullsMenu;
interface uses Sprites, FontSprites, Constants; function BMenuItem(eintrag:String; x,y,width,height: Single; Align: Integer): TStringSprite; implementation function BMenuItem(eintrag:String; x,y,width,height: Single; Align: Integer): TStringSprite; VAR Map : TTextureSprite; BEGIN TStringSprite(eintrag) := TStringSprite.CreateString(eintrag, x, y, width, height, align); TStringSprite(eintrag).Font := Constants.FontTexture; TStringSprite(eintrag).Space := 0.5; TStringSprite(eintrag).Z := 0; TStringSprite(eintrag).Alignment := FontSprites.STRING_ALIGNMENT_LEFT; Map.AddSprite(TStringSprite(eintrag)); END; END. |
Re: [OpenGL] Startmenü
Der Vorteil meiner Variante ist, dass sie nicht nur zufällig funktioniert :lol:
Deine Variante funktioniert nur deshalb, weil das Ergebnis einer Funktion und der erste Parameter zufällig beide das register EAX belegen. Gibt dein Delphi keine Warnung aus, dass das Ergebnis der Funktion undefiniert ist? |
Re: [OpenGL] Startmenü
Zitat:
Zitat:
Also das heißt jetzt, wenn der erste Parameter anders heißen würde, würds nicht funktionieren? |
Re: [OpenGL] Startmenü
Zitat:
|
Re: [OpenGL] Startmenü
Ah ok, danke.
Sorry, für die nervigen Fragen. Aber ich bin noch bissel neu auf dem Gebiet. Und ich denke nicht, das es mir was bringt, wenn ich einfach nur den Verbesserungsvorschlag aus der DP reinkopiere. Ich wollte das ganze auch wohl ein wenig verstehen ;) |
Re: [OpenGL] Startmenü
Zitat:
edit: Wenn noch irgendwas unklar ist, frag ruhig nach. |
Re: [OpenGL] Startmenü
ja, macht nichts. Aber OpenGL ist mein erster Tag ;)
Weiß vllt einer, wie ich daraus nun ein "OnClick Event" bekomme? Also wenn ich auf diese Schrift klicke soll etwas passieren? |
Re: [OpenGL] Startmenü
also du musst das ganze als objekt selektieren....
mom ich lern ja auch gerade opengl und hab dafür einen recht guten kurs gefunden..... das is jez der link zum teil zum objekte selektieren,für andere kursteile einfach die nummer des teils oben in der addresszeile ändern.... ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 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