Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 20, 2025 00:35

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Okt 12, 2005 08:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hallo,

Ich hätt da wieder so ein Problemchen, wobei es diesmal schon eher ein Problem ist, also:
ich will einen Text in einem bestimmten Feld zentriert, rechtsbündig etc. darstellen.
Zum erstellen der Text-DisplayListen benutze ich wglUseFontBitmaps().

Wenn ich einen Text schreiben will, dann positioniere ich ihn mit glRasterPos3f(x,y,z),
dann rufe ich die entsprechenden Display-Listen auf:

glListBase(Font_DList);
glCallLists(Length(Text), GL_UNSIGNED_BYTE, PChar(Text));

Problem:
Wie kann ich herausfinden wie lang der geschriebene Text ist,
denn das muss ich ja wissen, wenn ich ihn ausrichten will?

Idee:
Theoretisch kann man ja nach dem Zeichnen die Gl_Current_Raster_Position abfragen und
schauen um wieviel die X-Komponente sich geändert hat. Dann hat man ja quasi die Textlänge...

Nachteil 1: man müsste ja alles zweimal zeichnen (bzw. das 1. Mal "nur so tun"), damit man die
Textlänge hat und dann kann man es Richtig zeichnen mit dem angepassten glRasterPos3f
vor glCallLists(...).

Nachteil 2: (viel schlimmer) ich kriegs net hin :oops:

Jaja, toll wenn man hinterher weiß, was man vorher wissen muss :)

Deswegen muss es ja noch eine bessere Lösung geben, falls meine Idee überhaupt funzt.



Zweite Frage:
Warum verschwindet der Text sobald er etwas am linken oder am unteren Viewport-Rand hinausragt?
(bin im Ortho-modus)


Bin für jeden Vorschlag/Hilfe sehr dankbar!

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 12, 2005 09:04 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Es gab wohl ne Windowsfunktion um die Länge von Text in bestimmten Schriften abzufragen... Ich glaub, Mars hat das genutzt um seine TextureFonts zu generieren.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 12, 2005 09:12 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Entweder mit TCanvas.TextWidth/TCanvas.TextHeight oder GetTextExtentPoint32(dc:HDC;text:pchar;length:integer;var size:TSize);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 12, 2005 09:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie sollte es auch anders sein gibt es noch eine Möglichkeit. ;-)
In meiner BitmapFontKlasse habe ich das so gemacht. Das praktische ist, dass man diese Informationen beim Generieren abfragen kann und dann immer parat hat.

Hier mal die wichtigsten Bruchstücke.
Code:
  1.  
  2.   FAbc: array[0..255] of TABC;
  3.  
  4.   // Beim Generieren
  5.   FListBase := glGenLists(256);
  6.   SelectObject(FDC, FFont.Handle);
  7.   wglUseFontBitmaps(FDC, 0, 255, FListBase);
  8.  
  9.   GetCharABCWidths(FDC, 0, 255, FAbc[0]);
  10.  
  11. // Größe abfragen
  12. function TglBitmapText.GetTextWidth(Text: String): Double;
  13. var
  14.   Idx: Integer;
  15. begin
  16.   Result := 0;
  17.  
  18.   for Idx := 1 to Length(Text)
  19.     do Result := Result + FAbc[Ord(Text[Idx])].abcB;
  20. end;

Der Typ TABC stammt glaube ich aus der Unit windows.

Zu deiner zweiten Frage. Sobald glRasterPos außerhalb des sichtbaren Bereiches (negative werte) liegt wird der Aufruf ins Nirvana geschickt. Also es wird verhindert, dass du etwas zeichnen kannst. Schau dir mal folgendes Thema an. Die Methode von Flo mit glBitmap klingt für mich ganz interessant.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 12, 2005 14:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Ah, genau das, was ich brauchte, um den Text jetzt auszurichten.
Vielen Dank @all :D

Ok, das mit dem verschwinden des Textes werde ich hoffentlich
noch in den Griff bekommen. Ansonsten steht meiner GUI
(bastel gerade eine eigene für mein Game) nichts mehr im Wege. :wink:

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 07:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Oops, bezüglich des Verschwindens des Textes war ich wohl zu optimistisch gewesen... :?
Wenn ich glbitmap(....., nil) aufrufe, dann gibt er mir ne access violation at adress 00000003 (?) in einer
Ati-dll (glaub: atiglx?).

Ich hab glbitmap() direkt vor glrasterpos3f() gesetzt. Könnt ihr mir nochmals auf die Sprünge helfen, was mache ich falsch, liegts vielleicht am GraKa-Treiber ??
:?:

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 07:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hast du Width und Height des Bildes auf 0 gesetzt? Also die ersten beiden Parameter.

Laut Wiki würde sagen, dass ein Aufruf von glBitmap so aussehen sollte.
Code:
  1. glBitmap(0, 0, 0, 0, XMove, YMove, nil);


Sollte das nicht funktionieren, dann solltest dir ein Temporäres Bitmap erstellen. Wobei Bitmap da echt zu viel gesagt wäre. Da sollte ein Byte ausreichen. Und das übergibst du als Pointer. Als Größe dann 1 und 1. Das Byte muss natürlich 0 sein. Damit hast du ein sehr kleines und leeres Bitmap. Damit muss es dann auf jeden Fall gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 12:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Als bitmap width bzw. height hatte ich keine 0. Gut das wars danke.

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 12 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 17 Queries | GZIP : On ]