Zeilenumbruch

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

garret

Betreff: Zeilenumbruch

BeitragDo, Mai 04, 2006 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Zuge meines Projektes brauchte ich eine Funktion, die mit Zeilenumbrüchen arbeitet und den Text ausgibt. Das tut sie Wink
Das Beispiel im Buch von René Meyer versagte jedoch bei meinen Zwecken... Wink

Da die Frage irgendwann im letzten Zeitraum schon mal gestellt wurde, dachte ich mir, ich könnte die Funktion ja mal zeigen und vielleicht gibt es ja noch Verbesserungsvorschläge. Besonders die "Text"-Zeile nach Wend stört mich irgendwie noch.

Ich denke aber, dass man die Funktion gebrauchen kann, besonders wenn man Dialoge formatieren will.

Code: [AUSKLAPPEN]

Graphics 640,480,16,2
t$="Ein langer Text, den ich mir aus Testzwecken ausgedacht habe und der keine weitere Verwendung hat."


show_text(t$,300,100); Das Beispiel setzt den Text ab y=100 um x=100 gemittelt, Umbruch bei 20
WaitKey
Cls
show_text(t$,300,200,40); hier Umbruch bei 40
WaitKey
End


Function show_text(f_text$,f_x%,f_y%,f_umbruch%=20)
; Parameter:

; f_text$: der Text, der umgebrochen werden soll
; f_x/f_y: Koordinaten (um f_x wird gemittelt (siehe unten)!)
; f_umbruch: wann umgebrochen werden soll, z.B nach 20 Zeichen (momentan Standard)

Local pos%,a$,text_neu$,umbrechen%

While pos<Len(f_text$)
   pos=pos + 1            ; Zeichen für Zeichen wird durchgegangen
   a$=Mid(f_text$,pos,1)   ; und a$ zugewiesen
   
   If pos Mod f_umbruch=0 umbrechen=1; sind mehr Zeichen als f_umbruch gelesen worden
   ; sollte umgebrochen werden (f_umbrechen=1)

   If a$<>" "; ist a$ kein Leerzeichen
      text_neu$=text_neu+a$; wird es einfach an die Zeichenkette rangehangen

   ElseIf a$=" "         ; ist es aber ein Leerzeichen
      If umbrechen=1      ; und der Umbruch sollte erfolgen
         Text f_x,f_y+f_zeile*20,text_neu$,1,0; wird der Text ausgegeben
         f_zeile=f_zeile+1   ; und die Ausgabe rutscht eine Zeile tiefer
         umbrechen=0         ; ein Umbruch ist vorerst nicht mehr nötig
         text_neu$=""      ; die Zeichenkette wird geleert
      ElseIf umbrechen=0      ; ist ein Umbruch nicht nötig,
         text_neu$=text_neu+a$; wird das Leerzeichen normal rangehangen
      EndIf
   EndIf
Wend
Text f_x,f_y+f_zeile*20,text_neu$,1,0; und der letzte Teil der Zeichenkette ausgegeben
End Function


MfG garret
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Kryan

BeitragDo, Mai 04, 2006 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn, dann solltest du anstatt der anzahl der buchstaben, die breite benutzen, um den zeilenumbruch zu bewältigen...also einfach StringWidth()

hier mal meine funktion:

Code: [AUSKLAPPEN]
Function TextBox(txt$,x,y,w)
 For j=0 To 1
  Color 255,0,0
  saktx=x
  sakty=y
  aktx=x
  akty=y
  For i=1 To Len(txt$)
   z=0
   char$=Mid$(txt$,i,1)
   Select 1
   Case Asc(char$)=35
    zeichen1=Instr(txt$,"#",i+1)
    zeichen2=Instr(txt$," ",i+1)
    If zeichen1=0 And zeichen2=0 Then zeichen1=Len(txt$)
    If zeichen1>zeichen2 Or zeichen1=0 Then
     If zeichen2=0 Then
      z=zeichen1-i
     Else
      z=zeichen2-i
     End If
    Else
      z=zeichen1-i
    End If
    If z>0 Then
     stueck$=Mid$(txt$,i,z)
     If StringWidth(stueck$)+aktx>saktx+w Then
      Text aktx,akty,"-"
      akty=akty+FontHeight()+1
      aktx=saktx
     End If
    End If
   Case Asc(char$)=32
    zeichen1=Instr(txt$,"#",i+1)
    zeichen2=Instr(txt$," ",i+1)
    If zeichen1=0 And zeichen2=0 Then zeichen1=Len(txt$)
    If zeichen1>zeichen2 Or zeichen1=0 Then
     If zeichen2=0 Then
      z=zeichen1-i
     Else
      z=zeichen2-i
     End If
    Else
      z=zeichen1-i
    End If
    If z>0 Then
     stueck$=Mid$(txt$,i,z)
     If StringWidth(stueck$)+aktx>saktx+w Then
      akty=akty+FontHeight()+1
      aktx=saktx
     Else
      aktx=aktx+StringWidth(char$)
      Text aktx,akty,char$
     End If
    Else
     aktx=aktx+StringWidth(char$)
     Text aktx,akty,char$
    End If
   Case Asc(char$)>32
    Text aktx,akty,char$
    aktx=aktx+StringWidth(char$)
    If aktx>saktx+w Then
     akty=akty+FontHeight()+1
     aktx=saktx
    End If
   End Select
  Next
  If j=0 Then
   Color 196,196,196
   Rect saktx-2,sakty-2,w+4,akty-sakty+FontHeight()+4
   Color 100,100,100
   Rect saktx,sakty,w,akty-sakty+FontHeight()
  End If
 Next
End Function


das "#" und das " " gelten dabei als zeichen, die für einen zeilenumbruch notwendig sind
also einfach so: "Huf#eisen#magnet#feld#bilder" und daraus erscheint dann vllt sowas: Hufeisen- (nächste Zeile) magnetfeldbilder
oder halt anders ^^
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

D2006

Administrator

BeitragDo, Mai 04, 2006 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Function TextLines(x%,y%,width%,dat$,lines%=100,lin=1)
Local cas=0,pos=0,t,g$
dat$=dat$+" "
If lines=0 Then Return
For t=1 To Len(dat$)
g$=Mid$(dat$,t,1)
If g$=Chr$(13) Or g$=" " Then pos=t

If StringWidth(Left$(dat$,t))>width Or g$=Chr$(13) Then
If pos=0 Then pos=t
Text x%,y%,Left$(dat$,pos-1)
If lin<lines% Then TextLines(x%,y%+FontHeight(),width,Trim$(Mid$(dat$,pos)),lines%,lin+1)
cas=1
Exit
EndIf
Next
If cas=0 Then Text x,y,dat$
End Function


lines% ist die maximale Zeilenanzahl. Mit Chr$(13) kann man einen Zeilenumbruch erzwingen.

MfG
D2006
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

garret

BeitragDo, Mai 04, 2006 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Chr$(13) hatte ich mal ausprobiert, funktionierte aber seltsamerweise nicht...

Und statt # als Umbruchszeichen zu verwenden, kann man auch gleich mit Huf-eisen-magnet-feld-bilder arbeiten - sofern man den Bindestrich nicht braucht.

Die Varianten sind gut, wenn man es in einen bestimmten Bereich zwängen will, meine hingegen habe ich nur auf die Anzahl der Zeichen bezogen geschrieben (wie gesagt das Beispiel aus dem Buch).
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

Kryan

BeitragDo, Mai 04, 2006 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
ja...und wenn du es noch umschreiben würdest, würde es mir gefallen Very Happy
(obwohl ich sowieso meine variante präferiere)
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group