Tastendruck wird nach Raumwechsel noch ausgeführt

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Tastendruck wird nach Raumwechsel noch ausgeführt

    Hallo! Ich mach als Übung eine kleine Bomberman-Version.

    Ich habe ein Menü als ersten Raum im Stil der alten Konsolenspiele. Man hat also mehrere Menüpunkte, und man wählt mit oben und unten einen Punkt aus und bestätigt mit Enter. Dafür benutze ich z.Z. die entsprechenden "keyboard key pressed" Events.

    Die Bewgung im Spiel ist "kachelbasiert", ähnlich wie im Maze-Tutorial. Wenn man also eine Richtung drückt, bewegt man sich gleich ein ganzes Feld in die Richtung.

    Ich habe vor, die Steuerung konfigurierbar zu machen. Ausserdem will ich linke und rechte Shifttaste u.ä. unterscheiden können, daher benutze ich keyboard_check_direct() für die Tastenüberprüfung.

    Nun mein Problem:
    Wenn ich im Menü nach unten und dann Enter drücke, dann bewegt sich die Figur im Spiel (also nächster Raum) ein Feld nach unten, obwohl die Taste schon lange losgelassen wurde.
    Das gleiche passiert bei den anderen Richtungstasten übrigens auch.

    Ich habe es schon mit io_clear() versucht, aber das Problem besteht weiterhin.

    Hat jemand ne Idee, wie ich es schaffe, dass die Figur stehenbleibt, wenn das Spiel startet?
  • RE: Tastendruck wird nach Raumwechsel noch ausgeführt

    Ich bin auf dieses Problem auch gestossen und es hat mich schliesslich dazu veranlasst, eine eigene Engine fuer Tasten zu schreiben.

    Du speicherst ab, welche Tasten in diesem Step gehalten werden (keyboard_check) und vergleichst diese mit den gedrueckten Tasten aus dem vorherigen Step. Wurde die Taste im vorherigen Schritt schon gedrueckt, dann wird sie noch gehalten, wenn sie noch nicht gedrueckt war, dann wurde sie in diesem Step gedrueckt und wenn sie nicht mehr gehalten wird aber im letzen schon, wurde sie losgelassen.

    Eine effiziente Methode zur Abspeicherung und zum Vergleichen findest du im Technik Contest:
    gm-d.de/board/thread.php?threa…test&hilightuser=0&page=1
    Achtung, VIEL Text.

    Schau dir in der GM Hilfe ferner mal die "order of events" an.

    Andere Workarounds sind mir leider nicht bekannt, aber es ist generell schlau, die Finger von Key Release Events zu lassen.
  • @melancor: Eine Verzögerung hat es leider nicht gebracht.

    Ich hab die Spielfiguren statt am Anfang des Create-Events des GameControl Objekts ans Ende gepackt. Dazwischen wurde das Level per Zufallsgenerator erzeugt. Hat aber leider nix gebracht. Ein sleep(2000) habe ich auch ohne Erfolg versucht.
    Alles einfach mal der Vollständigkeit halber. 8)

    @MewX: Ich hab jetzt im Menü die Key Pressed Events sein gelassen (ausser dem AnyKey natürlich), und hab stattdessen die selbstgeschriebene Funktion benutzt, die ich auch schon im Spiel selbst verwendet habe. Die ist allerdings bei weitem nicht so elegant, wie im Wettbewerb. :)

    GML-Quellcode

    1. if(keyboard_check_direct(global.P1_DOWNKEY))
    2. P1_down_key_down = 1;
    3. else
    4. P1_down_key_down = 0;

    usw. für jeden Knopf, den ich benutze. global.P1_DOWNKEY wird im Menücontroller einem Tastencode zugeordnet, d.h. ich kann dann noch einbauen, dass die Steuerung in den Optionen eingestellt werden kann.
    Ich hab das jetzt also in den anyKey Event gepackt, und dahinter geschrieben, was passieren soll, wenn P1_down_key_down = 1 ist. Diese Lösung hat auch den Vorteil, dass die Steuerung zwischen Menü und Spiel einheitlich ist.
    Bevor ichs vergesse: So funktionierts! :D

    Fazit: Finger weg von den Keyboard Events, und immer schön per GML abfragen, welche Tasten gedrückt wurden.
  • 1. Möglichkeit:

    du legst im
    (create_event) des Spielers ein
    (move_action) und klickst das rote
    quadrat in der Mitte an.
    Dann stells du "speed" zu "0".


    2. Möglichkeit:

    du stellst im
    (keyboard_event)
    ("no key pressed"(oder so ähnlich)) des Spielers
    (move_action) und klickst das rote
    quadrat in der Mitte an.
    Dann stells du "speed" zu "0".


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Nici ()

  • @Nici:
    Keine Ahnung, ob das funktioniert. Hab jetzt auch keine Lust, meine Änderungen rückgängig zu machen, um deine einfache Lösung mal auszuprobieren. Vielleicht hat da MewX Erfahrung mit?

    So ausführlich hättest du mir das jetzt nicht erklären brauchen. Bin kein absoluter Anfänger mehr (meine Beschreibungen sollten sich auch eigentlich nicht danach lesen), aber ein Profi bin ich wohl auch noch lange nicht.


    Es funktioniert jetzt, also danke an alle! :)
  • Dieses Workarround duerfte funktionieren, aber ich meine mich da an ein paar Ungereimtheiten beim Raumwechsel zu erinnen, kann sein, dass das eine davon war.

    Das zweite (no key pressed) ist unklug, denn dann kan man z.B. die Taste g immer gedrueckt halten und damit verhindern, dass das no key event ausgeloest wird, obwohl g sonst nie eine Rolle spielt.

    Selbst wenn aber das obere Workaround funktionieren sollte, ist dieses sehr spezfisch fuer diesen Fall und ist fuer eine Verallgemeinerung nicht wirklich brauchbar, da man in dem Create Event alles abhandeln muesste, was sonst im key release event passiert. Und das, obwohl das Create Event nicht ohen Variablen wissen kann, welche Release Events ueberhaupt zu kurz kamen. Da kann man es gleich ohne machen...

    Ferner meine ich mich zu erinnern, dass ein Tastendruck beim Raumwechsel auch nicht gespeichert wird. In Disordia sprang man durch die Decke in einen anderen Raum und oben angekommen viel man sofort runter, da die Sprungtaste nicht mehr erkannt wurde und der Spruch beim Betreten des Raumes wieder zum Fall wurde.

    Keine Ahnung, wann der eine Fehler und wann der andere auftritt, aber beides ist schlecht und sollte vermieden werden. Ich persoenlich nutze daher nur key pressed und key check - wobei man bei key pressed auch bedenken muss, dass ich aus dem GM rausgehen kann, die Taste druecke und dann wieder reingehe. Soweit ich weiss loest das nicht key pressed aus.

    Freut mich aber, dass ich helfen konnte. ;)