Jump and Run fehler - Ecke

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

  • Jump and Run fehler - Ecke

    Hallo zusammen,

    ich habe ein Problem mit meiner Jump and Run Steuerung:

    Wenn ich mit meiner Figur, auf eine Ecke springen lasse, hab ich manchmal den Fehler, dass meine Figur ~ 1000 Pixel nach oben bewegt (gespawnt) wird.

    Ich arbeite mit einer Aniehung (einer steigender Geschwindigkeit) und wenn ich nach rechts Drück bewegt sich die Figur fixe 4 Pixel nach rechts ( wenn der Platz dort frei ist) (mit place_free(x+4,y))

    in meinem Collisionsevent mit meiner Wand steht:

    move_contact_solid(direction,-1);
    vspeed = 0;

    Ich habe zudem eine feste Collisionsmaske für meine Figur.

    hat jmd. eine Idee wie ich meine Fehler behebe? Oder vlt. alternative eine gute Jump and Run engine?

    grüße
    Yohsi ^^
  • das Problem in dem Code ist, das du die Figur per

    GML-Quellcode

    1. move_contact_solid(direction,-1);

    zum nächsten festen Objekt in Bewegungsrichtung bewegst.

    Wenn also zu dem Zeitpunkt wo du das ausführst kein festes Objekt in Spielerrichtung nahe ist, dann kann es sehr weit bewegt werden.
    Wie du das beheben kannst, ist indem du dem "move_contact_solid(direction,-1);" ein Limit gibst:

    GML-Quellcode

    1. move_contact_solid(direction,20);

    So würdest du maximal 20 Pixel bewegt werden.

    Außerdem hast du ja gesagt, das es immer nach oben bewegt wird, dies spricht dafür, dass die "direction" in dem moment nach oben ausgerichtet ist. Daher schätze ich das er trotz der Codeverbesserung immernoch kleine Fehler aufweisen wird. Um das zu beheben würde ich gerne noch das "Step-Event" des Spielers sehen.
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • Hallo Larsi:

    Mein Step Event:

    GML-Quellcode

    1. ...
    2. if place_free(x,y+1) && global.gravity > 0 || global.gravity < 0
    3. gravity = global.gravity; // Z.b. 0.25
    4. else
    5. {
    6. gravity = 0;
    7. jumping = 0;
    8. }
    9. if hspeed > 0
    10. {
    11. hspeed -= 0.05;
    12. image_speed = hspeed/15;
    13. }
    14. if hspeed < 0
    15. {
    16. hspeed += 0.05;
    17. image_speed = -hspeed/15;
    18. }
    19. if hspeed = 0
    20. sliding = 0;
    21. else
    22. sprite_index = ani_player_sliding;
    23. mask_index = spr_player_mask_crouch;
    24. }
    25. else if sliding = 0 && spawn = 0 && dead = 0 // Steuerung
    26. {
    27. ...
    28. if ((keyboard_check_direct(ord('A')) && !keyboard_check_direct(ord('D'))) || (gamepad_button_check(0,gp_padl) && !gamepad_button_check(0,gp_padr))) && place_free(x-4,y)
    29. {
    30. if crouch = 1 && jump = 0
    31. x -= 1;
    32. else if sneek = 1 && jump = 0
    33. x -= 1;
    34. else
    35. x -= 2;
    36. run = 1;
    37. dir = -1;
    38. }
    39. else if ((!keyboard_check_direct(ord('A')) && keyboard_check_direct(ord('D'))) || (!gamepad_button_check(0,gp_padl) && gamepad_button_check(0,gp_padr))) && place_free(x+4,y)
    40. {
    41. if crouch = 1 && jump = 0
    42. x += 1;
    43. else if sneek = 1 && jump = 0
    44. x += 1;
    45. else
    46. x += 2;
    47. run = 1;
    48. dir = +1;
    49. }
    50. else
    51. run = 0;
    52. ...
    53. if vspeed >0
    54. jumping = 0;
    55. if vspeed >= 6
    56. vspeed = 6;
    57. if vspeed <= -6
    58. vspeed = -6;
    59. if place_free(x,y+1) && global.gravity > 0 || global.gravity < 0
    60. gravity = global.gravity;
    61. else
    62. {
    63. gravity = 0;
    64. jumping = 0;
    65. }
    66. if jumping = 1
    67. vspeed -= 0.1;
    68. else if (keyboard_check_pressed(ord('W')) || gamepad_button_check_pressed(0,gp_face1)) && !place_free(x,y+1)
    69. {
    70. vspeed = -4;
    71. jumping = 1;
    72. }
    73. ...
    74. if place_free(x,y+1)
    75. jump = 1;
    76. else
    77. jump = 0;
    78. if keyboard_check_released(ord('W')) || gamepad_button_check_released(0,gp_face1)
    79. jumping = 0;
    80. ...
    81. // Animationen //
    82. ...
    83. }
    Alles anzeigen


    Endstep:

    GML-Quellcode

    1. x = round(x);
    2. y = round(y);


    Hab ein bischen was rausgenommen, aber ich denke dass ist das Wichtigste :)
    Würd mich freuen wenn du mir weiterhelfen könntest!

    grüße!