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

Aktuelle Zeit: Do Jul 17, 2025 02:09

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Text ausgeben mit SDL
BeitragVerfasst: So Dez 25, 2005 12:14 
Offline
DGL Member

Registriert: Sa Dez 24, 2005 15:38
Beiträge: 7
Moin Moin zusammen.
Ich arbeite mich zur Zeit in OpenGL und SDL ein und stehe jetzt vor dem Problem wie ich Text ausgebe. Die Ansätze die im Wiki verwendet werden, kann ich nicht benutzen da ich durch die Fenstererstellung mit SDL ja keinen Device Context habe. Jetzt hab ich versucht das ganze über die SDL_ttf.pas zu regeln. Dabei tritt jedoch jedesmal ein SigSegv Fehler auf. Das TTF Modul ist initialisiert, der Font wird auch geladen. Der Fehler tritt erst bei "SDL_UpdateRect(screen,dstrect.x,dstrect.y,dstrect.w,dstrect.h);" auf. Bei den Parametern die ich am Anfang in die beiden TSDL_Color Variablen einspeichere bin ich mir auch nicht so ganz sicher ob das so stimmt, da mir nicht ganz klar ist was für Werte da erwartet werden.
Ich hab mal die betroffenen Codeteile angehängt.
Screen ist mein PSDL_Surface auf dem ich auch ohne Probleme zeichnen kann. LoadedFont eine Variable von Typ TTTF_Font.
Schonmal im Vorraus danke.

Code:
  1.  
  2. //Initialisierung von SDL_TTF
  3.   if ( TTF_Init = -1 ) then
  4.   begin
  5.     Log.LogError('Initalisierung von SDL_TTF schlug fehl: '+TTF_GetError,'SDL_TTF');
  6.     Quit_App;
  7.   end;
  8.  
  9. procedure CreateFont;
  10. begin
  11.   LoadedFont:=TTF_OpenFont('aispec.ttf',32);
  12.     If LoadedFont = nil
  13.     then begin
  14.         Log.LogError('Konnte den Font nicht laden: '+TTF_GetError,'SDL_TTF');
  15.         Quit_App;
  16.     end;
  17.  
  18. end;
  19.  
  20. procedure ShowText(pText: String);
  21. var TmpFontColor,TmpFontBGColor:TSDL_Color;
  22.     Text:PSDL_Surface;
  23.     dstrect : TSDL_Rect;
  24. begin
  25.     TmpFontColor.r:=1;
  26.     TmpFontColor.g:=0;
  27.     TmpFontColor.b:=0;
  28.     TmpFontBGColor.r:=0;
  29.     TmpFontBGColor.g:=0;
  30.     TmpFontBGColor.b:=0;
  31.     Text:=TTF_RenderText_Shaded(LoadedFont,PCHAR(ptext),TmpFontColor,TmpFontBGColor);
  32.     if ( text = nil ) then
  33.     begin
  34.       Log.LogError('Fontrendern fehlgeschlagen: '+TTF_GetError,'SDL_TTF');
  35.       TTF_CloseFont( loadedfont );
  36.       Quit_App;
  37.     end;
  38.     dstrect.x := ( screen^.w - text^.w ) div 2;
  39.     dstrect.y := ( screen^.h - text^.h ) div 2;
  40.     dstrect.w := text^.w;
  41.     dstrect.h := text^.h;
  42.     if ( SDL_BlitSurface( text, nil, screen, @dstrect ) <> 0 ) then
  43.     begin
  44.       TTF_CloseFont( loadedfont );
  45.       Quit_APP;
  46.     end;
  47.     SDL_UpdateRect(screen,dstrect.x,dstrect.y,dstrect.w,dstrect.h);
  48. end;
  49.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 25, 2005 15:45 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Hi,
leider (oder zum Glück ;) ) kann ich keinen Fehler in deinem Code finden.

Du könntest höchstens das probieren:
Code:
  1. SDL_UpdateRect(screen,0,0,0,0);

bzw. diese Zeile mal weglassen?

Ansonsten bieten sich noch Bitmap-Fonts an, oder du schaust die das Beispiel von Phoebius im SDK an.
Dort arbeitet er auch mit SDL_TFF, erstellt aber aus der Schrift eine Texture und lässt dann OpenGL rendern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 25, 2005 16:13 
Offline
DGL Member

Registriert: Sa Dez 24, 2005 15:38
Beiträge: 7
Die Zeile wegzulassen hab ich schon versucht, dann läuft zwar alles fehlerfrei aber der Text wird nicht angezeigt. Wenn ich den ganzen Screen update kommt ebenfalls die selbe Fehlermeldung. Das im SDK werd ich mir mal anschauen, danke für den Hinweis.

Edit:
Irgendwie bin ich blind, wo ist denn im SDK die Demo dazu? Finde die irgendwie nicht. Wenn mich nicht alles täuscht sind da nur 2 Demos zu dem Thema im SDL Verzeichnis. Aus denen hab ich aber den obrigen Code.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 25, 2005 21:04 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Könnte sein, dass das im Lux SDK enthalten ist. Ich glaube die sind im Moment nicht 100% identisch. Kann das jemand bestätigen?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 25, 2005 21:48 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Das mit dem identisch kann ich nichts sagen.
Eine SDL_TFF-Demo ist im Linux-SDK enthalten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 30, 2005 19:37 
Offline
DGL Member

Registriert: Sa Dez 24, 2005 15:38
Beiträge: 7
Irgendwie bin ich immernoch nicht weiter. Wo finde ich denn jetzt die erwähnte Demo? Im Windows SDK sind 2 Demos im SDL Verzeichnis, die sind auch beim normalen Jedi-SDL Paket dabei und aus denen hab ich mir auch obigen Code zusammengereimt. Wenn ich das Linux SDK entpacke ist im Sample Ordner ein Beispiel was sich aber nicht mit Sdl_TTF beschäftigt.
Ich geh inzwischen davon aus das Sdl_UpdateRect nicht funktioniert weil mein Sdl_Surface für OpenGl eingerichtet ist. Das ist so der einzige Unterschied den ich zwischen meinem Programm und den beiden Sdl Demos sehe.

Zu den Bitmap Fonts. Für die brauche ich doch wieder einen Device Context, welchen ich aber nicht habe. So wie ich das verstanden habe bleibt mir als einzige Lösung in dem Fall nur SDL_TTF.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 30, 2005 19:48 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Bitmapfonts brauchen keinen Renderkontext.
So erstellst du sie:
Code:
  1.   FontBase:= glGenLists(256);
  2.   for y := 0 to 15 do
  3.     for x := 0 to 15 do
  4.       begin
  5.       tc:=(16-Fontwidth[x+y*16])/256;
  6.       vc:=Fontwidth[x+y*16];
  7.       glNewList(FontBase+x+y*16, GL_COMPILE);
  8.       glEnable(GL_ALPHA_TEST);
  9.       glAlphaFunc(GL_GREATER, 0.1);
  10.       glBindTexture(GL_TEXTURE_2D,Fonttexture);
  11.       glBegin(GL_QUADS);
  12.         glTexCoord2f(FontCoordX[x  ]   ,FontCoordY[y+1]);  glVertex3f( 0,  0, 0);
  13.         glTexCoord2f(FontCoordX[x+1]-tc,FontCoordY[y+1]);  glVertex3f(vc,  0, 0);
  14.         glTexCoord2f(FontCoordX[x+1]-tc,FontCoordY[y  ]);  glVertex3f(vc, 16, 0);
  15.         glTexCoord2f(FontCoordX[x  ]   ,FontCoordY[y  ]);  glVertex3f( 0, 16, 0);
  16.       glEnd;
  17.       glDisable(GL_ALPHA_TEST);
  18.       glTranslatef(vc, 0, 0);
  19.       glEndList;
  20.       end;

und so schreibst du:
Code:
  1.   glPushMatrix; //Matrix speichern
  2.   glTranslatef(x, y, 0.05); //an die gewünschte Stelle gehen
  3.   glBindTexture(GL_TEXTURE_2D,fonttexture); //passende Textur einladen
  4.     glListBase(FontBase); //passende Liste einlesen
  5.     glCallLists(Length(Text), GL_UNSIGNED_BYTE, Pointer(Text)); //Buchstaben schreiben
  6.   glPopMatrix; //Matrix wieder herstellen

Kannst dir auch das Tutorial: Bomberman2 anschauen.

Wegen dem TFF-Demo:
Sollte unter Samples/sdl_tff liegen. Könnte aber sein, dass es aufgrund seinen "experimentalen" Charakter entfernt wurde.
Habe es einfach angehängt.

Ansonsten gut das du gepostet hast, wollte schon die ganze Zeit nachfragen wie es aussieht. Habe es nur immer wieder vergessen :oops:

Wegen dem SDL_UpdateRect:
Kannst du einfach mal bei SDL das OpenGL weglassen und schauen ob es dann funktioniert?
Dein geposteter Code benutzt ja kein SDL. Dann wüssten wir zumindest sicher, dass bei SDL+OpenGL keine Surfacemodifikation erlaubt sind (bzw. nicht machbar sind)
Ansonsten könntest du anstatt ner HardwareSurface mal ne SoftwareSurface nehmen.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 30, 2005 22:37 
Offline
DGL Member

Registriert: Sa Dez 24, 2005 15:38
Beiträge: 7
Oh, hatte mir per Google ein Tutorial zu Bitmap Fonts gesucht da stand aber drin das man einen DC brauchen würde, deswegen hab ich gar nicht weitergelesen. Gut dann werd ich mir das mal anschauen.
Hab jetzt mal probeweise die Initialisierung von OpenGL rausgelassen und siehe da es funktioniert. Kein Absturz und der Text wird richtig angezeigt. Könnte ruhig mal in der Beschreibung der Prozedur in der Sdl Doku dabeistehen*brummel*.
Und danke für das posten des Beispiels.

Edit
Habs jetzt mit dem geposteten Tutorial zum Laufen bekommen. Schrecklich was für Umstände man sich machen muss für ein bisschen Text :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 12, 2006 19:23 
Offline
DGL Member

Registriert: Fr Jul 30, 2004 07:35
Beiträge: 26
Es gibt noch eine andere Möglichkeit, Text über die SDL auszugeben und zwar mithilfe der SFont.pas, die auch im JEDI - SDL - Paket beiliegt. Beispiele dazu sind im Unterordner /SFont zu finden.
Vorteil: Es funktionniert auch plattformunabhängig und man benötigt nicht mehr die SDL_TTF
Nachteil: Du benötigst die Buchstaben des Alphabets und einige Zeichen als Bild abgespeichert und zwar in einer bestimmten Reihenfolge, damit es durch SFont auch richtig gelesen werden kann. (Damit man auch selber damit Fonts erstellen kann, empfehle ich dieses Tool hier (für Windows).)

Am besten läuft es mit reinem SDL, mit zusätzlichem OpenGL müsste man den Text eventuell als Textur auf ein Quad rendern.

_________________
[http://www.freeze-dev.de]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 12, 2006 19:38 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
SFont entspricht ungefähr dem Bitmapfonts.
SDL_TTF hat den Vorteil, dass man alle benötigten Schriftgrössen aus einer Datei ziehen kann.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.009s | 16 Queries | GZIP : On ]