Jump & Run Schrägen (und Ecken)

  • GM 8

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

  • Jump & Run Schrägen (und Ecken)

    Hey, ich arbeite zurzeit an nem Platformer á la Super Mario. Generell funzt die Engine okay, mehrere Macken gibt es aber noch.

    Zur generellen Funktionsweise:
    Die Bewegung basiert auf Beschleunigung und Bremsung damit alles relativ fließend wirkt. Pfeiltaste drücken steigert die Speed um 0.5, dem entgegen wirkt eine Bremsung um 0.25 - funktioniert eher schön. Das Problem ist nun, dass alle meine Versuche die Hauptfigur Slopes hochlaufen zu lassen gescheitert sind.

    Der zugehörige Code sieht so aus (Step-Event des Spielers):

    GML-Quellcode

    1. // Horizontale Bewegung
    2. if keyboard_check(vk_shift)
    3. { // Sprint
    4. if keyboard_check(vk_left) && place_free(x-1,y) && hspeed > -maxrun
    5. {
    6. hspeed -= 0.5
    7. }
    8. else
    9. if keyboard_check(vk_left) && place_free(x-1,y)
    10. {
    11. hspeed -= 0.25
    12. }
    13. if keyboard_check(vk_right) && place_free(x+1,y) && hspeed < maxrun
    14. {
    15. hspeed += 0.5
    16. }
    17. else
    18. if keyboard_check(vk_right) && place_free(x+1,y)
    19. {
    20. hspeed += 0.25
    21. }
    22. }
    23. else
    24. { // Langsames Laufen
    25. if keyboard_check(vk_left) && place_free(x-1,y) && hspeed > -maxwalk
    26. {
    27. hspeed -= 0.5
    28. }
    29. else
    30. if keyboard_check(vk_left) && place_free(x-1,y)
    31. {
    32. hspeed -= 0.25
    33. }
    34. if keyboard_check(vk_right) && place_free(x+1,y) && hspeed < maxwalk
    35. {
    36. hspeed += 0.5
    37. }
    38. else
    39. if keyboard_check(vk_right) && place_free(x+1,y)
    40. {
    41. hspeed += 0.25
    42. }
    43. }
    44. // Horizontale Bremsung
    45. if hspeed > 0 then hspeed -= 0.25
    46. if hspeed < 0 then hspeed += 0.25
    47. if hspeed > maxwalk && not keyboard_check(vk_shift) then hspeed -= 0.5
    48. if hspeed < -maxwalk && not keyboard_check(vk_shift) then hspeed += 0.5
    49. // Wandkollision
    50. if vspeed > 0 && not place_free(x,y+vspeed*collsec)
    51. {
    52. vspeed = 0
    53. move_contact_solid(270,vspeed*collsec)
    54. jumpable = jumpmax
    55. }
    56. if vspeed < 0 && not place_free(x,y+vspeed*collsec)
    57. {
    58. vspeed = 0
    59. move_contact_solid(90,-vspeed*collsec)
    60. jumpable = 0
    61. }
    62. if hspeed > 0 && not place_free(x+hspeed*collsec,y)
    63. {
    64. hspeed = 0
    65. move_contact_solid(0,hspeed*collsec)
    66. }
    67. if hspeed < 0 && not place_free(x+hspeed*collsec,y)
    68. {
    69. hspeed = 0
    70. move_contact_solid(180,-hspeed*collsec)
    71. }
    Alles anzeigen


    Wäre cool wenn jemand wenigstens nen Lösungsansatz parat hätte.

    Zwei weitere Macken, die ich noch nicht gelöst habe sind btw., dass der Character an Ecken schonmal hängen bleibt (wenn man mit der eigenen Ecke exakt die Ecke einer Plattform trifft) und, dass der Spieler von vertikaler Bewegung manchmal scheinbar grundlos eine feste horizontale Bewegung von 0.5 kriegt. Letzteres ist für mich bislang unerklärlich, ersteres dürfte meiner Vermutung nach automatisch gelöst werden sobald das hoch laufen an Slopes integriert ist.

    Also, wäre für Hilfe dankbar.

    Edit: Nur damit Klarheit herrscht: Mir ist klar, dass dieser Code nichts enthält um den Chara Slopes hochlaufen zu lassen. Das ist bloß die beste einigermaßen solide Version, die ich soweit gebastelt habe.
  • Okay, ich hab mal vor einigen Jahren einen Code erstellt, der ziemlich gut, unabhängig von der Geschwindigkeit funktioniert, sollte also auch problemlos mit beschleunigen und bremsen funktionieren. Dieser Code geht allerdings nur für Schräglagen bis zu 45°:

    GML-Quellcode

    1. if(TotalSpeed==0) return 0;
    2. CurrentDir = sign(TotalSpeed)
    3. for(i=0;i<abs(Totalspeed);i+=1)
    4. {
    5. //schräg unten
    6. if(place_free(x+CurrentDir,y+1))
    7. {
    8. x+=CurrentDir;y+=1;
    9. }
    10. else
    11. //schräg oben
    12. if(place_free(x+CurrentDir,y-1))
    13. {
    14. x+=CurrentDir;y-=1;
    15. }
    16. else
    17. if(place_free(x+CurrentDir,y))
    18. {
    19. x+=CurrentDir;
    20. }
    21. else //irgendwo dagegengelaufen...
    22. {
    23. TotalSpeed=0;
    24. }
    25. }
    Alles anzeigen


    wobei Totalspeed die aktuelle Geschwindigkeit des Charakters ist. Wenn das eine Komma-Zahl ist, solltest du ein floor oder round drüberstülpen. Ich verzichte immer bewußt auf das verwenden von h_speed und Konsorten um mehr Kontrolle über einen Charakter zu haben. Dieser code geht übrigens nur, wenn sich dein Charakter gerade auf einer Platform befindet. In der Luft benutze ich normalerweise einen veränderten code.
    ...

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

  • Benutzer online 1

    1 Besucher