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.
Hinweis: Diese Funktion nutzt eine Dim, da ich es nicht geschafft habe, Blitzarrays dynamisch neuzuerstellen.
Code:
BlitzBasic: [AUSKLAPPEN] [EINKLAPPEN] 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 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 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 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 If (AdvText_Width < StringWidth(sTextLines(iLine,1))) Then AdvText_Width = StringWidth(sTextLines(iLine,1)) Next If (AdvText_Height < (FontHeight()*(iTextLines+1)*fLineSpace)) Then AdvText_Height = (FontHeight()*(iTextLines+1)*fLineSpace) Local iRedO = ColorRed(), iGreenO = ColorGreen(), iBlueO = ColorBlue() Local iRed = ColorRed(), iGreen = ColorGreen(), iBlue = ColorBlue() Local iBGRed = -1, iBGGreen = -1, iBGBlue = -1 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) ) 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" 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" 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] [EINKLAPPEN] 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"
|