Kollisons Problem

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

  • Kollisons Problem

    Hallo und einen schönen Abend,

    kurze Frage, weil ich hier gerade nicht mehr Weiterkomme und schon probiert habe was mein Hirn herzugeben hat. :thumbsup:

    Ich habe ein ENEMY-PARENT_OBJ an welchem ENEMY1_OBJ usw. dran hängen die lediglich einen STEPEVENT-CODE aus diesem PARENTOBJECT beziehen. In den ENEMY!_OBJ habe ich im STEP-EVENT natürlich darauf geachtet, dass event_inherented() davor steht.

    In meinem PLAYER_OBJ und dem WAFFENBULLET_OBJ habe ich einen KOLLISIONS-EVENT mit dem ENEMY-PARENT_OBJ festgelegt:

    Quellcode

    1. if instance_exisits(obj_enemy1) obj_enemy1.id.life -= 5;
    2. if instance_exisits(obj_enemy2) obj_enemy1.id.life -= 5;


    Weil ja die Kollision mit dem Parentobjekt besteht, aber auf die eigentlich dargestellte Enemy-Instanz zugegriffen werden soll.

    Die ENEMY-Objekte erzeuge ich via Controller der bei einem Alarm die Feinde erzeugt.

    Das Problem ist, dass wenn ich mit dem WAFFENBULLET_OBJ auf ein ENEMY_OBJ schieße, irgendwo anders ein ENEMY_OBJ explodiert (ggf. weil es schon aus dem Bildschirm raus ist). Wenn der Player sogar mit einem ENEMY_OBJ kollidiert, explodieren alle ENEMY_OBJ des gleichen Typs sofort.

    Ansonsten funktioniert alles prima, eben nur diese Sache mit der Kollision nicht? ?(

    Gruß pestamoebe.
    Dieser Beitrag wurde ausgezeichnet mit einem großen LOB.
  • obj_enemy1 gibt dir nur immer das zuletzt erstelle obj_enemy1, nicht unbedingt dass welches du auch gerade triffst.

    GML-Quellcode

    1. collisionID = collision_line(x,y,x+hspeed,y+vspeed,obj_parent_enemy,0,1);
    2. if collisionID != noone
    3. {
    4. with(collisionID)
    5. {
    6. life -= 5;
    7. if life <= 0
    8. {
    9. instance_destroy();
    10. }
    11. }
    12. }
    Alles anzeigen


    mit dem code in der bullet, kannst bekommst du genau die ID der instanz zurück mit der du kollidierst und kannst alles mit ihr anstellen was du möchtest :)

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • @Aku_Ryou
    Der yoyo doc zufolge ist es das erste Objekt, nicht das letzte:
    imagine that you want to move all the ball objects in your game 8 pixels. You may think that this is achieved simply by the following piece of code:

    obj_ball.y = obj_ball.y + 8;

    But this is not correct, as the right side of the assignment gets the value of the y-coordinate of the first ball and adds 8 to it. Next this new value is set as y-coordinate of all balls, so the result is that all balls get the same y-coordinate,
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Hallo zusammen,

    ich habe eure Vorschläge ausprobiert. -- Konnte aber keine Lösung herbeiführen, so dass ich mal ein paar mehr Infos einwerfe.

    o_player Collisionsevent


    Inhalt der Funktion/Skript: scr_enemies_col(value):


    Quellcode

    1. ///Enemey Parent Object
    2. ///behavoir of all enemies
    3. if (y > room_height + 128) {
    4. instance_destroy();
    5. } else if (life <= 0) {
    6. show_debug_message('Live less than 0' + '//' + string(life) + '//' + string(id));
    7. instance_create(x, y, o_explosion_1);
    8. //score adding
    9. if instance_exists(o_asteroid) global.playerScore += o_asteroid.id.setScore;
    10. if instance_exists(o_drone) global.playerScore += o_drone.id.setScore;
    11. if instance_exists(o_turretBase) global.playerScore += o_turretBase.id.setScore;
    12. if instance_exists(o_turretTower) global.playerScore += o_turretTower.id.setScore;
    13. //score adding end
    14. instance_destroy();
    15. }
    Alles anzeigen


    Und so spawn(en) die Objekte

    Quellcode

    1. ///create enemies
    2. //time to next wave of enemies
    3. alarm[0] = random_range(room_speed*5, room_speed*2);
    4. ///limited loop
    5. repeat(i) {
    6. //is place emty loop?
    7. do {
    8. var xx, yy;
    9. xx = random_range(32, room_width-32);
    10. yy = random_range(-32, -256);
    11. //limited loop counter
    12. if i < 12 i++;
    13. } until place_empty(xx, yy)
    14. //if place empty found :: create the instances
    15. instance_create(xx, yy, choose(o_asteroid, o_drone, o_turretBase));
    16. show_debug_message('I created a loop. ' + string(i) + ' in this loop count.')
    17. }
    Alles anzeigen


    Woran liegt es nun, dass alle Feinde vom selben Typ immer gleichzeitig explodieren?

    Gruß pestamoebe
    Dieser Beitrag wurde ausgezeichnet mit einem großen LOB.
  • Dein Kollisionsskript weiß immer noch nicht mit welchem Objekt es denn nun eigtl kollidiert. Wenn du sagst, with(o_asteroid) dann wird es für alle asteroiden ausgeführt. if instance_exists(o_asteroid.id) (<-- das wird dir immer true ergeben, bis alle asteroiden zerstörtwurden).

    Du kannst im script die id mit der du kollidierst mitschicken und das script wäre dadurch drastisch kürzer:

    GML-Quellcode

    1. ///kollision Event parent
    2. scr_enemies_col(other,15);//other ist im kollisionsevent immer die id des objects mit dem du kollidierst
    3. ///scr_enemies_col
    4. with(argument0)
    5. {
    6. life -= argument1;
    7. }


    das wars mehr musst du nicht machen :) egal womit du kollidierst, gehört es zu dem parent enemy object verliert es Lebenspunkte

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Danke Aku_Ryou das es so leicht ist hätte ich nicht gedacht. Ich denke einfach zu kompliziert ... :headtouch:

    Jetzt funktioniert es wunderbar. Danke auch für Deine Erklärung von other, irgendwie war ich da auf falsch auf den Trichter gekommen.
    Dieser Beitrag wurde ausgezeichnet mit einem großen LOB.