GMS 1.4 : keyboard_check_pressed funktioniert nicht mehr

    GMS 1.4 : keyboard_check_pressed funktioniert nicht mehr

    Hi Leute,

    bin dabei einen altes Spiel (H.E.R.O.) von GM8 nach GMS 1.4 zu portieren, was soweit auch schon funktioniert.
    Allerdings komme ich bei einer Sache einfach nicht weiter, einer einfachen "Press any Key" Routine.

    Unter GM8 hatte ich dafür ganz simpel folgendes benutzt:

    GML-Quellcode

    1. ​while !keyboard_check_pressed(vk_anykey) continue;


    Unter GMS 1.4 will das aber nicht mehr, die Schleife beendet sich einfach nicht.
    Geben tut es dies ja noch, aber es will nicht wie es soll, egal wo ich das nun einsetze.

    Hat jemand eine Idee?
    ---------------------------
    http://games.pixas.de
    ---------------------------
    Für mich sieht nichts falsch aus. Probiere mal Klammern zu setzen und continue mit geschweiften Klammern zu ersetzen:

    GML-Quellcode

    1. while (!keyboard_check_pressed(vk_anykey)) {}


    Hängt sich denn das Spiel auf oder passiert nichts?
    Denn diese Methode lässt das Spiel eigentlich freezen und ist sehr unsauber.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
    Danke schon mal, ich teste das heute Abend.

    Spiel hängt sich nicht auf, es bleibt nur in dieser Zeile hängen.
    ---------------------------
    http://games.pixas.de
    ---------------------------

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Skywalker“ ()

    Warum versuchst du es nicht umgekehrt, anstatt zu überprüfen, ob eine Taste noch nicht gedrückt wurde, überprüfst du einfach, ob eine gedrückt wurde.

    if (keyboard_check_pressed(vk_anykey) ...

    Oder führt das nicht zu deinem gewünschem Ergebnis?
    So hättest du nicht permanent eine Schleife, die dein Program jede Step abarbeiten muss.
    Habe es nun testen können.

    GML-Quellcode

    1. while (!keyboard_check_pressed(vk_anykey)) {}

    Das obige funktioniert auch nicht.
    Extra mal ein leeres Programm erstellt was eigentlich nichts anderes als diese Zeile, gefolgt von einem "game_end(), beinhaltet.
    Geht auch nicht.

    @icqgamer
    Weiß nicht wie ich es anders machen soll. Das Programm soll an dieser Stelle ja anhalten, da eine Abfrage (z.B. Programm beenden J/N) stattfinden soll.
    Dafür darf und soll das Spiel ja erstmal nicht mehr weiterlaufen. Nach der Zeile soll dann die Abfrage erfolgen ob "J" gedrückt wurde.

    Ich finde das sehr merkwürdig, vielleicht kann mal von euch jemand das bei sich testen. Wäre sehr nett.
    ---------------------------
    http://games.pixas.de
    ---------------------------
    Muss mich mal schnell korrigieren.
    Habe jetzt nochmal im alten Source aus GM8 nachgeschaut. Dort hatte ich ein "keyboard_wait()" eingesetzt.
    Die Umsetzung auf GMS hatte ich schon vor einiger Zeit mal angefangen und da dann das mit dem "while..." eingebaut.
    Deshalb: Unter GM8 funktioniert das auch nicht aber unter GMS bin ich mir ziemlich sicher das es mal funktionierte.
    ---------------------------
    http://games.pixas.de
    ---------------------------

    GML-Quellcode

    1. //Create Event
    2. accepted = false;


    GML-Quellcode

    1. //Step Event
    2. if (keyboard_check_pressed(vk_anykey)) {
    3. accepted = true;
    4. }
    5. if (accepted) {
    6. //...
    7. }
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
    Danke, aber das Spiel wird dadurch auch nicht angehalten.
    Im Grunde würde es mit "show_question(str);" funktionieren. Nur gefiel mir das nie und deshalb hatte ich mir was eigenes gebaut, was ja jetzt auch nicht mehr geht.

    Was aber z.B. funktioniert wäre:

    GML-Quellcode

    1. while !keyboard_check_direct(vk_enter) continue;

    Aber leider nicht:

    GML-Quellcode

    1. while !keyboard_check_direct(vk_anykey) continue;


    Bin immer noch total ratlos.
    ---------------------------
    http://games.pixas.de
    ---------------------------
    deaktiviere doch einfach alle instanzen außer die mit der Frage/ etc.


    show_question(str); solltest du niemals verwenden, wenn du ein game veröffentlichst
    • Bluetooth Multiplayer
    • Wasser App: play.google.com/store/apps/details?id=com.gaming_apps.water_physics_simulation
    • :shifty: :motz:
    Ich denke das Problem ist folgendes:

    Wenn du im Step Event schreibst, dass das Programm stoppen soll, wenn eine Taste gedrückt wird, dann wird es für diese Step gestoppt.
    Danach jedoch läuft die nächste Step und somit die nächste Überprüfung der while-Schleife.
    Mit einer festen Variable, welche du im Create Event definierst, könntest du dein gewünschtes Ergebnis erreichen.

    Variante 1:
    - Du deklarierst im Create Event stop = false;
    - Du schreibst im Step-Event while (stop == false) { Dein Code }
    - Im Keyboard-Event bei "Keyboard Pressed - Any Key" oder im Step Event mit if keyboard_check_pressed(vk_anykey) setzt du die Variable stop auf true.

    Variante 2:
    - Du packst deinen Code while (keyboard_check_pressed(vk_anykey) == false) bspw. in ein Alarm Event, wo es nicht permanent ausgeführt wird, sondern nur solange die Bedingung false ist und verweist im Create Event auf dein Alarm mit alarm[deine Alarmnummer] = 1

    Ich kann leider nichts garantieren, da ich es selber nicht testen konnte. Einen Versuch ist es wert.
    Hatte die Sache einige Zeit ruhen lassen und bin das Problem vor ein paar Tagen noch einmal angegangen.
    Ich konnte die Sache nun wie folgt lösen:

    GML-Quellcode

    1. is_any_key_pressed=false
    2. result=false
    3. while (is_any_key_pressed=false)
    4. {
    5. if keyboard_check_direct(ord("Y"))
    6. {
    7. result=true;
    8. is_any_key_pressed=true;
    9. }
    10. if keyboard_check_direct(ord("N"))
    11. {
    12. result=false
    13. is_any_key_pressed=true;
    14. }
    15. }
    16. if result=true
    17. {
    18. // Die Taste Y wurde gedrückt
    19. }


    Da alle Tastaturabfragen zu einer Endlosschleife und somit zum Hängen des Programm führten, habe ich mich noch einmal mit "keyboard_check_direct" auseinander gesetzt.
    Aber auch hier hatte anfangs nur "while !keyboard_check_direct(vk_enter) continue;" funktioniert.
    Auch "while !keyboard_check_direct(ord('Y')) continue;" klappte nicht.
    Irgendwann probierte ich dann einfach mal "keyboard_check_direct(ord("Y"))" und schon ging es!
    Verstehen tue ich das jetzt nicht, denn die Anleitung sagt klar aus, das bei der Funktion "ord()" Apostroph und nicht Anführungszeichen einzusetzen sind.

    Jedenfalls funktioniert es nun und ich kann weiter machen.
    ---------------------------
    http://games.pixas.de
    ---------------------------

    Skywalker schrieb:


    Verstehen tue ich das jetzt nicht, denn die Anleitung sagt klar aus, das bei der Funktion "ord()" Apostroph und nicht Anführungszeichen einzusetzen sind.


    Meines Wissens nach macht man bei Characters Apostroph und bei Strings Anführungszeichen. Da es sich bei ord um Chars handelt, sollte es ein Apostroph sein. Es funktioniert aber mit beidem.
    Korrigiert mich jemand bitte, wenn ich mit der Aussage falsch liege!
    Habe jetzt noch einmal nachgeschaut.
    In der Hilfe steht bei ord() tatsächlich ein Beispiel mit Anführungsstrichen.
    Bei z.B. "keyboard_check_released" ist dieses allerdings mit Apostroph angegeben.

    Habe nun für Spaß eben nochmal mit Apostroph getestet und ich glaube es kaum: Das geht nun plötzlich auch!
    Ich verstehe das nicht mehr.

    Die Tage hatte ich es schon mal, dass meine eigentlich fertige Abfrage plötzlich auch nicht mehr die Tasten korrekt abfragte und ich verstand nicht warum.
    Nach dem Neustart von GMS ging es dann plötzlich wieder.
    ---------------------------
    http://games.pixas.de
    ---------------------------
    Begründen wir das mal mit einem Wort: YoYoGames :D
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
    Wahrscheinlich hat Mark Overmans nicht soweit gedacht beider Planung der Software und für YYG war es im nachhinein sehr schwer das Grundlegende zu ändern. GMS2 startet jetzt zum Glück wieder bei 0 und nutzt C#. Ich hoffe das wirkt sich auch auf die Entwicklungszeit für Updates aus.
    • Bluetooth Multiplayer
    • Wasser App: play.google.com/store/apps/details?id=com.gaming_apps.water_physics_simulation
    • :shifty: :motz:
    Habe ab Version 8 alles bis zu GMS 2, alle mit den aktuellsten Updates. Im obigen Fall nutze ich GMS 1.
    Ich konvertiere gerade ein altes v8 Projekt erst auf GMS 1 um es dann auf GMS 2 zu bringen.
    ---------------------------
    http://games.pixas.de
    ---------------------------

    glim888 schrieb:

    Wahrscheinlich hat Mark Overmans nicht soweit gedacht beider Planung der Software und für YYG war es im nachhinein sehr schwer das Grundlegende zu ändern. GMS2 startet jetzt zum Glück wieder bei 0 und nutzt C#. Ich hoffe das wirkt sich auch auf die Entwicklungszeit für Updates aus.


    Mal ein wenig Off-Topic, aber das würde mich jetzt mal interessieren.
    Welche Entwicklungsumgebung wurde für die Vorgänger von GMS2 genutzt?