2x Eine Taste drücken um zu Rennen

  • GM 8
  • 2x Eine Taste drücken um zu Rennen

    Hi,
    Ich hab folgendes Problem: Ich will dass, mein Spieler rennt wenn ich 2x mal hintereinander die Rechts oder Links Taste drücke und er soll dann solange in diese Richtung laufen bis man die entgegengesetzte Taste oder Jump drückt.
    Ich habs bis jetzt nur so hingekriegt dass, wenn ich rechts oder links+space drücke mein Spieler rennt. Also hat jemand eine Idee wie das geht?
    Damit ihr vieleicht ne bessere Übersicht habt bzw. euch vorstellen könnt wie ich das gemacht hab pack ich hier mal meinen Walking/Running code rein.

    Spoiler anzeigen

    GML-Quellcode

    1. //Walking
    2. if(keyboard_check(vk_right) && place_free(x+4,y) && sprite_index != Player_attack)
    3. {
    4. sprite_index=Player_walk;
    5. image_xscale=1;
    6. hspeed=6;
    7. image_speed=0.25;
    8. }
    9. if(keyboard_check(vk_left) && place_free(x-4,y) && sprite_index != Player_attack)
    10. {
    11. sprite_index=Player_walk;
    12. image_xscale=-1;
    13. hspeed=-6;
    14. image_speed=0.25;
    15. }
    16. //Standing
    17. if (keyboard_check_released(vk_right) || keyboard_check_released(vk_left))
    18. {
    19. sprite_index=Player_stand;
    20. hspeed=0;
    21. }
    22. //Running
    23. if(keyboard_check(vk_right)&& (keyboard_check(vk_space) && place_free(x+4,y) && sprite_index != Player_attack))
    24. {
    25. for (i = 1; i <= 8; i += 1)
    26. {
    27. if (place_free(x+i,y) == true)
    28. hspeed += 0.7;
    29. }
    30. }
    31. if(keyboard_check(vk_left)&& (keyboard_check(vk_space) && place_free(x+4,y) && sprite_index != Player_attack))
    32. {
    33. for (i = 1; i <= 8; i += 1)
    34. {
    35. if (place_free(x+i,y) == true)
    36. hspeed -= 0.7;
    37. }
    38. }
    Alles anzeigen


    Danke schonmal an die die mir helfen können.

    PS: Bin neu hier im Forum und werde hier wahrscheinlich die nächste Zeit öfters aktiv sein^^
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.
  • Dein Problem lässt sich mit ein paar zusätzlichen Variablen relativ simpel lösen.

    Im Create Event des Spielers initialisiert du zwei neue Variablen:

    GML-Quellcode

    1. walk_right_control = 0:
    2. walk_left_control = 0;


    Im Step Event dann dies::

    GML-Quellcode

    1. if (keyboard_check_pressed(vk_left)) {
    2. walk_left_control += 15; // hier definierst du das Timeout
    3. if (walk_left_control > 20)
    4. walk_left(); // pseudo-code
    5. walk_left_control = 0;
    6. }


    Das gleiche mit rechts, und dann am Ende noch:

    GML-Quellcode

    1. if (walk_right_control > 0)
    2. walk_right_control -= 1;
    3. if (walk_left_control > 0)
    4. walk_left_control -= 1;


    Und voila, dein Problem sollte nach ein wenig rumspielen mit den Werten gelöst sein.

    Die Funktionsweise: Man erstellt für jeder der Tasten eine Kontrollvariable, welche nach dem Auslösen jener erhöht wird.
    Jeden Step wird der Wert der Kontrollvariablen aber gleichzeitig verringert, was bewirkt das dein Player nach zweifachem Auslösen der gleichen Taste in einem genug kurzen Interval korrekt reagieren sollte.

    Edit: Entschuldige um etawige Fehler im Code, dieser Beitrag wurde mit einem iPad verfasst.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von cafaxo ()

  • Hehe, Willkommen, willkommen! :)

    EDIT: Ohhh >___< okey... hab was in deiner Frage übersehen. Cafaxo's Methode ist die richtige und einfachere in dem Fall.


    Es gibt da wohl verschiedene Methoden dein Problem zu lösen. Am besten ginge das aber wohl über ein paar Hilfsvariablen und alarmen.

    Hier mal für die Links-bewegung. Die andere Richtung kannst du dann genau nach dem selben Schema machen.
    In das pressed-event für die Links-Taste sollte beim ersten Drücken eine Variable gesetzt werden die anzeigt dass gedrückt wurde. Wenn diese Variable aber schon anzeigt das einmal gedrückt wurde, beginntd er Spieler demeentsprechend zu rennen. Außerdem muss man noch einen Alarm setzen der die Variable nach einer toleranz-Zeit zurücksetzt (also Zeitspanne zwischen dem ersten und dem zweiten Drücken.

    Der Code könnte in etwa so aussehen:

    GML-Quellcode

    1. if leftpress = 0
    2. {
    3. leftpress = 1;
    4. arlarm[0] = 40;
    5. }
    6. else
    7. {
    8. leftrunning = 1;
    9. }

    Im Alarm kommt nur

    GML-Quellcode

    1. leftpress = 0;
    Außerdem sollte man im left-release event die leftrunning-Variable ebenfalls wieder auf 0 setzen damit der Spieler nicht für immer läuft.

    In deinem step-event kannst du dann nun mittels der Variable leftrunning die Geschwindigkeit beim rennen erhöhen.
    Vergiss auch nicht all diese Variablen im create-event mit 0 zu initialisieren.

    Hoffe das funktioniert bei dir und dass ich nichts vergessen habe..

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

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

  • Wow die Antwort kam ja ziemlich schnell.
    Im großen und ganzen funktioniert es auch.
    Nur gibt es jetzt ein Problem, undzwar bewege ich mich nur wenn ich die Taste gedrückt halte nachdem ich also beispielsweise 2x mal links drücke muss ich nochmals links gedrückt halten damit ich mich bewege. Hängt wahrscheinlich damit zussammen dass ich im code auch ein keyboard check released drin habe, nur den kann ich ja nicht entfernen da ich mich ja sonst auch im Walking zustand durchgehend bewegen würde. Also wie kann man das Problem jetzt lössen?

    Vieleicht hab ich ja auch einfach etwas falsch gemacht?
    Code:
    Spoiler anzeigen

    GML-Quellcode

    1. //Standing
    2. if (keyboard_check_released(vk_right) || keyboard_check_released(vk_left))
    3. {
    4. sprite_index=Player_stand;
    5. hspeed=0;
    6. }
    7. //Walking/Running
    8. if (keyboard_check_pressed(vk_left)&& place_free(x-4,y) && sprite_index != Player_attack)
    9. {
    10. walk_left_control += 100;
    11. if (walk_left_control > 150)
    12. for (i = 1; i <= 8; i += 1)
    13. {
    14. if (place_free(x+i,y) == true)
    15. hspeed -= 1;
    16. }
    17. else
    18. {
    19. sprite_index=Player_walk;
    20. image_xscale=-1;
    21. hspeed=-6;
    22. image_speed=0.25;
    23. }
    24. }
    25. if (keyboard_check_pressed(vk_right)&& place_free(x+4,y) && sprite_index != Player_attack)
    26. {
    27. walk_left_control += 100;
    28. if (walk_left_control > 150)
    29. for (i = 1; i <= 8; i += 1)
    30. {
    31. if (place_free(x+i,y) == true)
    32. hspeed += 1;
    33. }
    34. else
    35. {
    36. sprite_index=Player_walk;
    37. image_xscale=1;
    38. hspeed=6;
    39. image_speed=0.25;
    40. }
    41. }
    42. if (walk_right_control >= 0)
    43. walk_right_control -= 5;
    44. if (walk_left_control >= 0)
    45. walk_left_control -= 5;
    Alles anzeigen
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.
  • Erstelle nochmals zwei zusätzliche Variablen im Create Event:

    GML-Quellcode

    1. walking_left = false;
    2. walking_right = false;


    Setze diese nach dem jeweiligen Auslösen auf true (auch mit der anderen Seite):

    GML-Quellcode

    1. if (keyboard_check_pressed(vk_left)) {
    2. walk_left_control += 15; // hier definierst du das Timeout
    3. if (walk_left_control > 20) {
    4. walking_left = true;
    5. walk_left_control = 0;
    6. }
    7. }


    Und verwende schlussendlich dies:

    GML-Quellcode

    1. if (walking_left && place_free(x + 4, y) && sprite_index != Player_attack)) {
    2. for (i = 1; i <= 8; i += 1) {
    3. if (place_free(x + i, y))
    4. hspeed -= 0.7;
    5. }
    6. }


    Den Rest überlasse ich aus Übung dir.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von cafaxo ()

  • Vielen Dank, funktioniert jetzt alles wie geplant. ^^

    EDIT: Noch eine kurze Frage am Rande: Wie prüfe ich ab ob mein Player den Boden berührt(Ich will dass mein Player diagonal weiterfliegt und bei boden berührung das laufen beendet)?

    Dachte das geht irgwie so in der richtung:

    if (keyboard_check_pressed(vk_left)||keyboard_check_pressed(vk_up) && walking_right = true)
    {
    walking_right=false;
    if (boden1_gras.y = Player.y)
    {
    hspeed=0;
    }
    }

    aber leider funktioniert dies nicht.
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von DragonXZ ()

  • Niemand eine Ahnung wie man überprüft ob die "Beine" meines Spieler das objekt also den "Boden" unter sich berührt?
    Müsste eigentlich ganz simpel sein, doch ich komm einfach nicht drauf, ich hab es bis jetzt schon mit :

    if position_meeting(x,y+1,boden1_gras)

    if place_meeting(x,y+1,boden1_gras)

    if position_free(x,y+1)

    probiert.


    Hat sich erledigt habs nun endlich geschafft :pinch:
    Imagine taking your usual two century long nap minding your own business when suddenly some cunt wakes you up.
    You tell him to f*ck off of course but just when you finally managed to fall asleep again the same asshole comes knocking again. I'd attack that dick too.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von DragonXZ ()