input routinen sammlung <- Niclas Input UPDATE: v. 1.52 von ??? |
[b:c20b0a1529][u:c20b0a1529]HIER KANN JEDER JA MAL SEINE INPUTS POSTEN[/u:c20b0a1529][/b:c20b0a1529] ...wenn er denn möchte. Jeder kann sich sein bestes dann ja rauspicken... falls ihr bugs findet posten falls noch fragen sind (was wohl klar ist weil ich mich beim erkären der parameter nicht so viel mühe gegeben hab) [code:1:c20b0a1529] ;input v. 1.52 ;(c)2003 by Niclas Hoyer ;GLOBALS-------------------------------------- Global txt2$ Global blinker=MilliSecs() Global blink=1 Global b2 Global pos Global blinkalpha Global doud Global doud2 Global a2 Global wiederholzeit = MilliSecs() Global wiederholzeit2 = MilliSecs() ;--------------------------------------------- ;-----BEISPIEL--------------------- Graphics 640,480,32,1 SetBuffer BackBuffer() img=LoadImage("test.bmp") While Not MouseDown(1) Cls TileImage img,MouseX(),MouseY() Color 0,255,0 ;Input aufruf input2(100,100,"Test:") ;------------ Text 100,120,txt2$ ;fps counter counter=counter+1 If time=0 Then time=MilliSecs() If time+1001 <MilliSecs() Then framerate=counter counter=0 time=MilliSecs() EndIf ;----------- Color 0,255,0 Text 200,200,framerate Flip Wend ;---------------------------------- ;-------------------------------------------------------------- ;x = x position ;y = y position ;txt$ = Frage vor input ;max = Maximale buchstaben (0=unendlich) ;blinkertime = Millisekunden zeit des blinkers ;bcolor = die farbe die der buchstabe hat wenn der cursor über ihm ist ;blinkeralpha = Alphawert des blinkers 0=nicht sichtbar - 255=voll sichtbar -1 Blinked von vollsichtbar zu nichtsichtbar ;BAS = BlinkerAlphaSpeed Die Blinkgeschwindigkeit des alpha cursors (Nur wenn blinkeralpha auf -1 gesetzt ist!) ;wiederholung = die zeit in welchen abständen das zeichen wiederholt wird wenn man eine taste gedrückt hält. ;doppelhit = die zeit die man braucht damit wenn man eine taste so lange drückt das das zeichen immer weiter geht ;draw = ob etwas angezeigt werden soll (text + cursor) wenn draw = 0 ist wird nichts gezeichnet, falls man den text anders darstellen möchte. (txt2 ist die variable vom text) ;-------------------------------------------------------------- Function input2$(x,y,txt$,max=0,blinkerx=7,blinkertime=600,bcolor=$000000,blinkeralpha=255,BAS=3,doppelhit=400,wiederholung=35,draw=1) a=GetKey() FlushKeys For b=1 To 237 If KeyDown(b) Then Exit Next If b>237 Then b=0 If a2=add_getkey(a,b) Then a=0 If doud2=0 Then doud2=MilliSecs() If MilliSecs()-doud2 => doppelhit And MilliSecs()-wiederholzeit => wiederholung Then a=a2 wiederholzeit=MilliSecs() End If Else If a<>0 Then a2=a doud2=0 End If If b2=b Then b=0 If doud=0 Then doud=MilliSecs() If MilliSecs()-doud => doppelhit And MilliSecs()-wiederholzeit2 => wiederholung Then b=b2 wiederholzeit2=MilliSecs() End If Else If b<> 0 Then b2=b Else b2=0 doud=0 End If If Len(txt2$)<max Or max=0 Then If a>31 And a < 256 And b<>181 Then txt2$=fillstring$(txt2$,Chr$(a),pos):pos=pos+1 Select b Case 83 txt2$=fillstring$(txt2$,",",pos):pos=pos+1 Case 82 txt2$=fillstring$(txt2$,"0",pos):pos=pos+1 Case 79 txt2$=fillstring$(txt2$,"1",pos):pos=pos+1 Case 80 txt2$=fillstring$(txt2$,"2",pos):pos=pos+1 Case 81 txt2$=fillstring$(txt2$,"3",pos):pos=pos+1 Case 75 txt2$=fillstring$(txt2$,"4",pos):pos=pos+1 Case 76 txt2$=fillstring$(txt2$,"5",pos):pos=pos+1 Case 77 txt2$=fillstring$(txt2$,"6",pos):pos=pos+1 Case 71 txt2$=fillstring$(txt2$,"7",pos):pos=pos+1 Case 72 txt2$=fillstring$(txt2$,"8",pos):pos=pos+1 Case 73 txt2$=fillstring$(txt2$,"9",pos):pos=pos+1 Case 181 txt2$=fillstring$(txt2$,"/",pos):pos=pos+1 End Select End If Select b Case 211 If pos<Len(txt2$) Then txt2$=delstring$(txt2$,pos+1) Case 203 If pos>0 Then pos=pos-1 Case 205 If pos<Len(txt2$) Then pos=pos+1 Case 199 pos=0 Case 207 pos=Len(txt2$) End Select c=StringWidth(txt$) d=StringWidth(txt2$) x2=x+c If MilliSecs()-blinker => blinkertime And blinkerx>0 Then blinker=MilliSecs() blink=1-blink End If If b<>0 Or a<>0 Then blink=1:blinker=MilliSecs() x3=x2+StringWidth(Left$(txt2$,pos)) txt2b$=replace2$(txt2$," ",pos+1) txt2cx=x+StringWidth(Left$(txt2$,pos))+StringWidth(txt$) If draw=1 Then fr=ColorRed() fg=ColorGreen() fb=ColorBlue() fkr=(bcolor And $FF0000)/$10000 fkg=(bcolor And $FF00)/$100 fkb=bcolor And $FF If blink=1 Or blinkeralpha<0 Then If blinkeralpha=255 Then Rect x3+1,y,blinkerx,FontHeight():Color fkr,fkg,fkb: Text txt2cx,y,Mid$(txt2$,pos+1,1) If blinkeralpha>0 And blinkeralpha<255 Then alpharect(x3+1,y,blinkerx,FontHeight(),fr,fg,fb,blinkeralpha) If blinkeralpha<0 Then blinkalpha=blinkalpha-BAS If blinkalpha= -1 Then blinkalpha=255 alpharect(x3+1,y,blinkerx,FontHeight(),fr,fg,fb,blinkalpha) End If End If Color fr,fg,fb Text x,y,txt$ If blink=1 And blinkeralpha>-1 Then Text x2,y,txt2b$ Else Text x2,y,txt2$ End If If a=13 Then tx$=txt2$:txt2$="":pos=0:Return tx$ If a=8 And Len(txt2$)>0 And pos>0 Then txt2$=delstring$(txt2$,pos):pos=pos-1 If a=27 Then txt2$="":pos=0 End Function ;-------------------------------------------------------------- ;x = x position ;y = y position ;txt$ = Frage vor input ;max = Maximale buchstaben (0=unendlich) ;blinkertime = Millisekunden zeit des blinkers ;bcolor = die farbe die der buchstabe hat wenn der cursor über ihm ist ;blinkeralpha = Alphawert des blinkers 0=nicht sichtbar - 255=voll sichtbar -1 Blinked von vollsichtbar zu nichtsichtbar ;BAS = BlinkerAlphaSpeed Die Blinkgeschwindigkeit des alpha cursors (Nur wenn blinkeralpha auf -1 gesetzt ist!) ;draw = ob etwas angezeigt werden soll (text + cursor) wenn draw = 0 ist wird nichts gezeichnet, falls man den text anders darstellen möchte. (txt2 ist die variable vom text) ;-------------------------------------------------------------- Function input2_lite$(x,y,txt$,max=0,blinkerx=7,blinkertime=500,bcolor=$000000,blinkeralpha=255,BAS=3,draw=1) a=GetKey() FlushKeys For b=1 To 237 If KeyDown(b) Then Exit Next If b>237 Then b=0 If b2=b Then b=0 Else b2=b If Len(txt2$)<max Or max=0 Then If a>31 And a < 256 And b<>181 Then txt2$=fillstring$(txt2$,Chr$(a),pos):pos=pos+1 Select b Case 83 txt2$=fillstring$(txt2$,",",pos):pos=pos+1 Case 82 txt2$=fillstring$(txt2$,"0",pos):pos=pos+1 Case 79 txt2$=fillstring$(txt2$,"1",pos):pos=pos+1 Case 80 txt2$=fillstring$(txt2$,"2",pos):pos=pos+1 Case 81 txt2$=fillstring$(txt2$,"3",pos):pos=pos+1 Case 75 txt2$=fillstring$(txt2$,"4",pos):pos=pos+1 Case 76 txt2$=fillstring$(txt2$,"5",pos):pos=pos+1 Case 77 txt2$=fillstring$(txt2$,"6",pos):pos=pos+1 Case 71 txt2$=fillstring$(txt2$,"7",pos):pos=pos+1 Case 72 txt2$=fillstring$(txt2$,"8",pos):pos=pos+1 Case 73 txt2$=fillstring$(txt2$,"9",pos):pos=pos+1 Case 181 txt2$=fillstring$(txt2$,"/",pos):pos=pos+1 Case 203 If pos>0 Then pos=pos-1 Case 205 If pos<Len(txt2$) Then pos=pos+1 Case 199 pos=0 Case 207 pos=Len(txt2$) End Select End If c=StringWidth(txt$) d=StringWidth(txt2$) x2=x+c If MilliSecs()-blinker => blinkertime And blinkerx>0 Then blinker=MilliSecs() blink=1-blink End If If b<>0 Or a<>0 Then blink=1:blinker=MilliSecs() x3=x2+StringWidth(Left$(txt2$,pos)) txt2b$=replace2$(txt2$," ",pos+1) txt2cx=x+StringWidth(Left$(txt2$,pos))+StringWidth(txt$) If draw=1 Then fr=ColorRed() fg=ColorGreen() fb=ColorBlue() fkr=(bcolor And $FF0000)/$10000 fkg=(bcolor And $FF00)/$100 fkb=bcolor And $FF If blink=1 Or blinkeralpha<0 Then If blinkeralpha=255 Then Rect x3+1,y,blinkerx,FontHeight():Color fkr,fkg,fkb: Text txt2cx,y,Mid$(txt2$,pos+1,1) If blinkeralpha>0 And blinkeralpha<255 Then alpharect(x3+1,y,blinkerx,FontHeight(),fr,fg,fb,blinkeralpha) If blinkeralpha<0 Then blinkalpha=blinkalpha-BAS If blinkalpha= -1 Then blinkalpha=255 alpharect(x3+1,y,blinkerx,FontHeight(),fr,fg,fb,blinkalpha) End If End If Color fr,fg,fb Text x,y,txt$ If blink=1 And blinkeralpha>-1 Then Text x2,y,txt2b$ Else Text x2,y,txt2$ End If If a=13 Then tx$=txt2$:txt2$="":pos=0:Return tx$ If a=8 And Len(txt2$)>0 And pos>0 Then txt2$=delstring$(txt2$,pos):pos=pos-1 If a=27 Then txt2$="":pos=0 End Function Function fillstring$(strg1$,strg2$,posi) If posi<Len(strg1$) If posi>0 Then t1$=Left$(strg1$,posi) t2$=Right$(strg1$,Len(strg1$)-posi) Return t1$+strg2$+t2$ Else Return strg2$+strg1$ End If Else Return strg1$+strg2$ End If End Function Function delstring$(strg1$,posi) If posi>0 Then If posi<Len(strg1$) Then t1$=Left$(strg1$,posi) t2$=Right$(strg1$,Len(strg1$)-posi) If t1$<>"" Then Return Left$(t1$,Len(t1$)-1)+t2$ Else If strg1$<>"" Then Return Left$(strg1$,Len(strg1$)-1) End If End If End Function Function replace2$(strg1$,strg2$,posi) strg$ = delstring$(strg1$,posi) strg$ = fillstring$(strg$,strg2$,posi-1) lent=Len(strg1$) If posi>lent Or posi<1 Then Return strg1$ Else Return strg$ End Function Function alpharect(x,y,xplus, yplus,r,g,b,alpha) LockBuffer BackBuffer For xx = x To x + xplus For yy = y To y + yplus rgb = ReadPixelFast(xx,yy) read_rot = (rgb And $FF0000)/$10000 read_gruen = (rgb And $FF00)/$100 read_blau = rgb And $FF final_rot = read_rot + (alpha * (r - read_rot) / 255) final_gruen = read_gruen + (alpha * (g - read_gruen) / 255) final_blau = read_blau + (alpha * (b - read_blau) / 255) WritePixelFast xx,yy, final_rot * $10000 + final_gruen * $100 + final_blau Next Next UnlockBuffer BackBuffer End Function Function add_getkey(fga,fgb) If fgb<>0 And (fgb<>83 And fgb<>82 And fgb<>79 And fgb<>80 And fgb<>81 And (Not (fgb>74 And fgb<78)) And (Not (fgb>70 And fgb<74)) And fgb<>181 And fgb<>203 And fgb<>205 And fgb<>199 And fgb<>207 And (Not (fgb>58 And fgb<69)) And fgb<>208 And fgb<>200 And 1-(fgb=41 And fga=0) And fgb<>15 And fgb<>58 And 1-(fgb=42 And fga=0) And 1-(fgb=54 And fga=0) And fgb<>29 And fgb<>219 And fgb<>56 And fgb<>184 And fgb<>220 And fgb<>221 And fgb<>157 And fgb<>183 And fgb<>70 And fgb<>197 And (Not (fgb>208 And fgb<212)) And fgb<>201) Then If fga=0 Then Ret=a2 Else Ret=fga If a2=fga Then ret=0 Return ret End Function [/code:1:c20b0a1529] |
von ??? |
Hier mal ein (unvollständiges) Gegenbeispiel. file: test.bb [code:1:13a89729d7] Include "./inc/console.bb" Graphics 800,600,32,2 SetBuffer(BackBuffer()) While Not KeyHit(1) Cls() doKeyboard() doCon() clearKeyInput() Flip() Wend End [/code:1:13a89729d7] file: console.bb [code:1:13a89729d7] Include "./inc/input.bb" Include "./inc/stringlist.bb" Global showConCursor=True Global conCursorX=0 Global conCursorY=0 Global conCursorInterval=25 Global conCursorTime=0 Global conCursorVisible=True Global conCharWidth=8 Global conCharHeight=8 Global conMaxLines=100 Global conMaxLinesVisible=10 Global conMaxLinesX=20 Global conInputLine$="" Global conLines.stringList=New stringList Local tempString$="" Function drawCon() Text(conCursorY,0,conInputLine) If showConCursor Then If conCursorTime<conCursorInterval Then conCursorTime=conCursorTime+1 Else conCursorTime=0 conCursorVisible=Not conCursorVisible EndIf If conCursorVisible Then Text(conCursorX*conCharWidth,conCursorY*conCharHeight,"_") Else Text(conCursorX*conCharWidth,conCursorY*conCharHeight," ") EndIf EndIf End Function Function doCon() If inKey<>0 Then If inKey>31 And inKey<127 Then If conCursorX>=Len(conInputLine) Then conCursorX=conCursorX+1 conInputLine=conInputLine+Chr(inKey) Else tempString$=Mid$(conInputLine,1,conCursorX)+Chr$(inKey)+Mid$(conInputLine,conCursorX+1,Len(conInputLine)-conCursorX) conInputLine=tempString conCursorX=conCursorX+1 EndIf EndIf If KeyHit(203) And conCursorX>0 Then ;left conCursorX=conCursorX-1 EndIf If KeyHit(205) And conCursorX<Len(conInputLine) Then ;right conCursorX=conCursorX+1 EndIf If KeyHit(14) And conCursorX>0 Then ;backspace tempString$=Mid$(conInputLine,1,Len(conInputLine)-1) conInputLine=tempString conCursorX=conCursorX-1 EndIf EndIf drawCon() End Function Function conSetMaxLines(i) conMaxLines=i End Function Function conSetMaxLinesVisible(i) conMaxLinesVisible=i End Function [/code:1:13a89729d7] file: input.bb [code:1:13a89729d7] Global inKey=0 Function doKeyboard() inKey=GetKey() End Function Function clearKeyInput() inKey=0 End Function [/code:1:13a89729d7] Kann man sicher auch in eine Datei legen. Geschmackssache. Ich finde es so übersichtlicher. Was es bisher leistet (es wurde schnell angefangen und ebenso schnell wurde alle Bemühungen eingestellt ;))? Zeichen und Ziffern annehmen, Cursor links, rechts, Text einfügen. Des Rest ist sicher einfachst. |
Lob an(s) Wunderkind von ??? |
Hi! Sorry, dass ich jetzt kein Input poste... Ich wollte eigentlich nur ein Lob an(s) Wunderkind aussprechen. @Wunderkind Du hast einen wirklich guten opjektorientierten Codestil :-) Aber kommentiere ruhig mal ein bisschen mehr aus @alle Nehmt euch ein Beispiel an Wunderkind und programmiert auch mal so obejktorientiert, denn dann können andere Coder euren Code schneller lesen und verstehen. Mir geht es zumindest so. |
von ??? |
also ich möchte jetzt mal ein lob an niclas aussprechen, es gefällt mir sehr gut, das man diverse optionen übergeben kann, gefällt mir sogar so gut, das ich sie in meinen tileed eingebunden hab (hier mal ein alpha screen, wenns ein interessier:[url]http://mitglied.lycos.de/ojay2k2/tileed_alpha.png[/url] =)) aber ein bug hab ich noch gefunden: wenn man die maximale stringlänge eingegeben hat, kann man nicht mehr mit den cursortasten nach links/rechts navigieren, erst wenn man min. ein zeichen löscht, geht es wieder...aber eher ein unbedeutender bug ;) |
von ??? |
Kurz, einfach und meiner Meinung nach völlig ausreichen für alle Eingabefelder in Spielen: enter$ ist der String der eingegeben wird [code:1:df4bf52989] ;Eingabe ; Function e_input() ; Local key ; key = GetKey() ; If key <> 14 Then enter$=enter$+Chr(key) ;Eingeben If KeyHit(14) And Len(enter$)>0 Then enter$ = LSet(enter$, Len(enter$)-1);Backspace End Function ; [/code:1:df4bf52989] Aber wenns mehr seien soll sind die anderen Routinen sehr gut! Gefallen mir beide |
von ??? |
Drück bei der Form mal auf Tabulator, oder Einfg, oder Entf, oder Pos1, oder Ende, oder BIld auf/ab, oder...... Mfg Sktaeboarder |
von ??? |
@Ojay: thx Ich wollte nur noch mal sagen: Ich weis sehr wohl das es einfacher gehen [b:daf5750124]könnte[/b:daf5750124] ich wollte aber einen Input der das kann was der normale bb input auch kann halt nur in echtzeit... |
von ??? |
@Mike Nike 5 Vielen Dank, ich nehme deinen Kommentar als Lob :). Die Struktur, bzw. das strukturiertere Vorgehen kommt sicherlich von meiner "Ursprungssprache" C++ ;). Zur Auskommentierung: tja, war ursprünglich einmal zur Eigennutzung gedacht. Aber dank des einfachen Stils, scheinst du es ja auch so verstanden zu haben :). Das sollte das Ziel vieler Quellcodes sein, denn eines Tages ist man seines eigenen Codes fremder Feind ;). Je einfacher die Struktur, desto besser. Das beginnt mit simplen Einrückungen..ohne mir ein Selbstlob aufzutischen, denn es gibt weitaus besseren Code :). Merry XMas. |
von ??? |
so hab jetzt den bug behoben und noch eine funktion eingebaut: Wenn man auf Entf drückt löscht er die zeichen vor dem cursor... (ich komme dem bb input immer näher :o ) edit: inpu2t_lite hinzugefügt. Diese function erkennt kein längerhalten der taste was glaub ich viel schneller ist. Und parameter "draw" hinzugefügt. Wenn draw = 0 ist dann wird nichts gezeigt und nur text erkannt für die die den text anders anzeigen möchten. ACHSO: ich nehme den download wieder raus weil sich das irgendwie nicht updaten lässt... (misst :x ) |
von ??? |
hhmm...weiß jetzt net, ob es schon einem aufgefallen is, oder ob ich nen fehler gemacht hab...aber kann es sein, das die funktion den string NICHT zurückgibt? :shock: das ist mein funktionsaufruf: [code:1:5b12ca9970] Global txt2$,blinker=MilliSecs(),blink=1,b2,pos,blinkalpha,doud,doud2,a2 SetBuffer BackBuffer() Repeat eingabe=input2$(10,10,"") If eingabe<>0 Then Color 255,255,255 : Text 10,30,eingabe Flip Cls Until KeyHit(1) End [/code:1:5b12ca9970] wie gesagt, berichtigt mich, aber bei mir returned der nischt :( |
von ??? |
[code:1:8f43164a07] eingabe$ = Input2$(...) [/code:1:8f43164a07] eingabe[b:8f43164a07]$[/b:8f43164a07] <-- :!: außerdem gibt die function erst einen string zurück wenn man auf enter drückt. Wenn du ständig den text haben willst mach so: [code:1:8f43164a07] eingabe$=txt2$ [/code:1:8f43164a07] |
von ??? |
mit enter bestätigen war mir scho klar...ich hab mir deinen code ja auch genau angesehn, bevor ich was gesagt habe... dieser schusselfehler, das ich vergesse eine variable als string zu deklarieren, is mir schon zum zweiten mal passiert! bb machts einem aber auch einfach das zu vergessen =) trotzdem kein grund gleich gehässig zu werden...ich bin auch nur ein mensch, ein gestresster dazu :p nichts desto trotz is deine input immernoch spitze ;) |
von ??? |
danke, hät nicht gedacht das so ein massiger code irgendeinem gefällt :lol: Nur das ziel war, das man ihn genauso wie den bb input anwenden kann, nur so das er da prog nicht anhält. (Was ja auch gut gelnugen ist) ja es stimmt bb macht es einfach... nicht wie in vb wo man deklarieren kann. Wenn das in bb ginge (oder noch besser: MAn deklariert bestimmte variablem und alle die ganz ähnlich sind werden markiert z. B. ich deklariere "zeit" und ich vertippr mich in "zeitz" (t ist neben z also realistisch 8) ) und das wir rot markiert.) |
von ??? |
version 1.4... es gibt einen neuen parameter: "wiederholung". er gibt an wie oft bei gedrückter taste das zeichen wiederholt wird. Mir war das wiederholen des zeichens bei jedem durchgang zu schnell... |
von ??? |
version 1.5... bug behoben, mit dem parameter "wiederholung". Mit dem parameter funzten die scancodes nicht mehr... |
von ??? |
version 1.51... Der Cursor blinkt jetzt nicht mehr wenn man schreibt. Das hat den vorteil das man immer weis wo man ist beim schreiben. Ist bei jedem anderem input auch so... |
von ??? |
Ich hab meinen input eben auf b+ getestet, und lief soweit j auch, aber die tastenerkennung läuft überhauptnicht korekt... Testet das ding mal in b+! bitte! ist mit den befehlen in b+ keydown/keyhit/getkey ist da irgendwas anders als wie in bb2d/bb3d ? der input funzt in bb2d/bb3d perfekt... |
von ??? |
GETKEY() in BB+ wurde komplett umgeschrieben. So haben sich jetzt Cursortatsen geändert - und GetKEY() liefert endlich werte zurück, wenn man eine taste festhält - es ist jetzt so wie es immer sein sollte. Ich habe vor kurzem 2 kleine Fehler in GETKEY() gefunden - sollte demnächst korrigiert sein (Einfg/Entf/Pos1/Ende/Bild liefern falsche codes und ein weiterer verrückter fehler, den ich nur in meinem Programm gesehen habe und sonst nicht nachbauen kann). |
Re: Lob an(s) Wunderkind von ??? |
[quote="Mike Nike 5"]Ich wollte eigentlich nur ein Lob an(s) Wunderkind aussprechen. @Wunderkind Du hast einen wirklich guten opjektorientierten Codestil :-) Aber kommentiere ruhig mal ein bisschen mehr aus[quote] so code ich schon immer -.- @all: yay gute routinen ^^ weiter so |
von ??? |
ich hab von meiner auch schon eine version die in b+ funzt und nun endlich wieder einen "normalen" input darstellt... nur leider sind noch ein par bugs drinne, mal sehen... |
Neue Version... von ??? |
Nach langer langer zeit, wo ich diesen code wieder für mein game gebrauche, habe ich noch einen bug gefunden, man konnte keinee scancodetaste doppelt drücken, also v. 1.52 ist oben editiert... |