Stringeingabe in Sprite

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
blbltheworm
Beiträge: 217
Registriert: 22.09.2004 19:36
Wohnort: Auf der schönen Schwäbischen Alb

Stringeingabe in Sprite

Beitrag von blbltheworm »

Hallo zusammen,
der folgende Code dient dazu einen Text in ein Sprite einzugeben.
Mit initDXKey() werden alle wichtigen Einstellung gesetzt.
Mit GetText() wird dann das aktuelle Zeichen zum Text hinzugefügt.
WICHTIG!!
vor GetText() muss ExamineKeyboard() aufgerufen werden.

Code: Alles auswählen

Structure sRGB
  R.w
  G.w
  b.w
EndStructure

#gfxText=194
Global IDFont.l
Global FontHeight.w
Global FontName.s
Global Flags.l
Global FontColor.sRGB
Global TransColor.sRGB
Global FullText.s
Global LengthText.w

  Procedure initDXKey(iFontName.s,iHeight.w,MaxLength.w,iFlags.w,R.w,G.w,b.w, tR.w,tG.w,tB.w)
    Flags=iFlags
    FontHeight=iHeight
    FontName=iFontName
    LengthText=MaxLength ;Maximale Länge des Textes in Pixeln
    IDFont=LoadFont(#PB_Any,iFontName,iHeight,iFlags)    
    FontColor\R=R
    FontColor\G=G
    FontColor\b=b
    TransColor\R=tR
    TransColor\G=tG
    TransColor\b=tB
    CreateSprite(#gfxText,LengthText,FontHeight*1.6,0) ;Funktioniert zwar, ist aber noch nicht ideal
    TransparentSpriteColor(#gfxText,tR,tG,tB)
  EndProcedure
  

  Procedure GetText()
    tmpChr.s
    Static Blink.b
    Static NextbTick.l
;      If KeyboardPushed(#PB_Key_All)
        tmpChr=KeyboardInkey()
        If  KeyboardPushed(#PB_Key_LeftShift) Or KeyboardPushed(#PB_Key_RightShift)
          tmpChr=ReplaceString(tmpChr,"^","°")
          tmpChr=ReplaceString(tmpChr,"1","!")
          tmpChr=ReplaceString(tmpChr,"2",Chr(34)) ;"
          tmpChr=ReplaceString(tmpChr,"3","§")
          tmpChr=ReplaceString(tmpChr,"4","$")
          tmpChr=ReplaceString(tmpChr,"5","%")
          tmpChr=ReplaceString(tmpChr,"6","&")
          tmpChr=ReplaceString(tmpChr,"7","/")
          tmpChr=ReplaceString(tmpChr,"8","(")
          tmpChr=ReplaceString(tmpChr,"9",")")
          tmpChr=ReplaceString(tmpChr,"0","=")
          tmpChr=ReplaceString(tmpChr,"ß","?")
          tmpChr=ReplaceString(tmpChr,"´","`")
          tmpChr=ReplaceString(tmpChr,"<",">")
          tmpChr=ReplaceString(tmpChr,",",";")
          tmpChr=ReplaceString(tmpChr,".",":")
          tmpChr=ReplaceString(tmpChr,"-","_")
          tmpChr=ReplaceString(tmpChr,"#","'")
          tmpChr=ReplaceString(tmpChr,"+","*")
          tmpChr=ReplaceString(tmpChr,"ä","Ä")
          tmpChr=ReplaceString(tmpChr,"ö","Ö")
          tmpChr=ReplaceString(tmpChr,"ü","Ü")
        ElseIf  KeyboardPushed(#PB_Key_RightAlt); [Alt Gr]
          tmpChr=ReplaceString(tmpChr,"<","|")
          tmpChr=ReplaceString(tmpChr,"2","²")
          tmpChr=ReplaceString(tmpChr,"3","³")
          tmpChr=ReplaceString(tmpChr,"7","{")
          tmpChr=ReplaceString(tmpChr,"8","[")
          tmpChr=ReplaceString(tmpChr,"9","]")
          tmpChr=ReplaceString(tmpChr,"0","}")
          tmpChr=ReplaceString(tmpChr,"ß","\")
          tmpChr=ReplaceString(tmpChr,"+","~")
          tmpChr=ReplaceString(tmpChr,"m","µ")
          tmpChr=ReplaceString(tmpChr,"q","@")  
        EndIf 
        
        If  KeyboardReleased(#PB_Key_LeftShift) Or KeyboardReleased(#PB_Key_RightShift) Or KeyboardReleased(#PB_Key_RightAlt)
          tmpChr=""
        EndIf
        
        FullText=FullText+tmpChr; fügt das nächste Zeichen zum aktuellen Text (sofern vorhanden) hinzu
        
        tmpChr=""
      ; Wenn wir die 'Backspace'-Taste drücken, löschen wir das letzte Zeichen 
      ; 
        If KeyboardReleased(#PB_Key_Back)  
          FullText = Left(FullText, Len(FullText)-1) 
        EndIf 
;      Else
;        Delay(1)
;      EndIf

      ; Ergebnis darstellen 
      ; 
      If StartDrawing(SpriteOutput(#gfxText))
      ;CreateSprite(#gfxText,TextLength(FullText$),FontSize)
        
        Box(0,0,SpriteWidth(#gfxText),SpriteHeight(#gfxText),RGB(TransColor\R,TransColor\G,TransColor\b))
        DrawingMode(1)
        BackColor(TransColor\R,TransColor\G,TransColor\b)
        DrawingFont(UseFont(IDFont))
        

        While TextLength(FullText)>LengthText
          FullText = Left(FullText, Len(FullText)-1)
        Wend
        
        FrontColor(FontColor\R, FontColor\G, FontColor\b) 
        Locate(0,0) : DrawText(FullText) 
        Box(TextLength(FullText),2,3*Blink,(FontHeight*1.6-2)*Blink)
        
        If NextbTick<ElapsedMilliseconds()
          NextbTick=ElapsedMilliseconds()+500
          Blink=1-Blink
        EndIf
        
        StopDrawing() 
      EndIf 
  EndProcedure
Wenn ihr was besser machen würdet lasst es mich wissen.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1755
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Damit dieser Code auch in einem Beispiel erstmal genutzt werden kann, habe ich auf die schnelle mal noch einen Code zusammengezimmert, der lediglich nach diesen bereits geposteten Proceduren eingefügt werden muss:

Code: Alles auswählen

If InitSprite() And InitKeyboard() : Else : End : EndIf
ExamineDesktops() 
If OpenScreen(DesktopWidth(0),DesktopHeight(0),DesktopDepth(0),"") : Else : End : EndIf

initDXKey("Arial",16,300,#PB_Font_Bold, 255, 50, 50, 100, 100, 200)

Repeat 
  FlipBuffers() 
  ClearScreen(0,0,0)
  ExamineKeyboard() 
  GetText()
  DisplaySprite(#gfxText,20,20)
  If KeyboardPushed(#PB_Key_Escape)   ; drücken Sie Esc zum Beenden 
    End 
  EndIf 
ForEver 
Ist möglicherweise nicht der 100% saubere Code, aber ich bin auch nicht so der DirectX/Sprite/3D-Programmierer.... :wink:

Damit zeigt sich die recht gute Anwendbarkeit von 'blbltheworm's Code, also Kompliment :)

Was noch verbessert werden sollte, ist die Steuerung mit den Cursor-Tasten im Text (momentan wird einfach das erste Zeichen nochmal angefügt) und evtl. die Reaktionsgeschwindigkeit + Unterstützung für gedrückt gehaltene Tasten.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
blbltheworm
Beiträge: 217
Registriert: 22.09.2004 19:36
Wohnort: Auf der schönen Schwäbischen Alb

Beitrag von blbltheworm »

*schluck*
Bevor ich es schaffe soetwas zu meistern erst ein anderes Problem:
Wenn ich z.B. als FontSize 20 angebe reicht ein Sprite mit der Höhe 20 nicht. Es gibt irgendwie auch keine Möglichkeit heraus zu bekommen, wie hoch das Sprite letztendlich sein muss.
Die jetzige Lösung mit dem FontHeight*1.6 ist nur eine Notlösung, die nicht mit alle Schriftarten funktioniert.
Deshalb hoffe ich vorallem bei diesem Problem auf Verbesserungsvorschläge.

@Andre:
Da ich aus der VB-Ecke komme und den OOP Ansatz mit Klassen und Modulen noch mehr oder weniger im Blut habe würde ich die Funktion + ihre Variablen/Konstanten eher in eine selbstständige *.pb packen und als Include einbinden.
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Benutzeravatar
blbltheworm
Beiträge: 217
Registriert: 22.09.2004 19:36
Wohnort: Auf der schönen Schwäbischen Alb

Beitrag von blbltheworm »

Oha,
dankeschön
Antworten