AdvText: Vgfarbe, Hgfarbe, H&V Align, Tabulatoren!

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: AdvText: Vgfarbe, Hgfarbe, H&V Align, Tabulatoren!

BeitragDo, Jul 01, 2010 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
AdvText(X-Position, Y-Position, Text, [Positions-Modifikator-X, [Positions-Modifikator-Y, [Zeilenabstand-Multiplikator]]])

X-Position:
Position des Textes auf der X-Achse
Y-Position:
Position des Textes auf der Y-Achse
Text:
Text der angezeigt werden soll. Farbige Texte werden vollständig understützt:
Vordergrundfarbe kann via "|fRRGGBB"(Hexadezimal) und die Hintergrundfarbe kann via "|bRRGGBB"(Hexadezimal oder -1 für unsichtbar) gesetzt werden. Tabulatoren funktionieren ebenfalls(HT = 4 aligned Spaces, VT = 8 aligned Spaces).
Positions-Modifikator-X:
Stärke der Positionsveränderung auf der X-Achse. 1 wäre Zentriert, 2 wäre Rechtsbündig. Andere Werte(auch Kommazahlen) sind auch möglich. Standardmäßig 0.
Positions-Modifikator-Y:
Stärke der Positionsveränderung auf der Y-Achse. 1 wäre Zentriert. Andere Werte(auch Kommazahlen) sind auch möglich. Standardmäßig 0.
Zeilenabstand-Multiplikator:
Wird mit FontHeight() multipliziert. Wenn man also nur 16pixel als Zeilenabstand haben möchte müsste man 16.0/Fontheight() rechnen und das ergebnis dann übergeben. Standardmäßig 1.

Exclamation Hinweis: Diese Funktion nutzt eine Dim, da ich es nicht geschafft habe, Blitzarrays dynamisch neuzuerstellen.

Code:
BlitzBasic: [AUSKLAPPEN]
;AdvText Function
Dim SplittedString$(0)
Dim sTextLines$(0,1)
Global SplitCount, AdvText_X, AdvText_Y, AdvText_Width, AdvText_Height
Function AdvText(iX, iY, sText$, iCenterX#=0, iCenterY#=0, fLineSpace#=1)
Local iTextLines = 1, iLine = 0

AdvText_X = 0:AdvText_Y = 0:AdvText_Width = 0:AdvText_Height = 0

SplitString(sText, Chr(10))
iTextLines = SplitCount-1

Dim sTextLines$(iTextLines,1)
For iLine = 0 To iTextLines
sTextLines(iLine, 0) = SplittedString$(iLine)
Next

;Parse the Text so that we get only the visible text into the second slot.
Local iLastClr = 1, tabLength = 0
For iLine = 0 To iTextLines
iLastClr = 1
For iPos = 1 To Len(sTextLines(iLine,0))
sChar$ = Mid(sTextLines(iLine,0), iPos, 1)
If sChar = "|" And (Mid(sTextLines(iLine,0), iPos+1, 1) = "f" Or Mid(sTextLines(iLine,0), iPos+1, 1) = "b")
sTextLines(iLine,1) = sTextLines(iLine,1) + Mid(sTextLines(iLine,0),iLastClr,iPos-iLastClr)
iLastClr = iPos+8
ElseIf sChar = Chr(9)
sTextLines(iLine,1) = sTextLines(iLine,1) + Mid(sTextLines(iLine,0),iLastClr,iPos-iLastClr)
iLastClr = iPos

;Remove Tab Character
sTextLines(iLine,0) = Left(sTextLines(iLine,0), iPos-1) + Right(sTextLines(iLine,0), Len(sTextLines(iLine,0))-iPos)

tabLength = (4-(Len(sTextLines(iLine,1)) Mod 4))
For iTabSpace = 1 To tabLength
sTextLines(iLine,0) = Left(sTextLines(iLine,0), iPos-1) + " " + Right(sTextLines(iLine,0), Len(sTextLines(iLine,0))-iPos+1)
Next
ElseIf sChar = Chr(11)
sTextLines(iLine,1) = sTextLines(iLine,1) + Mid(sTextLines(iLine,0),iLastClr,iPos-iLastClr)
iLastClr = iPos

;Remove Tab Character
sTextLines(iLine,0) = Left(sTextLines(iLine,0), iPos-1) + Right(sTextLines(iLine,0), Len(sTextLines(iLine,0))-iPos)

tabLength = (8-(Len(sTextLines(iLine,1)) Mod 8))
For iTabSpace = 1 To tabLength
sTextLines(iLine,0) = Left(sTextLines(iLine,0), iPos-1) + " " + Right(sTextLines(iLine,0), Len(sTextLines(iLine,0))-iPos+1)
Next
ElseIf iPos = Len(sTextLines(iLine,0))
sTextLines(iLine,1) = sTextLines(iLine,1) + Mid(sTextLines(iLine,0),iLastClr,iPos-iLastClr+1)
EndIf
Next
; Return width.
If (AdvText_Width < StringWidth(sTextLines(iLine,1))) Then AdvText_Width = StringWidth(sTextLines(iLine,1))
Next

; Return Height
If (AdvText_Height < (FontHeight()*(iTextLines+1)*fLineSpace)) Then AdvText_Height = (FontHeight()*(iTextLines+1)*fLineSpace)

;Real Text Processing
Local iRedO = ColorRed(), iGreenO = ColorGreen(), iBlueO = ColorBlue() ; Original Foreground Color
Local iRed = ColorRed(), iGreen = ColorGreen(), iBlue = ColorBlue() ;Foreground
Local iBGRed = -1, iBGGreen = -1, iBGBlue = -1 ;Background
Local icX, icY, icsX, scText$, iRealPos
For iLine = 0 To iTextLines
sText$ = sTextLines(iLine,0)
icsX = -(StringWidth(sTextLines(iLine,1))*0.5)*iCenterX
icX = icsX
icY = ( -(FontHeight()*(iTextLines+1)*0.5*fLineSpace*iCenterY) + (iLine * FontHeight() * fLineSpace) )

; Return X and Y starting point.
If (AdvText_X > iX + icX) Then AdvText_X = iX + icX
If (AdvText_Y > iY + icY) Then AdvText_Y = iY + icY

iRealPos = 1
For iPos = 1 To Len(sText)
sChar$ = Mid(sText, iPos, 1)
If sChar = "|" And Mid(sText, iPos+1, 1) = "f" ;Foreground Change
If iBGRed > -1 And iBGGreen > -1 And iBGBlue > -1
Color iBGRed, iBGGreen, iBGBlue
Rect iX+icX, iY+icY, StringWidth(scText), FontHeight()*fLineSpace
EndIf
Color iRed, iGreen, iBlue
Text iX+icX, iY+icY, scText$

icX = icX + StringWidth(scText$)
scText = ""

If Mid(sText, iPos+2, 2) = "-1"
iRed = iRedO
iGreen = iGreenO
iBlue = iBlueO
Else
iRed = HexB(Mid(sText, iPos+2, 2))
iGreen = HexB(Mid(sText, iPos+4, 2))
iBlue = HexB(Mid(sText, iPos+6, 2))
EndIf

sText = Left(sText, iPos)+Mid(sText, iPos+8)
ElseIf sChar = "|" And Mid(sText, iPos+1, 1) = "b" ;Background Change
If iBGRed > -1 And iBGGreen > -1 And iBGBlue > -1
Color iBGRed, iBGGreen, iBGBlue
Rect iX+icX, iY+icY, StringWidth(scText), FontHeight()*fLineSpace
EndIf
Color iRed, iGreen, iBlue
Text iX+icX, iY+icY, scText$

icX = icX + StringWidth(scText$)
scText = ""

If Mid(sText, iPos+2, 2) = "-1"
iBGRed = -1
iBGGreen = -1
iBGBlue = -1
Else
iBGRed = HexB(Mid(sText, iPos+2, 2))
iBGGreen = HexB(Mid(sText, iPos+4, 2))
iBGBlue = HexB(Mid(sText, iPos+6, 2))
EndIf
sText = Left(sText, iPos)+Mid(sText, iPos+8)
Else
scText$ = scText$ + sChar$
iRealPos = iRealPos + 1
EndIf

If iPos = Len(sText)
If iBGRed > -1 And iBGGreen > -1 And iBGBlue > -1
Color iBGRed, iBGGreen, iBGBlue
Rect iX+icX, iY+icY, StringWidth(scText), FontHeight()*fLineSpace
EndIf
Color iRed, iGreen, iBlue
Text iX+icX, iY+icY, scText
scText = ""
EndIf
Next
scText$ = ""
Next
End Function

Function HexB#(Hexzahl$)
Local Integer_Result#
If Left$(Hexzahl$,1)="$" Then Hexzahl$=Mid$(Hexzahl$,2)
For i=1 To Len(Hexzahl$)
tmp1$=Upper$(Mid$(Hexzahl$,i,1)):tmp2=tmp1$
If tmp2=0 And tmp1$<>"0" Then tmp2=Asc(tmp1$)-55
Integer_Result=Integer_Result*16:Integer_Result=Integer_Result+tmp2
Next
Return Integer_Result
End Function

Function SplitString(In$, StringSplitter$ = "|")
Local Pos,Ch$,All$
SplitCount = 0
For I = 1 To Len(In)
Ch = Mid(In,I,1)
If Ch = StringSplitter Then SplitCount = SplitCount + 1
Next
Dim SplittedString(SplitCount)
SplitCount = 0
While Not Pos = Len(In)
Pos = Pos + 1
Ch = Mid(In,Pos,1)
If Ch = StringSplitter Or Pos = Len(In)
If Pos = Len(In) And Ch <> StringSplitter Then All = All+Ch
SplittedString(SplitCount) = All
All = ""
SplitCount = SplitCount + 1
Else
All = All+Ch
EndIf
Wend
End Function


Beispiel:
BlitzBasic: [AUSKLAPPEN]
Global sTestTxt$
sTestTxt$ = sTestTxt$ + "|fFF0000H|fFF7E00a|fFFFF00l|f7EFF00l|f00FF00o |f00FF7EW|f00FFFFe|f007EFFl|f0000FFt|f7E00FF!|fFF00FF!|fFF007E!"+Chr(10)
sTestTxt$ = sTestTxt$ + Chr(10)
sTestTxt$ = sTestTxt$ + "|fFFFFFFDies ist ein Text der |fFF0000Rot |f00FF00Grün |fFFFFFFund |f0000FFBlau |fFFFFFFist." + Chr(10)
sTestTxt$ = sTestTxt$ + "|f33FF33Man kann alle mögli|f0000FFchen Farben machen!" + Chr(10)
sTestTxt$ = sTestTxt$ + "|f000000|bFF0000Sogar|b-1-1-1 |bFF7E00der|b-1-1-1 |bFFFF00Hinter|b7EFF00grund|b-1-1-1 |b00FF00kann|b-1-1-1 |b00FF7Egesetzt|b-1-1-1 |b00FFFFwerden|b-1-1-1!" + Chr(10)
sTestTxt$ = sTestTxt$ + "|fAAAAFF|b-1-1-1Dies kann für mehr|f444400|bAAAAFFzeilige Selektion|fAAAAFF|b-1-1-1 verwendet werden!" + Chr(10)
sTestTxt$ = sTestTxt$ + "|fFFFFFFD|fFF7E00amit wäre der |b7E7E7E|fFFFFFFB|fFF7E00eispieltext|b-1-1-1 beendet|fFFFFFF!"

Graphics 400,300,32,2
SetBuffer BackBuffer()

Global timer = CreateTimer(30)

While Not KeyHit(1)
Cls
AdvText(200,150, sTestTxt, MouseX()/200.0, MouseY()/150.0, 1)

Flip 0
WaitTimer timer
Wend

Include "AdvText.bb"
  • Zuletzt bearbeitet von Xaymar am So, Feb 09, 2014 0:54, insgesamt 6-mal bearbeitet

Xaymar

ehemals "Cgamer"

BeitragMi, Aug 15, 2012 3:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Neue Funktionen hinzugefügt:
  • Funktionsname in AdvText geändert.
  • Tabulatoren werden nun erkannt: Horizontale Tabulatoren erzeugen einen Tabstopp von 4 Spaces, Vertikale einen von 8 Spaces.
  • Die Vordergrundfarbe und Hintergrundfarbe sind nun einzeln regelbar: "|fRRGGBB" regelt VG und "|bRRGGBB" regelt HG.


Habe wieder mit Blitz3D angefangen um PoC's zu erstellen und brauchte eine Textfunktion mit Hintergrund und Tabulatoren. Viel Spaß hiermit Smile
Es wäre möglich sogar die Mausposition im Text herauszufinden, sofern Ich die Funktion darauf abänder jeden Buchstaben einzeln anzuzeigen.

Edit: Bug behoben der bei Tabs am Ende einer Zeile die Zeile nicht anzeigt.
Edit2: Funktion benutzt nun SplitString aus meiner Fixes Library(hier im CodeArchiv zu finden) und Bug mit Tabs behoben welche diese falsch darstellt bei anderer horizontaler Ausrichtung als "Links".
Warbseite

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group