mp_potential_step collisions mit eigenen instancen

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

  • mp_potential_step collisions mit eigenen instancen

    Meine Gegner bleiben gerne mal stecken wenn sie sich collidieren, dass passiert meist immer beim Spawnen. Sehr ärgerlich und ich weiss nicht wie ich das umgehen kann, oder fixen falls es passiert, dass sie automatisch auseinander gehen?

    Ich benutze jeglich im Stepevent von den Gegner diese Function:

    GML-Quellcode

    1. ​mp_potential_step_object(player.x, player.y, spd, enemy);

    Habe kein Collision-Event.
    huhu
  • probier doch erstmal was simples wie

    GML-Quellcode

    1. if (place_meeting(x,y,enemy)) {
    2. x = xprevious;
    3. y = yprevious;
    4. }


    EDIT:
    Hier noch was, aber ohne Gewähr :

    GML-Quellcode

    1. ///scr_push()
    2. got_moved = true;
    3. var collision_rad = 64;
    4. var ilist = ds_list_create();
    5. with (par_dynamic) {
    6. if (!got_moved)
    7. if (point_distance(x,y,other.x,other.y) <= collision_rad) {
    8. ds_list_add(ilist,id);
    9. }
    10. }
    11. while (!ds_list_empty(ilist)) {
    12. var ins = ds_list_find_value(ilist,0);
    13. ds_list_delete(ilist,0);
    14. with (ins) {
    15. got_moved = true;
    16. var pd = point_direction(other.x,other.y,x,y);
    17. var pp = point_distance(other.x,other.y,x,y);
    18. var xlen = lengthdir_x(pp,pd);
    19. var ylen = lengthdir_y(pp,pd);
    20. x += xlen;
    21. y += ylen;
    22. scr_push();
    23. }
    24. }
    Alles anzeigen

    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:

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

  • Ah ja klevere idee mit "previous" . Hab das nun mal im Stepevent oder im Collisionevent ausprobiert, aber leider keine Verbesserung.
    Sonst noch eine Idee?

    EDIT: Oh was ist das?!? Danke für den Script, aber der ist noch nicht ganz vollständig, wann wird denn got_moved mal auf false gestellt? Und ich nehme an bei par_dynamic nehme ich mein Objekt enemy Kannst Du mir bitte sagen wie ich den scr_push richtig einbaue. Und den gleichen Script im Script nochmals ausführen führt zum total crash =O
    huhu

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

  • par_dynamic ist in deinem Fall der Enemy, ja.
    Damit Das ganze Funktioniert muss im Step got_moved = false gesetzt werden.

    Das ganze sollte Rekursiv durchlaufen, aber nur maximal einmal pro Instanz
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • God_moved = false also im StepEvent. Dann wird also scr_push(); im CollsisioEvent mit Enemy selber ausgeführd, oder?
    Das heisst wenn sich die zwei selben Objekte Enemy kollidiere bzw. die spriteMask aufeinander liegen und sie eben steckenbleiben wird scr_push() bei beiden ausgeführt.

    Es geht nicht. Hast du das denn schon getestet, ist das aus einem deinen Projekten?


    Ich hab momentan nur im StepEvent von Enemy (und kein CollisionsEvent) das stehen:

    GML-Quellcode

    1. if place_meeting(x,y,enemy) {
    2. got_moved = false;
    3. var id_collid = instance_nearest(y, y, enemy);
    4. var pd = point_direction(id_collid.x,id_collid.y,x,y);
    5. var pp = point_distance(id_collid.x,id_collid.y,x,y);
    6. var xlen = lengthdir_x(pp,pd);
    7. var ylen = lengthdir_y(pp,pd);
    8. x += xlen/3;
    9. y += ylen/3;
    10. }
    11. } else {
    12. got_moved = true;
    13. }
    14. if got_moved { mp_potential_step_object(player.x, player.y, spd, enemy); }
    Alles anzeigen


    Das funktioniert so weit, dass sie sich währen der Kollision zusammen bewegen und wegstossen, aber dann so weit, dass sie aus der sicht fliegen. Wenn nur EINER von den Beiden sich wegstossen würde, dann wäre es glaube ich perfekt. Das heisst, wie kann ich sagen, wenn sich hier diese zwei ID aufeinander treffen, dass nur einer von ihnen den Code ausführen darf, nicht beide?
    huhu

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

  • Es sollte eigentlich funktionieren. das script kannst du jeden step ausführen, das got_moved = false muss danach gesetzt werden.
    Wenn es immer noch nichht klappt musst du vlt mal das projekt hochladen
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Puuh ich habs gelöst, aber auf einem anderen weg - mir eher verständlichem :)

    script: push_next()

    GML-Quellcode

    1. ///push_next();
    2. if place_meeting(x,y,enemy) {
    3. if (image_xscale) {var id_collid = nearest_left(enemy)}
    4. else { var id_collid = nearest_right(enemy)}
    5. id_collid.x -= 3*image_xscale;
    6. id_collid.got_moved = false;
    7. } else {
    8. got_moved = true;
    9. }
    Alles anzeigen

    und nearest_left bzw. nearest_right ist ein Script, der die ID des aller Nähesten aufnimmt.

    Jetzt lauft der Hinterste einfach nach hinten aus der Kollisionsmask
    huhu

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