extrem physics dll collision

  • GM 8

    extrem physics dll collision

    Einige von euch kennen bestimmt die extrem Physics Dll/extention [ siehe maartenbaert.be/extremephysics/ ]
    Ich hoffe jemand kennt sich damit aus ich hab nähmlich ein Problem und zwar gibt es bei mir sowohl ssattisch e als auch dynamische objekte
    welche auch gut miteinander agieren . jetzt brauche ich in meinem side scroller aber eben auch noch bullets welche einfach nur in eine richtung fliegen sollen und bei einer collision kräfte wirken lassen und danach zerört werden. So Zum Problem:
    wie kann ich die Kugel/bullet zerstören lassen wenn sie mit z.b obj_parent_block kolidiert . da die standart gm funktiponen hierführ ja nicht geeignet sind
    :rage:
    Ähm ich denke du musst einfach deinen Körper(body) mit deinem Objekt zerstören.
    Am besten packst du die Destruction in das Destroy-Event von deinem Objekt rein.
    Also im Destroy-Event:

    GML-Quellcode

    1. ep_body_destroy(global.world,body_id);

    Und wenn dein Bullte-Objekt mit was auch immer kollidiert, dann zerstörst du es ganz normal per:

    GML-Quellcode

    1. instance_destroy();

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
    erst mal danke für die antwort .
    aber das meinete ich nicht . meine frage ist halt wie ich überhaupt
    eine collison abfragen kann mit extrem physics um dann eben dieses zerstören auszulösen
    :rage:
    ep_world_collision_test_...
    Ist der einfachste Weg. Es gibt, aber auch ep_shape_collision_test_... oder ep_collision_test_..., was allerdings etwas umständlich ist, wenn man nur testen will ob ein Boden unter einem Objekt existiert. Jedoch genauer bei komplizierteren Formen.
    Ich selbst nutze nur ep_world_collision_test_...

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
    Und wie genau muss ich die funktion jetzt benutzen wenn ich einfach eine aktion ausführen will wenn das obJ_bullet bzw sein body mit eben einem andren objekt bzw dem obj_kiste7 deren body kolidiert?
    :rage:
    ep_world_collision_test_... gibt dir zurück, wie viele Kollisionen es an der angegebenen Stelle gibt.
    Wenn du Code, bei Kollisionen bestimmter Objekte ausführen willst, dann musst du auf die Kollisionsfunktionen des GMs zurückgreifen.
    Oder du setzt bei der Erstellung eines Bodys eine User-Variable mit:

    GML-Quellcode

    1. ep_body_set_uservar(global.world,body,0,object_index);

    und fragst dann ab, mit welchem Body eine Kollision stattgefunden hat. Da musst du dann auf

    GML-Quellcode

    1. temp_body = ep_world_get_collision_body(global.world,index);

    zurückgreifen. index ist hierbei der Index des Bodys bei der Kollision (index = 0 ist der erste Körper).
    Um das Ganze mal "zusammenzufassen": Man könnte das ganze Problem nur mit ExtremePhysics-Funktionen lösen, und zwar auf diese Weise:
    Im :action_create: -Event deiner obj_kiste7 setzt du eine uservar für den Body, wie oben erwähnt.
    Dann könntest du das hier machen:

    GML-Quellcode

    1. var collisions,temp_body;
    2. collisions = ep_world_collision_test_box(global.world,20,10,x,y,0,0,1,1,0);
    3. if(collisions <= 0) break;//Falls es keine Kollision gibt spring raus
    4. temp_body = ep_world_get_collision_body(global.world,0);//Hol den ersten Body der Kollision
    5. if(ep_body_get_uservar(global.world,temp_body,0) == obj_kiste7){/*mach was*/}

    Wenn du alle Körper checken willst, dann machst du es per for-Schleife:

    GML-Quellcode

    1. var i, found,temp_body;
    2. found = false;
    3. for(i = 0; i < collisions && !found; i+=1){
    4. temp_body = ep_world_get_collision_body(global.world,i);
    5. found = ep_body_get_uservar(global.world,temp_body,0) == obj_kiste7;
    6. }
    7. if(found){ /*mach was*/}

    Um auf Nummer sicher zu gehen würde ich das Setzen der uservar in jedem Objekt machen, was von einem EP-Body manipuliert wird, da ich nicht genau weiß wie die DLL einen undefinierten Index verwaltet (das kannst du ganz einfach über Parents lösen).
    Du musst dir angewöhnen die Dokumentation genau zu lesen und die Examples richtig anschauen. Ich hab mir das ganze Zeug in 10 Minuten zusammengesucht. Das hättest du auch selber machen können.
    Noch so eine ausführliche Antwort gebe ich nicht. Und als Anfänger sollte man sowieso die Finger von DLLs lassen, bei denen man nur Bruchteile versteht.

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
    So ich hab mich jetzt mal ein bischen mit den scrips befasst un d denke das ich die funktionen soweit verstanden hab. aber es gibt da ein problem und zwar dass wenn sich objekte ja mit mehreren schritten pro step fortbewegen man die collision nicht mehr richtig auswerten kann .
    Ein Beispiel objekt a bewegt sich mit 10 pro step auf objekt b zu wenn sie kollidieren soll code c ausgeführt werden .
    da allerdings die abfrage nur 1 mal pro step durchgeführt wird tritt manchmal der fall ein dass objekt a die collision nicht mitkrigt weil sie zwischen den abfragen geschehen ist.

    Eine Lösung wäre natürlich die erhöhung des roomspeeds was allerdings auch nur bedingt helfen würde da dies den fehler nicht entfernt sondern nur lindert .
    :rage:
    Ein andere Lösungsvorschlag wäre:
    Du setzt bei den World-Settings die Argumente für die Velocity- und Position-Iteration höher:

    GML-Quellcode

    1. ep_world_set_settings(world,1,20,10,0,0,0, 0.5, 1);/*3. und 4. Argument sind normalerweise auf 20,10
    2. setzt du sie höher, wird die Simulation genauer*/

    Allerdings musst du aufpassen, da eine höhere Velocity- und Position-Iteration zu mehr CPU-Verbrauch führt.
    Da musst du halt ein wenig rumspielen, ich blick da selbst noch nicht ganz durch.

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
    Nein das ist leider nicht die Lösung denn die Ex.Physik funktionen funzen ja schnell genug nur dass ich die collisionsüberprüfung eben im normalen gm stem evebt machen mauss und das in abhängig von der geschwindigkeit verschieden oft auftretenden fällen nicht sschnell genug ist
    .
    Denn wenn sich eben ein objekt mit mehr als einem pixel pro secunde fortbewegt dann tritt eben manchmal der fall ein das das objekt schon abgeprallt ist befor überhaupt die collisions überprüfung kommt.
    :rage:
  • Benutzer online 1

    1 Besucher

  • Tags