Author Topic: INKEY$ verschluckt Tastaturanschläge  (Read 4380 times)

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
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
« Last Edit: 2011-May-30 by S. P. Gardebiter »
~ Cave Story rules! ~

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10732
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #1 on: 2011-May-30 »
oh. Der Puffer ist (glaub) nur 4 Zeichen pro SHOWSCREEN. Bist Du so schnell?

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #2 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.
~ Cave Story rules! ~

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5036
  • O Rly?
    • View Profile
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #3 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
I <3 DGArray's :D

PC:
AMD Ryzen 7 1700 @3.9GHz, 16GB HyperX Fury 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #4 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.
« Last Edit: 2011-May-30 by S. P. Gardebiter »
~ Cave Story rules! ~

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5036
  • O Rly?
    • View Profile
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #5 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?!
I <3 DGArray's :D

PC:
AMD Ryzen 7 1700 @3.9GHz, 16GB HyperX Fury 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #6 on: 2011-May-30 »
Ich 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.

Spiel 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.
« Last Edit: 2011-May-30 by S. P. Gardebiter »
~ Cave Story rules! ~

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10732
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #7 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

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #8 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.
« Last Edit: 2011-May-31 by S. P. Gardebiter »
~ Cave Story rules! ~

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10732
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #9 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?

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #10 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.
« Last Edit: 2011-May-31 by S. P. Gardebiter »
~ Cave Story rules! ~

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10732
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #11 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 :/

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #12 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.
« Last Edit: 2011-Jun-21 by S. P. Gardebiter »
~ Cave Story rules! ~

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10732
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #13 on: 2011-Jun-21 »
Wir reden aber schon von V.10 - RC, oder? Nicht, dass Du das mit der 9er versuchst.

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: INKEY$ verschluckt Tastaturanschläge
« Reply #14 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.
« Last Edit: 2011-Jul-03 by S. P. Gardebiter »
~ Cave Story rules! ~