Springen & Kollision

  • Win

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

  • Springen & Kollision

    Nabend zusammen

    Ich habe ein kleines Kollisionsproblem, auf das ihr sicher ne Antwort habt (hoffe ich :D ).

    Zwar programmiere ich einen kleines Splitscreen Jump&Run. In dem hat der Spieler die möglichkeit sich mit blöcken einzubauen.

    Der spieler steuert sich ganz klassisch so:

    GML-Quellcode

    1. ///Tastatur Steuerung 1
    2. if place_free(x,y+4)
    3. {
    4. gravity = 0.5
    5. gravity_direction = 270
    6. }
    7. else
    8. {
    9. gravity=0
    10. gravity_direction = 270
    11. }
    12. if place_free(x-4,y)and keyboard_check(vk_left)
    13. {
    14. walk_direction = "left"
    15. x-=4
    16. }
    17. if place_free(x+4,y)and keyboard_check(vk_right)
    18. {
    19. walk_direction = "right"
    20. x+=4
    21. }
    22. if !place_free(x,y+4)and keyboard_check_pressed(vk_up)
    23. {
    24. vspeed=-15
    25. }
    26. if keyboard_check_released(vk_up) && vspeed < 0
    27. {
    28. vspeed /= 5; //Kurzer Sprung
    29. }
    Alles anzeigen


    Und bei Kollision mit dem Boden benutze ich folgenden Code:

    GML-Quellcode

    1. move_contact_solid(direction,12);
    2. hspeed = 0
    3. vspeed = 0


    Nun hat der Spieler die möglichkeit per Tastentdruck einen block vor sich zu stellen. Das passiert bisher so:

    GML-Quellcode

    1. if walk_direction = "right"
    2. {
    3. if !place_free(x+32,y) {exit}
    4. if place_free(x+32,y)
    5. {
    6. instance_create(x+32,y,obj_block_block1)
    7. }
    8. }
    9. if walk_direction = "left"
    10. {
    11. if !place_free(x-32,y) {exit}
    12. if place_free(x-32,y)
    13. {
    14. instance_create(x-32,y,obj_block_block1)
    15. }
    16. }
    Alles anzeigen


    Diesen Block lass ich im EndStep ans Raster ausrichten mit der Drag&Drop Methode "Align to Grid" an das 32x32 Raster.

    Problem:
    Das ganze funktioniert super im stehen. Wenn ich nun aber hüpfe und mich gleichzetig richtung block bewege bleibt der spieler mitten im block stecken
    und beide Instanzen hängen in der Luft zussammen.

    Wie kann ich das lösen das sie in der Luft nicht zusammenprallen / aneinander kleben bleiben?

    Danke für Tipps / Tricks und Hilfestellungen :D

    Edit: 2 Screens zugefügt. Bild 1 = klappt im stehen gut Bild 2 = Spieler und block verheddern sich und nix geht mehr.
    Bilder
    • 1.png

      5,8 kB, 320×201, 403 mal angesehen
    • 2.png

      5,84 kB, 303×147, 321 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Atomicmaster () aus folgendem Grund: Screenshots hinzugefügt

  • Passiert mit Precise Collision Checking genauso leider.

    Ich tippe mal das der Fehler richtung Vspeed liegt.

    Edit:
    Bin immer noch gerne offen für Tipps / Snippets / Anregungen :)

    Wie löst ihr eure Kollisionsabfragen, oder Jump & Run Steuerung?

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

  • da du es auf 32x32 "snappen" lässt, wird das glaube ich nicht so wie du es gerne hättest. Eine Möglichkeit wäre es, dass man nur im "Stehen" Blöcke platzieren kann.
    Eine andere Möglichkeit ist es, den Block um 4 x weiter zu verschieben, wenn du läufst. Also z.B. so:

    GML-Quellcode

    1. if walk_direction = "right"
    2. {
    3. if !place_free(x+32,y) {exit}
    4. if place_free(x+32,y)
    5. {
    6. if place_free(x+4,y) and keyboard_check(vk_right) { instance_create(x+36,y,obj_block_block1) }
    7. else { instance_create(x+32,y,obj_block_block1) }
    8. }
    9. }

    Allerdings habe ich die Befürchtung, dass diese 4 weiteren x nichs ändern, weil das Grid auf 32x32 zu groß ist.
    Vielleicht funktioniert es auch, wenn du den Spieler, wenn er einen Block platziert um 4 oder 8 x wieder zurück teleportiert wird. Also so:

    GML-Quellcode

    1. if walk_direction = "right"
    2. {
    3. if !place_free(x+32,y) {exit}
    4. if place_free(x+32,y)
    5. {
    6. instance_create(x+32,y,obj_block_block1)
    7. x -= 4
    8. }
    9. }

    Wie gesagt musst du die 4 eventuell auf 8 oder höher erhöhen, da du den Block im End-Step ausrichten lässt.


    Hoffe eine Möglichkeit hilft dir :D

    MFG Dufner
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
  • Danke Dufner für deine Tipps und Anregungen :)

    Es lag tatsächlich an dem Snap to Grid. Aber eig. klar wenn ich im End Step das Snappen lasse das dann der Player mit drin hängt.
    Ich habe es nun einfach weg gelassen und bisschen was verändert mit Hilfe deiner Tipps und es funktioniert eig auch so ganz gut. Danke Dir :)