Merkwürdiges Verhalten bei KeyHit()
Übersicht

sddsmhrBetreff: Merkwürdiges Verhalten bei KeyHit() |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ein einfacher Code:
Code: [AUSKLAPPEN] While Not KeyHit(1)
If KeyHit(57) Then DebugLog("1") If KeyHit(57) Then DebugLog("2") Wend Was würde man erwarten? Zu erwarten wäre meines Erachtens, dass bei Drücken der Space-Taste beide Ausgaben erfolgen, oder wenigstens stets die erste, was aber beides nicht der Fall ist... Nach wiederholtem Drücken der Leertaste ergibt sich eine recht zufällige Folge von Einsen und Zweien. Man versuche nun aus dem obigen Fall das Verhalten im folgenden Fall vorherzusagen: Code: [AUSKLAPPEN] x=0
While Not KeyHit(1) ;esc If KeyHit(57) Then x=x+1 If KeyHit(57) Then x=x-1 debuglog("x: "+x) Wend Man würde nun möglicherweise erwarten, dass sich eine Folge von Zahlen ergibt, die sich mehr oder weniger zufällig um 1 erhöht/erniedrigt, und im Mittel etwa konstant um Null herumpendelt. Überraschenderweise erhält man in diesem Fall jedoch eine streng monoton steigende Folge von Zahlen, was nur bedeuten kann, dass der erste Aufruf stets verarbeitet wird, während der zweite Aufruf stets ignoriert wird. Ein Workaround ist kaum ein Problem, aber bei solch kontraintuitiven Verhalten frustet BB3D manchmal wirklich enorm... ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, beim Aufrufen der Hit-Funktionen wird der Buffer geleert. War schon immer so und ist so überall im Forum nachlesbar.
~VERSCHOBEN~ Nichts spezielles zu 3D hier. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Der workarround ist streng genommen eh der bessere weg ![]() Zuersteinmal: Die funktion wird aufgerufen, sie schaut, aha, keyhit. *ich nehm mir mal dieses event* - so in etwa. Beim erneuten aufruf hat es keinen registrierten event mehr, da die KeyHit abfrage prüft, ob eine taste runtergedrückt wurde - als laie betrachtet würde man meinen, das ein weiterer KeyHit der selben taste als "gedrückt gehalten" gelten würde. Wie dem auch sei, ich habe leider keine ahnung von der internen handhabung, noch von den event ![]() Nun zum "workarround": Für den fall, das du eine Tastenabfrage mehrmals verwenden willst, wäre es von der Performance her idealer, gewisse zustände zu speichern. Zum einen, weil dies der Keyhit zwang ist, zum anderen, weil es "schneller" geht, einen wert auszulesen und zu schreiben, als eine Funktion rattern zu lassen. Zugegeben, heutige Computer brauchen millionenfache ausführungen, um ein paar MS unterschied festzustellen, aber streng genommen... ![]() |
||
sddsmhr |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Joa, momentan werden relevante Keyhits einfach in einem Feld gespeichert.
Das Verhalten von KeyHit() wäre ja noch halbwegs verständlich... Allerdings verwundert dann doch die Abhängigkeit dieses Verhaltens vom nachfolgendem Code... Im ersten Fall werden halt abwechselnd mal das eine, mal das andere KeyHit erfasst, im zweiten Fall jedoch ausschließlich das erste... So kann man einfach nicht arbeiten. Nehmen wir mal an, statt einer einfachen Addition oder Substraktion handelt es sich um einen größeren Anweisungsblock, oder dem Aufruf zweier Funktionen. Nun stelle ich einen Fehler im Zusammenhang mit beiden Blöcken (KeyHits) fest. Füge ich nun aber eine "Messung" durch (DebugLog), verhält sich das System plötzlich ganz anders... Fast schlimmer als in der Quantenmechanik... ![]() |
||
![]() |
Nova |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Verarbeitung von DebugLog dauert wesentlich länger als KeyHit, da eine Ausgabe wesentlich mehr Arbeit macht, als eben einfach nur die Tasten abzufragen. Es ist daher wesentlich wahrscheinlicher, vor der ersten Abfrage (also nach der zweiten), als zwischen diesen beiden, da dort eine wesentlich kürzere Pause ist.
Wenn man dann einfach zwischen beide Abfragen einen weiteren DebugLog macht, wird auch die zweite Abfrage ausgeführt. Trotzdem erhöht sich die Variable doch mehr, statt eher bei 0 zu bleiben. Warum? Weil das Programm auch noch die Schleife abarbeiten muss, und deswegen weiterhin vor der ersten / nach der zweiten Abfrage mehr Zeit braucht, als zwischen beiden. Allgemein sollte man dann vielleicht eher KeyDown nutzen. Keyhit ist halt wirklich eine Abfrage, wie oft eine Taste gedrückt wurde, nicht ob eine Taste gedrückt wurde. Hoffe, das hat dir geholfen. ![]() Gruß, Nova |
||
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group