GLBasic forum

Other languages => GLBasic - de => Topic started by: S. P. Gardebiter on 2011-May-30

Title: INKEY$ verschluckt Tastaturanschläge
Post by: S. P. Gardebiter on 2011-May-30
Hallo. Ich habe mir eine eigene INPUT Funktion mit INKEY$ geschrieben aber INKEY$ verschluckt bei mir regelmäßig einige Tasten, da ich schnell tippe und meine eigene INPUT Funktion scheint manchmal etwas zähflüssig zu sein.

Irgendeine Idee? Für mich sieht das schwer nach einem Bug aus :S

Code (glbasic) Select
IF Typing = TRUE OR Console = TRUE
NewChar$ = INKEY$()
IF ASC(NewChar$) = 8
NewLine$ = MID$(NewLine$, 0, LEN(NewLine$) - 1)
ELSEIF ASC(NewChar$) >= 32
NewLine$ = NewLine$ + NewChar$
ENDIF
IF Console = TRUE
IF FPSC > 30
PRINT NewLine$, 3, INTEGER((ScreenH / 2 + ScreenH / 8) / 16) * 16, TRUE
ELSE
PRINT NewLine$ + "|", 3, INTEGER((ScreenH / 2 + ScreenH / 8) / 16) * 16, TRUE
ENDIF
ELSE
IF FPSC > 30
PRINT "Say: " + NewLine$, 16, ScreenH / 2 + ScreenH / 4 + ScreenH / 8, TRUE
ELSE
PRINT "Say: " + NewLine$ + "|", 16, ScreenH / 2 + ScreenH / 4 + ScreenH / 8, TRUE
ENDIF
ENDIF
ENDIF
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: Kitty Hello on 2011-May-30
oh. Der Puffer ist (glaub) nur 4 Zeichen pro SHOWSCREEN. Bist Du so schnell?
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: S. P. Gardebiter on 2011-May-30
Quote from: Kitty Hello on 2011-May-30
oh. Der Puffer ist (glaub) nur 4 Zeichen pro SHOWSCREEN. Bist Du so schnell?

Ah, das könnte die Eklärung dafür sein.
Naja ich weiß nicht wie schnell man dafür sein muss aber es scheint wohl so zu sein. o: Selbst wenn ich mich nicht anstrenge besonders schnell zu tippen, mache ich durchschnittlich ca. 530 Anschläge pro Minute.
Gibt es einen Weg den Buffer zu erhöhen? Dann könnte ich prüfen ob es daran liegt.
Man könnte ihn auch auf die physisch maximal erreichbare Anzahl an Anschlägen ausrichten, (ca. 750 Anschläge pro Minute) falls ihn das nicht zu groß machen würde.
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: Schranz0r on 2011-May-30
4 Anschläge pro Showscreen schaft du niemals :D

530 Anschläge / 60 Sekunden = 8.83 Anschläge pro Sekunde, was schon krass ist!
ABER:

Nehmen wir mal 30 FPS (Frames per second) an, dann sind das ~9 / 30 = 0,3 Anschläge pro Frame... Also Showscreen!
Und 4 sind pro Frame da... reicht!

Oder rechne ich falsch... o.O
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: S. P. Gardebiter on 2011-May-30
Das ist ja ledeglich die Durchschnittsgeschwindigkeit und hat nichts mit einzellnen "Spitzenleistungen" zutun o:
Falls du aber recht hast und es nicht am Buffer liegt, dann muss es zwangsläufig was anderes sein, denn bei anderen Programmen habe ich dieses Problem nicht, ebenso nicht bei der originalen INPUT Funktion und mein Code scheint ja auch in Ordnung zu sein O:
Ich denke es wäre zumindest einen Versuch Wert, mal zu prüfen ob es am Buffer liegt.
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: Schranz0r on 2011-May-30
Naja standartmässig läuft ja GLBasic auf 60 Frames pro Sekunde
Ich bin der Meinung du schafst das so nicht....

Ich kann mir nur vorstellen, das dein Code ab und an mal das Schreiben überspringt?
Keine Ahnung wie du es eingebaut hast...
Spiel doch mal mit den FPS rum, LIMITFPS -1 und teste es nochmal, oder ich liege falsch und du musst mit den FPS runter?!
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: S. P. Gardebiter on 2011-May-30
Quote from: Schranz0r on 2011-May-30Ich kann mir nur vorstellen, das dein Code ab und an mal das Schreiben überspringt?

Das halte ich zu 100% für ausgeschlossen. o:
Dann könnte es nämlich nur an meiner KeyHit Funktion liegen und wenn die rumspinnt, würde er die Eingabe automatisch bestätigen.

Quote from: Schranz0r on 2011-May-30Spiel doch mal mit den FPS rum, LIMITFPS -1 und teste es nochmal, oder ich liege falsch und du musst mit den FPS runter?!

Ich komme leider nicht über 72 FPS, obwohl ich es eigentlich müsste. (Früher gings ja auch) Mein Spiel läuft standardmäßig auf 60 FPS. Wenn ich die FPS erhöhe müsste sich aber eigentlich auch der INKEY$ Buffer schneller leeren, also beweist das nicht unbedingt irgendwas.

Edit: Bei mir ist die länge von INKEY$ auch immer nur 1, höchstens, mehr als einen Char scheint er nicht raus zu geben o:
Warum funktioniert eigentlich "^" so komisch mit INKEY$? Er gibt nur ein "^" raus wenn ich zweimal auf die Taste drücke und wenn ich einmal draufdrücke und dann auf eine andere z.B. auf die 1, dann gibt er anstatt "^1", garnichts raus.
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: Kitty Hello on 2011-May-31
OK, puffer ist 16 Zeichen pro SHOWSCREEN. Das ist zuu krass.

Du musst, wenn inkey$() ungleich "" ist, nochmal durchprüfen, was inkey$ ist, bis es leer ist. Danach erst showscreen.

Code (glbasic) Select

IF Typing = TRUE OR Console = TRUE
     REPEAT
NewChar$ = INKEY$()
IF ASC(NewChar$) = 8
NewLine$ = MID$(NewLine$, 0, LEN(NewLine$) - 1)
ELSEIF ASC(NewChar$) >= 32
NewLine$ = NewLine$ + NewChar$
ENDIF
IF Console = TRUE
IF FPSC > 30
PRINT NewLine$, 3, INTEGER((ScreenH / 2 + ScreenH / 8) / 16) * 16, TRUE
ELSE
PRINT NewLine$ + "|", 3, INTEGER((ScreenH / 2 + ScreenH / 8) / 16) * 16, TRUE
ENDIF
ELSE
IF FPSC > 30
PRINT "Say: " + NewLine$, 16, ScreenH / 2 + ScreenH / 4 + ScreenH / 8, TRUE
ELSE
PRINT "Say: " + NewLine$ + "|", 16, ScreenH / 2 + ScreenH / 4 + ScreenH / 8, TRUE
ENDIF
ENDIF
ENDIF
     UNTIL LEN(NewChar$) = 0
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: S. P. Gardebiter on 2011-May-31
Ah, okay, mit dem neuen Code funktioniert es schonmal viel besser, allerdings noch nicht perfekt. Wenn das nächste Update draußen ist, werden wir es ja sehen :)
Danke für eure Hilfe.

Edit: Ich bin mir nicht mehr so sicher ob das überhaupt etwas verändert hat. Ich habe mir eine Funktion geschrieben, mit der ich überprüfen kann wie oft er die Schleife durchläuft. Wenn ich zähle wie oft er durchläuft komme ich oft nur auf "1", selten mal auf "2". Habe auch überprüft ob die Schleife jeden Frame durchläuft und das tut sie. Sicher, dass der Buffer oder irgendwas ähnliches nicht verbuggt ist? o: Wenn ich zwei Tasten gleichzeitig drücke wird nur einer der beiden Buchstaben auf den Bildschirm geschrieben.
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: Kitty Hello on 2011-May-31
Code (glbasic) Select

     REPEAT
NewChar$ = INKEY$()
IF ASC(NewChar$) = 8
NewLine$ = LEFT$(NewLine$, LEN(NewLine$) - 1)
ELSEIF ASC(NewChar$) >= 32
INC NewLine$, NewChar$
ENDIF
     UNTIL LEN(NewChar$) = 0


besser?
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: S. P. Gardebiter on 2011-May-31
Nein, genau das gleiche wie eben auch O:

Edit: So, hab mal meine Funktion "getuned", hier ist das Ergebnis:

(zur besseren Übersicht entfernt)

Korrekt müsste es heißen: "Hallo, ich bin S. P. Gardebiter"
Manchmal verschluckt er auch noch mehr.
Wahrscheinlich hatte Schranzor recht, ich schaffe bestimmt keine 2 Zeichen pro Frame. Aber dennoch verschluckt er einiges. Wie lange brauch er denn um den Buffer zu leeren?


Edit edit: Vergesst es, ich bin dumm. Der Buffer von INKEY$ funktioniert nicht korrekt, INKEY$ gibt immer nur eine Taste raus und das kann ich auch beweisen:
Ich habe mir gerade eine schrottige Funktion geschrieben die ähnlich wie INKEY$ funktioniert: Sie überprüft ob eine Taste gedrückt worden ist und gibt dann die jeweiligen Buchstaben zurück.
Hier war es genau das gleiche Problem wie bei INKEY$, es wurden Tastaturanschläge verschluckt, also dachte ich mir, anstatt die Buchstaben gleich zurück zu geben, speichere ich sie nacheinander in eine Variable und gebe sie dann aus.
Ergebnis war folgendes:

http://tile44.org/files/Console.log

Ok, beim ersten Satz ein paar Tippfehler sonst aber völlig okay, was jetzt schon auffällt ist aber: Ich schaffe es tatächlich manchmal 2 Buchstaben pro Frame zu schreiben. Auch sind teilweise die Abstände zwischen 2 Buchstaben nur 2 Frames groß.

Nun wird es aber interessant:

"SPG~0: viel zu shcnell"

Nein, diesmal kein Tippfehler. Ich überprüfe die "h" Taste vor der "c" Taste und da ich beide in einem Frame geschrieben habe wird das h einfach vor das c gesetzt wegen des Codes.

"SPG~0: ich tipe zu schnell"

Da, wieder, kein Tippfehler. Das "p" ist nur einmal da und da ich keinen Buffer bei der Funktion benutzt habe, weiß ich nicht wie oft das "p" in einem Frame benutzt wurde. Daher wird auch nur eins angefügt.

"SPG~0: viel zu schnel"

Das gleiche, nur diesmal mit dem "l".
Das erklärt auch die auffallend hohe Fehlerquote bei Wörten die zwei gleiche Buchstaben nebeneinander haben: Hier kann ich viel schneller reagieren und es durchaus in einem Frame schaffen zwei Buchstaben hintereinander zu schreiben. Bei den anderen Dingen war es halt mehr oder weniger Glück wenn ich es geschafft habe, d.h.: Der Buffer von INKEY$ ist verbuggt.
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: Kitty Hello on 2011-Jun-06
OK, teste mal das hier. Bei mir geht das korrekt.
Code (glbasic) Select


LOCAL a$, b$

WHILE TRUE
FOR i=0 TO 100
INC b$, INKEY$()
SLEEP 5
NEXT
DEBUG b$+"\n"
INC a$, b$; b$=""
PRINT a$,0,0
SHOWSCREEN
WEND


Ich kann leider nicht so schnell tippen wie Du :/
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: S. P. Gardebiter on 2011-Jun-21
Hi.
Sorry für die späte Antwort, die letzten beiden Wochen waren extrem stressig.

Bei mir funktioniert das leider garnicht :/ Der nimmt garkeinen Tastendruck von mir an, zumindest solange da eine For/Next Schleife drin ist.

Wenn ich die Schleife rausnehme, nimmt der komischerweise immernoch nicht alle Anschläge an sondern verschluckt viele einfach ganz :/ Sogar wenn ich Sleep auf 1 setze.

Edit: Irgendwas stimmt mit Inkey$ nicht, wenn ich meine (schlechte) selbstgeschriebene "Nachahmungsfunktion" benutze, funktioniert alles bestens.
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: Kitty Hello on 2011-Jun-21
Wir reden aber schon von V.10 - RC, oder? Nicht, dass Du das mit der 9er versuchst.
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: S. P. Gardebiter on 2011-Jul-03
Mit Version 10 funktioniert alles super, musste nichtmal was in meinem Spiel ändern.
Vielen dank Gernot :)

Allerdings sind exe Dateien in Version 10 auch über 100 kb größer O:
Mein Programm mit 460 Befehlen ist bereits über 1,3 MB groß. Naja, 'seis drum.
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: Schranz0r on 2011-Jul-03
die exen finde ich auch ein wenig heavy
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: BumbleBee on 2011-Jul-03
Quote
  Mein Programm mit 460 Befehlen ist bereits über 1,3 MB groß.

Ja, das passt dann halt leider nicht mehr auf so eine alte Diskette.   ;)

Cheers
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: Schranz0r on 2011-Jul-03
doch ne Diskette hat 1.44 MB :D
Title: Re: INKEY$ verschluckt Tastaturanschläge
Post by: WPShadow on 2011-Jul-03
Uiuiui, eine HD - Diskette!  :good: