Input Total!

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

TheMatrix

Betreff: Input Total!

BeitragMi, Sep 27, 2006 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Sicherlich hat euch das auch schonmal genervt. Ihr wollt jemand seinen Namen in die Highscore eingeben und alles was Blitzbasic bietet is Input$(). Da findet auch noch alles über ein CMD Fenster statt und hält das ganze Programm an.

Da bietet mein kleines Prog hier abhilfe. Durch die Funktion Input2$(), kann der Spieler seinen Namen angeben. ohne das gleich das Game stockt. Diese Funktion untersüzt sämtliche Tasten wie Pos, Ende, entf, Backschift. Mit Umschalt kann ein Text mit den Pfeiltasten makiert und gelöscht werden. Das einzigste was nicht funzt, ist das man mit STRg+C nicht kopieren kann, weil ich nicht weiß wie der Befehl in BB+ lautet Laughing

Hier die Funktion und ihre Parameter:
input2$(start$, x,y, len)
- start$ : Ein Text der sofort an Input übermittelt wird und editiert werden kann.
- x : Xposition des Textes
- y : Yposition des Textes
- len : Die Maximale Länge des Textes.

Funktionen für input2$:
- setinputcolor(r,g,b)
- setmarkcolor(r,g,b) setzt die Makierungsfarbe
- setinputausnahme(n)
n = 1 ; Es können nur Zahlen geschrieben werden
n = 2 ; Es können nur Buchstaben verwendet werden

- setinputzeichen(a$,b$,c$,d$, e$, f$, g$, h$, i$, j$ )
Für a$ bis j$ können beliebige Zeichen angegeben die im Input verwendet werden fürfen
Wenn Zeichen im ASCII Format nacheinander stehen und die benutzt werden dürfen, dann kann zu vereinfachung auch z.B. a$="von ASCII bis ASCII" als Satz geschrieben werden. Diese Zeichen werden dann alle akzeptiert.

- add$(n$)
[color]Ein Einzelneszeichen für Input erlauben[/color]
- ClearInput$() Resettet Input und gibt den Eingabe String aus.

Der Code: [AUSKLAPPEN]

Graphics 640,480,16,2

Const key_back = 14, key_return = 28
Const key_up = 200, key_down = 208, key_right = 205, key_left = 203
Const key_pos = 199, key_entf = 211, key_end = 207, key_tab = 15
Const key_umschalt = 42

Gosub Initial_Input : Dim input_ausnahme$(255) : Global input_ausnahmen
setinputcolor(255,255,255) : setmarkcolor(100,100,100)
;setinputausnahme$(2)

max=2 : Dim eintrag$(max)
eintrag$(1)="Input1"
eintrag$(2)="Input2"
While Not KeyHit(1)
Cls

 mx=MouseX() : my =MouseY()

 x = 50 : y=20
 For a=1 To max
  st$ = eintrag$(a)
  If mx>=x And mx<x+StringWidth(st$) And my>=y And my<y+FontHeight()
   If MouseHit(1) Then eintrag$(wahl) = ClearInput$() : wahl = a
  End If

  If wahl=a Then st$=input2$(st$,x,y)
  Text x,y,st$ : y=y+20
 
 Next

 If KeyHit(key_tab)
  eintrag$(wahl) = clearinput$() : wahl=(wahl+1) : If wahl>max Then wahl=1
 End If

 If KeyDown(key_return) Then eintrag$(wahl) = clearinput$() : wahl=0
Flip
Wend

Function input2$(zu$,tx,ty, max_zeichen=255)

If zu$<>"" And input_ini=0 Then input_ini=1 : input_text$=zu$ : input_cursor=Len(zu$) : mark=1 : start_mark=0 : end_mark=Len(zu$)
st$ = input_text$ : cur = input_cursor
If mark=1
 dif=cur-start_mark
 end_mark=start_mark+dif
 If start_mark<end_mark Then start = start_mark : ende = end_mark Else start=end_mark : ende = start_mark
 If dif<0 Then dif=dif*-1
 If start>0
  x2 = StringWidth(Left$(st$,start))
  x3 = StringWidth(Mid$(st$,start,dif))
 Else
  x2 = 0
  x3 = StringWidth(Mid$(st$,1,dif))
 End If
 Color mark_color_r,mark_color_g,mark_color_b
 If dif<>0 Then Rect tx+x2,ty,x3,FontHeight()
End If

k = GetKey() : a$ = Chr$(k) : s = Len(st$)

ok=1
For i=1 To input_ausnahmen
 ok=0 : aa$ = input_ausnahme$(i)
 If Asc(aa$)=k Then ok=1 : Exit

Next


If k>=32 And k<255 And ok=1
 If mark=1 And dif<>0 Then st$=Left$(st$,start)+Right$(st$,Len(st$)-ende) : cur=start : mark=0
 If mark=1 And dif=0 Then mark=0
 If Len(st$)<max_zeichen
  If s>0 Then st$=Left$(st$,cur)+a$+Right$(st$,Len(st$)-cur) Else st$=a
 End If
 cur = cur+1
 key=1
End If

If MilliSecs()>=key_timer_input
key_timer_input=MilliSecs()+80
    If KeyDown(key_back)
     If ((mark=1 And dif=0) Or mark=0) And cur>0 Then st$ = Left$(st$,cur-1)+Right$(st$,Len(st$)-cur) : cur = cur-1 : mark=0
     If mark=1 And dif<>0 Then st$ = Left$(st$,start)+Right$(st$,Len(st$)-ende) : cur = start : mark=0
    End If
   If cur>0
    If KeyDown(key_left) Then cur=cur-1 : key=1
   End If

    If KeyDown(key_entf)
     If ((mark=1 And dif=0) Or mark=0) And s>0 And cur<s And mark=0 Then st$ = Left$(st$,cur)+Right$(st$,(Len(st$)-cur)-1) : mark=0 : key=1
     If mark=1 And dif<>0 Then mark=0 : st$=Left$(st$,start)+Right$(st$,Len(st$)-ende) : cur = start
    End If

   If cur<Len(st$) Then If KeyDown(key_right) Then cur=cur+1 : key=1
    If KeyDown(key_pos) Then cur=0 : key=1
    If KeyDown(key_end) Then cur=Len(st$) : key=1

    If KeyDown(key_umschalt)
     If mark=0 Then mark=1 : start_mark=cur
     umschalt=1
    Else
     If key=1 Then mark=0 : key=0
    End If : key=0
    If mark=0 Then start=0 : ende=0 : dif=0

End If


lx = StringWidth(Left$(st$,cur))
If MilliSecs()>=cursor_timer
 cursor_timer = MilliSecs()+250
 If cursor=1 Then cursor=0 Else cursor=1
End If

Color input_color_r, input_color_g, input_color_b
If cursor=1 Then Line tx+lx,ty,tx+lx,ty+FontHeight()
input_text$=st$ : input_cursor=cur
Text tx,ty,st$
Return st$
End Function

Function setmarkcolor(r,g,b)
 mark_color_r=r : mark_color_g=g : mark_color_b=b
End Function

Function setinputcolor(r,g,b)
 input_color_r=r : input_color_g=g : input_color_b=g
End Function

Function ClearInput$()
 st$ = input_text$ : mark=0 : input_cursor=0 : input_ini=0
 input_text$=""
 Return st$
End Function


Function setinputausnahme$(option)
 Select option
  ; nur Zahlen
  Case 1
   addinputzeichen("von 48 bis 57")
  ; Nur Buchstaben
  Case 2
   addinputzeichen("von 65 bis 90","von 97 bis 122","ä","Ä","ö","Ö","ü","Ü")
   add$("ß") : add$(" ")
 End Select
End Function

.Initial_Input

 Global key_timer_input, start_mark, end_mark, mark, cursor_timer, cursor, input_text$, input_cursor
 Global input_color_r, input_color_g, input_color_b, mark_color_r,mark_color_g,mark_color_b, input_ini

Return

Function addinputzeichen$(a$="",b$="",c$="",d$="",e$="",f$="",g$="",h$="",i$="",j$="")
 For var=1 To 10

  Select var
   Case 1 : st$ = a$
   Case 2 : st$ = b$
   Case 3 : st$ = c$
   Case 4 : st$ = d$
   Case 5 : st$ = e$
   Case 6 : st$ = f$
   Case 7 : st$ = g$
   Case 8 : st$ = h$
   Case 9 : st$ = i$
   Case 10 : st$ = j$
  End Select

  If st$<>""

   If Left$(st$,3)="von"
    For ascii = Mid(st$,5,3) To Right(st$,3)
     add$(Chr$(ascii))
    Next : Goto befehlistok
   End If
 
   add$(st$)
   
  Else
   Exit
  End If
 .befehlistok
 Next
End Function

Function add$(a$)
 i = input_ausnahmen+1
 input_ausnahmen = i
 input_ausnahme$(i)=a$
End Function
  • Zuletzt bearbeitet von TheMatrix am Mi, Okt 11, 2006 9:02, insgesamt 4-mal bearbeitet

Triton

BeitragMi, Sep 27, 2006 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Öfter mal was neues, hm?
Coding: silizium-net.de | Portfolio: Triton.ch.vu

PowerProgrammer

BeitragMi, Sep 27, 2006 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Schonwieder soeine Funktion...

Deine Funktion ist ja ganz nett, allerdings lässt sich nur 1 "input-Feld" erstellen... also noch ausbaufähig.
Es ist außerdem praktischer, wenn man den Standard-Farbbefehl von Blitz nutzen könnte, nicht dieser Umweg über die Spezialfunktion...
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!

TheMatrix

BeitragMi, Sep 27, 2006 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Tja, ich bin nur daran bedacht meinen Community-Mitgliedern so gut es geht zu helfen Wink
°_° °.° °~° °v° .. -.-

PowerProgrammer

BeitragMi, Sep 27, 2006 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
meinen Community-Mitgliedern

hört sich egoistisch an Wink

Aber es gibt wirklich schon genug Input-routinen. Wenn man wirklich eine benötigt, für ein Projekt, dann programmiert man sich die aber einfach mal kurz selber, da die dann optimierter ist. Solche Funktionen im Codearchiv sind dazu gut, den Anfängern Beispiele zu liefern. Zu viele müssens aber net sein, dann wird das Archiv noch unübersichtlicher Laughing

Naja, Kritik musste sein.
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!

TheMatrix

BeitragMi, Sep 27, 2006 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso, nur einmal benutzen? Du kannst input2$() sooft benutzen wie du willst. Mit ClearInput$() wird Input zurückgesezt und kann dann somit wiederverwendet werden Wink

EDIT:
Was meinst du mit optimiert? In dieser Funktion ist eigentlich alles was man braucht Wink

BladeRunner

Moderator

BeitragMi, Sep 27, 2006 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht um mehrere gleichzeitig benutzbare Inputfenster.
Und optimiert bezog sich auch sicher nicht auf die vorhandenen Features, sondern darauf dass man seine Inputroutine an das gewünschte Programm anpasst um sie möglichst effizient zu halten.
Deine Routine ist nicht schlecht, aber sie ist eben eine unter vielen Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

TheMatrix

BeitragDo, Sep 28, 2006 6:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Das musst du mir jetzt aber mal genauer erklären. Man kann sich doch eh nur auf ein Input zurzeit konzentrieren. Wie willst du bitte in 2 Fenster gleichzeitig schreiben?Du schreibst doch wenn erst in Fenster 1 dein Input, dann in Fenster 2. Das ist auf jeden Fall machbar, selbst mit 1000 Fenstern Wink

Wenn du Optimierungsvorschläge hast, damit man sie an ein Spiel anpassen kann, dann nenne sie mir bitte. Du kannst Schriftgröße, -farbe und -art festlegen. Was will man da bitte noch? Du kannst, wenn du lustig bist auch ein rect rumzeichen. Da hält dich keiner von ab Wink
°_° °.° °~° °v° .. -.-

PowerProgrammer

BeitragDo, Sep 28, 2006 7:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Mehrere Inputfenster, wovon natürlich immer nur eins einen Fokus haben kann. Z.B. ein Formular, wo man doch manchmal erst das eine als das andere ausfüllt. Da kann man schon sehen, was man überhaupt alles ausfüllen muss...

Das mit den Opptimierungsvorschlägen meine ich etwas anders. Für fast jedes Spiel eignen sich verschiedene Typen von Inputtypen. In manchen benötigt man nur eins, in anderen aber 20. Dann soll in dem einen nur ein bestimmter Zeichensatz erlaubt sein und das andere wiederrum soll als Passwortfeld fungieren. Deshlab ist selberschreiben praktischer...

Und würdest du für ein Spiel alle möglichen fertigen Codes zusammenkopieren?
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!

TheMatrix

BeitragDo, Sep 28, 2006 7:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit den Formular liegt nicht an meiner Funktion sonder an dir sie anzuwenden. Ich hab dem Obigen Code extra ein paar Zeilen für dich hinzugefügt. Der behandelt 20 Einträge gleichzeitig, es können meinetwegen auch 100 oder 1000 sein, wie du willst. Die Funktion ist unverändert.

Wenn es Zeichen gibt, die nicht verwendet werden dürfen, Bau ich das natürlich mit ein.

Aber Frage: Ist es nicht besser 1 Input Funktion zu nutzen, die alles vereint als mit 20 sein Quellcode voll zu müllen? Wink

~EDIT~
Zum anvesieren der "Formulareinträge" mit der Maus draufklicken Wink

TheMatrix

BeitragFr, Okt 06, 2006 16:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt können auch InputAusnahmen betrachtet werden. Jeder Buchstabe kann erlaubt oder auch verboten sein.

Vielleicht kann sich ja jetzt die Funktion gegen andere behaupten Wink
°_° °.° °~° °v° .. -.-

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group