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:
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
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)
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
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:
FAbc:array[0..255]of TABC;
// Beim Generieren
FListBase := glGenLists(256);
SelectObject(FDC, FFont.Handle);
wglUseFontBitmaps(FDC,0,255, FListBase);
GetCharABCWidths(FDC,0,255, FAbc[0]);
// Größe abfragen
function TglBitmapText.GetTextWidth(Text:String):Double;
var
Idx:Integer;
begin
Result :=0;
for Idx :=1toLength(Text)
do Result := Result + FAbc[Ord(Text[Idx])].abcB;
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.
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
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.
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 ??
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:
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.
Mitglieder in diesem Forum: 0 Mitglieder und 11 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.