Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [OpenGL] Startmenü (https://www.delphipraxis.net/132317-%5Bopengl%5D-startmenue.html)

BullsEye 9. Apr 2009 20:58


[OpenGL] Startmenü
 
Hallo DP'ler,

ich versuche gerade ein Startmenü für ein OpenGL Spiel zu erstellen.

Delphi-Quellcode:
  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);
So bekomme ich den Text einwandfrei angezeigt, so wies soll. Dies ist also reiner Text.
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:
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.
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.

Dort wird diese so aufgerufen:

Delphi-Quellcode:
BMenuItem('Start', 4, 9.2, 0.5, 0.5, FontSprites.STRING_ALIGNMENT_LEFT);
Vielen Dank schonmal für eure Hilfe!

Namenloser 9. Apr 2009 21:06

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.

BullsEye 9. Apr 2009 21:13

Re: [OpenGL] Startmenü
 
Ah danke :wall: (dummer Fehler)

EDIT: Bevor es zu "Missverständnissen" kommt.

Ich rufe die Funktion nun so auf.
Delphi-Quellcode:
BMenuItem('Start', 4, 9.2, 0.5, 0.5, FontSprites.STRING_ALIGNMENT_LEFT);
In der Funktion war aber noch ein Fehler (Variablen Deklaration). Richtig ist die Unit so:

Delphi-Quellcode:
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.
"eintrag" war vorher als TStringSprite deklariert.

Namenloser 9. Apr 2009 21:19

Re: [OpenGL] Startmenü
 
Ähm, zuerst castest du ein TStringSprite auf einen string, und jetzt umgekehrt? :gruebel:
Delphi-Quellcode:
TStringSprite(eintrag)
Meinst du vielleicht nicht eher
Delphi-Quellcode:
result
:glaskugel:

BullsEye 9. Apr 2009 21:23

Re: [OpenGL] Startmenü
 
Also so wäre besser?

Delphi-Quellcode:
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.
Anstelle von

Delphi-Quellcode:
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.
Also beides funktionert. Aber was ist daran der Vor/Nachteil?

Namenloser 9. Apr 2009 21:26

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?

BullsEye 9. Apr 2009 21:28

Re: [OpenGL] Startmenü
 
Zitat:

Zitat von NamenLozer
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?

Zitat:

[Warnung] BullsMenu.pas(47): Rückgabewert der Funktion 'BMenuItem' könnte undefiniert sein
Betonung auf KÖNNTE! :mrgreen:

Also das heißt jetzt, wenn der erste Parameter anders heißen würde, würds nicht funktionieren?

Namenloser 9. Apr 2009 21:31

Re: [OpenGL] Startmenü
 
Zitat:

Zitat von BullsEye
Zitat:

Zitat von NamenLozer
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?

Zitat:

[Warnung] BullsMenu.pas(47): Rückgabewert der Funktion 'BMenuItem' könnte undefiniert sein
Betonung auf KÖNNTE! :mrgreen:

Also das heißt jetzt, wenn der erste Parameter anders heißen würde, würds nicht funktionieren?

Jo.

BullsEye 9. Apr 2009 21:48

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 ;)

Namenloser 9. Apr 2009 22:05

Re: [OpenGL] Startmenü
 
Zitat:

Zitat von BullsEye
Aber ich bin noch bissel neu auf dem Gebiet.

Kein Ding, ich bin nur anfangs aufgrund deiner Beiträge und deiner Programme nicht davon ausgegangen, dass das für dich wirklich neu ist. Dachte, du stehst vielleicht einfach nur auf dem Schlauch :oops:

edit: Wenn noch irgendwas unklar ist, frag ruhig nach.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz