[B3D] Textblock mit Stringwidth - Angabe

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Hakkai

Betreff: [B3D] Textblock mit Stringwidth - Angabe

BeitragMi, Sep 29, 2010 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Poste hier mal eine Funktion welche Textblöcke darstellt indem die Stringlänge mit übergeben wird.

BlitzBasic: [AUSKLAPPEN]
textblock( 100, 100, "Spieler, kannst du mir von den Bäumen dahinten etwas Brenholz besorgen, ich glaub das meins nicht reichen wird.", 255)


würde dann sowas anzeigen:
user posted image

Code:
BlitzBasic: [AUSKLAPPEN]
Function textblock( xs, ys, in$, zbreite) ;zbreite in stringwidth()

Local fetch = 0 ; in Zeichen
Local zeile = 0 ; TextZeile
Local zeiley = 15 ; Zeilenabstand
Local nStr = 0 ; neuer String

While(1)
; _____ Finde heraus wieweit du gehen darfst
fetch = Instr(in$," ",1)

While(1)

If StringWidth(in$) > zbreite Then
nStr = StringWidth(Left(in$,Instr(in$," ",fetch+1)))
If (nStr > 0) And (nStr < zbreite) Then ;wenn hier das letzte Wort stand, liefert nStr 0 zurück.
fetch = Instr(in$," ",fetch+1) ; erhöhe einzulesende Zeichen
Else
Exit
EndIf
Else
fetch = Len(in$)
Exit
EndIf

Wend
; _____ Habe es herausgefunden

If (Not fetch) And Len(in$) Then fetch = Len(in$) ;sollte es noch nicht eingelesene Zeichen geben ist es wohl das letzte Wort

If fetch = 0 Then
Exit
Else
zeile = zeile+1
EndIf

Text xs, ys+(zeile*zeiley), Left(in$, fetch) ; es wird bis zum fetch ausgegeben was in in$ steht
in$ = Right(in$,Len(in$)-fetch) ;in$ wird angepasst

If (Not Len(in$)) Then Exit
Wend

End Function




==============
Edit: Die Klammern um den Not Operator haben gefehlt.
Last Update: 29.9.10 - 11:38
  • Zuletzt bearbeitet von Hakkai am Mi, Sep 29, 2010 23:34, insgesamt 2-mal bearbeitet

ToeB

BeitragMi, Sep 29, 2010 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal sehr schöne Function, kann sicher der ein Oder andere gebrauchen, ich würde nur hier im codearchiv noch ein Beispiel hinzulegen Wink

Außerdem : Ist es wirklich nötig zwei While(1) schleifen ? Kann man sicherlich auch mit ner For/Next Schleife lösen, da besteht kein Risiko das sich die Schleife aufhängt.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Hakkai

BeitragMi, Sep 29, 2010 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
An der Anzahl der Schleifendurchläufe ändert sich nichts wenn ich While oder For Next verwende.
For Next ist allerdings etwas schwieriger hier, wenn man den Zeilenumbruch nur an Leerzeilen vornehmen will.

Edit:

hier mal ein vollständiges Beispiel, eigentlich ist die Funktion nichts weiter als die Text - Function nur ebend mit dem Trenner als 4. Parameter

BlitzBasic: [AUSKLAPPEN]
Graphics 1024,768,32,2
SetBuffer BackBuffer() ; DoubeBuffering
AppTitle "TextBlockfunction"

Repeat

Local t$ = "dies ist ein langer Text welchen ich in regelmässigen Abständen getrennt haben möchte, am besten da wo Leerzeilen sind und maximal in der Länge der ersten 5 Worte in diesem Text."
Local trenner = StringWidth("dies ist ein langer Text")

textblock( 100, 100, t$, trenner)

Flip(0)
Cls

Until KeyHit(1) ; Ende der Hauptschleife
End

Function textblock( xs, ys, in$, zbreite) ;zbreite in stringwidth()

Local fetch = 0 ; in Zeichen
Local zeile = 0 ; TextZeile
Local zeiley = 15 ; Zeilenabstand
Local nStr = 0 ; neuer String

While(1)
; _____ Finde heraus wieweit du gehen darfst
fetch = Instr(in$," ",1)

While(1)

If StringWidth(in$) > zbreite Then
nStr = StringWidth(Left(in$,Instr(in$," ",fetch+1)))
If (nStr > 0) And (nStr < zbreite) Then ;wenn hier das letzte Wort stand, liefert nStr 0 zurück.
fetch = Instr(in$," ",fetch+1) ; erhöhe einzulesende Zeichen
Else
Exit
EndIf
Else
fetch = Len(in$)
Exit
EndIf

Wend
; _____ Habe es herausgefunden

If (Not fetch) And Len(in$) Then fetch = Len(in$) ;sollte es noch nicht eingelesene Zeichen geben ist es wohl das letzte Wort

If fetch = 0 Then
Exit
Else
zeile = zeile+1
EndIf

Text xs, ys+(zeile*zeiley), Left(in$, fetch) ; es wird bis zum fetch ausgegeben was in in$ steht
in$ = Right(in$,Len(in$)-fetch) ;in$ wird angepasst

If (Not Len(in$)) Then Exit
Wend

End Function

Hubsi

BeitragDo, Sep 30, 2010 5:12
Antworten mit Zitat
Benutzer-Profile anzeigen
While True ... Wend sieht nur etwas komisch aus, in aller Regel verwendet man bei sowas Repeat ... Forever Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group