Habe nachgeschaut ob es jemand schon versucht hat eine scrollbare Textbox im Screen zu erstellen und dazu kein Beitrag gefunden.
Es sollte eine Textbox sein die einen beliebigen Text enthält der automatisch umbricht und dazu scrollbar wäre(clipped?). Hat dazu jemand eine Idee wie man dieses für ein 2D Chat bauen könnte?
Hintergrund: Habe einen Screen der eine einfache GUI erstellt aber kriege das mit dem Text einfach nicht hin.
Hoffe ihr habt ideen dazu.
scrollbare Textbox im Screen
Re: scrollbare Textbox im Screen
gut, also das Scrollen an sich sollte nicht schwer sein.
Einfachste Variante:
Du erstellst ein Sprite mit dme gesamten Chat-Verlauf, und Clipst ihn genau da wo die Scrollleite steht, beim "bewegen" wird dann einfach der ClipBereich geändert.
Zum Zeilenumbruch selber:
Du übergibst deinen kompletten Chat-Verlauf als String einer Procedure.
Diese zerteilt ihn in Wörter (spatet auso bei Leerzeichen oder echten zeilenumbrüchen) (StringField)
Nun wird stück für stück jedes Wort wieder zusammen gesetzt und dabei immer geguckt ob die TextBreite noch in die Box passt (TextWidth).
Wenn ja komtm einweiteres Word dazu, ansonsten wird die Zeile "abgeschlossen" und n neue begonnen.
Falls ein ganzes Word länger ist als die Zeilenbreite, muss es irgendwo getielt werden.
Außer du baust noch n Silbentrennung ein ...
Einfachste Variante:
Du erstellst ein Sprite mit dme gesamten Chat-Verlauf, und Clipst ihn genau da wo die Scrollleite steht, beim "bewegen" wird dann einfach der ClipBereich geändert.
Zum Zeilenumbruch selber:
Du übergibst deinen kompletten Chat-Verlauf als String einer Procedure.
Diese zerteilt ihn in Wörter (spatet auso bei Leerzeichen oder echten zeilenumbrüchen) (StringField)
Nun wird stück für stück jedes Wort wieder zusammen gesetzt und dabei immer geguckt ob die TextBreite noch in die Box passt (TextWidth).
Wenn ja komtm einweiteres Word dazu, ansonsten wird die Zeile "abgeschlossen" und n neue begonnen.
Falls ein ganzes Word länger ist als die Zeilenbreite, muss es irgendwo getielt werden.
Außer du baust noch n Silbentrennung ein ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: scrollbare Textbox im Screen
Pseudo
Für automatischen Umbruch musst die Länge des Textes ermitteln (Hilfe: Drawing-Lib) und dann den Text am letzten Leerzeichen splitten wenn die Textlänge größer als die Boxbreite ist.
Und auch darauf achten, dass ein Wort länger sein kann als die Box breit ist. Dann musst halt mittendrin umbrechen.
Trennen geht mit StringField() und das Ergebnis speicherst du dann in das Array zeile().
Code: Alles auswählen
Dim zeile.s(5)
zeile(1) = "Hallo, das ist"
zeile(2) = "ein kleiner"
zeile(3) = "Chat im"
zeile(4) = "2D-Screen"
zeile(5) = ""
zeile(6) = "(c) medor"
Global anzahl_der_zeilen.i = 3
Procedure EchoText(zeile.i)
zeilenhoehe.i = 30
For k = zeile To (zeile + anzahl_der_zeilen)
DrawText(x, y + k*zeilenhoehe, zeile(k))
Next
EndProcedure
Repeat
EchoText(startzeile)
If MouseScrollUp
startzeile-3
ElseIf MouseScrollDown
startzeile+3
Endif
If startzeile<=0
startzeile = 1
ElseIf startzeile>ArraySize(zeile())-1
startzeile = ArraySize(zeile()) - anzahl_der_zeilen
Forever Und auch darauf achten, dass ein Wort länger sein kann als die Box breit ist. Dann musst halt mittendrin umbrechen.
Trennen geht mit StringField() und das Ergebnis speicherst du dann in das Array zeile().
Re: scrollbare Textbox im Screen
Super, vielen lieben Dank! Werde das mit euren Anleitungen versuchen es hinzukriegen und dieses dann hier veröffentlichen.
Re: scrollbare Textbox im Screen
Habe noch Probleme das manche Wörter wiederholt werden und der ganze Text irgendwie nicht gerendert wird.
Vielleicht sieht jemand den Fehler.
EDIT: habe den Fehler gefunden. Hier der funktionierende Code für Text mit auto Zeilenumbruch:
Hat jemand eine Idee wie man den Sprite vergössern kann abhängig von den Text Zeilen die geredert werden müssen ?
Wie wird das in Spielen mit dem Text gemacht eigentlich? In einem Spiel ist der Text ja selektierbar, also kann er nicht mit den üblichen Methoden einfach auf dem Screen draufgezeichnet werden.
Vielleicht sieht jemand den Fehler.
EDIT: habe den Fehler gefunden. Hier der funktionierende Code für Text mit auto Zeilenumbruch:
Hat jemand eine Idee wie man den Sprite vergössern kann abhängig von den Text Zeilen die geredert werden müssen ?
Wie wird das in Spielen mit dem Text gemacht eigentlich? In einem Spiel ist der Text ja selektierbar, also kann er nicht mit den üblichen Methoden einfach auf dem Screen draufgezeichnet werden.
Code: Alles auswählen
InitSprite()
InitKeyboard()
InitMouse()
Global NewList wordList.s()
Global testText.s = "Lorem ipsum dolor sit amet, "+ Chr(13) + "consetetur sadipscing elitr," + Chr(13) + "sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat," + Chr(13) + " ende des satzes."
#LINE_BREAK = "###LB###"
Procedure generateSplitedText(text.s)
text = text + Chr(13)
textLines = CountString(text, Chr(13))
currentLine.s = ""
If textLines > 0
For line = 1 To textLines Step 1
words.l = CountString(StringField(text, line, Chr(13)), " ") + 1
If words > 0
For word = 1 To words Step 1
AddElement(wordList())
wordList() = StringField(StringField(text, line, Chr(13)), word, " ")
Next
Else
Debug("No words !")
EndIf
AddElement(wordList())
wordList() = #LINE_BREAK
Next
Else
searching = #False
EndIf
ProcedureReturn textLines
EndProcedure
Procedure generateTextBox(width.l, height.l)
CreateSprite(4, width, height)
generateSplitedText(testText)
If ListSize(wordList()) > 0
counter.l = 0;
textContainer.s = ""
tempText.s = ""
currentHeight.l = 0
If StartDrawing(SpriteOutput(4))
DrawingMode(#PB_2DDrawing_Outlined)
Box(0, 0, width, height, RGB(0, 255, 0))
width = width - 1
height = height -1
ForEach wordList()
If wordList() = #LINE_BREAK
If Len(textContainer) > 0
currentHeight = counter * TextHeight(textContainer)
DrawText(1, currentHeight + 1, textContainer, RGB(255, 255, 255))
textContainer = ""
EndIf
counter = counter +2
Continue
EndIf
tempText = textContainer + wordList() + " "
If TextWidth(tempText) < width
textContainer = tempText
Else
currentHeight = counter * TextHeight(textContainer)
DrawText(1, currentHeight + 1, textContainer, RGB(255, 255, 255))
textContainer = wordList() + " "
counter = counter +1
If currentHeight > height
Debug("abbruch Zeile" + Str(counter))
ProcedureReturn
EndIf
EndIf
Next
currentHeight = counter * TextHeight(textContainer)
DrawText(1, currentHeight + 1, textContainer, RGB(255, 255, 255))
StopDrawing()
EndIf
EndIf
EndProcedure
Procedure run()
If OpenWindow(0, 0, 0, 1024, 768, "1st App", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 1024 ,768 , 0, 0, 0, #PB_Screen_WaitSynchronization)
generateTextBox(200, 400)
Repeat
ExamineKeyboard()
ExamineMouse()
FlipBuffers()
ClearScreen(0)
DisplaySprite(4, 1, 1)
; Delay(100)
Until KeyboardPushed (#PB_Key_Escape)
EndIf
EndProcedure
run()
- Falko
- Admin
- Beiträge: 3535
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
Re: scrollbare Textbox im Screen
Kaeru hatte vor längerer Zeit mal sowas programmiert:
http://www.purebasic.fr/english/viewtopic.php?t=28597
Gruß Falko
http://www.purebasic.fr/english/viewtopic.php?t=28597
Gruß Falko
