Seite 1 von 1

scrollbare Textbox im Screen

Verfasst: 19.03.2010 18:51
von medor
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.

Re: scrollbare Textbox im Screen

Verfasst: 19.03.2010 19:08
von STARGÅTE
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 ...

Re: scrollbare Textbox im Screen

Verfasst: 19.03.2010 19:20
von TomS
Pseudo

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 
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().

Re: scrollbare Textbox im Screen

Verfasst: 19.03.2010 19:45
von medor
Super, vielen lieben Dank! Werde das mit euren Anleitungen versuchen es hinzukriegen und dieses dann hier veröffentlichen.

Re: scrollbare Textbox im Screen

Verfasst: 19.03.2010 21:15
von medor
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.

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()


Re: scrollbare Textbox im Screen

Verfasst: 20.03.2010 13:26
von Falko
Kaeru hatte vor längerer Zeit mal sowas programmiert:

http://www.purebasic.fr/english/viewtopic.php?t=28597

Gruß Falko