Gleichzeitiges Ansprechen mehrerer Instanzen über collision_line

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

  • Gleichzeitiges Ansprechen mehrerer Instanzen über collision_line

    Hallo Community,

    Ich habe dieses Problem schon seit längerer Zeit, habe es aber immer wieder aufgeschoben, es zu fixen.

    Also es geht um eine Art Railgun in einem 2D Sidescroll Shooter. Diese schießt einen Laser, der immer bis zur nächsten Wand, beziehungsweise obj_block, geht. Dementsprechend geht er durch die Gegner hindurch und ich möchte nun, dass jeder Gegner getroffen wird.

    Das naheliegendste war da natürlich per collision_line Objekte bei den angesprochenen Gegnerinstanzen zu erstellen, die beim Gegner Schaden verursachen und dann verschwinden. Das Problem ist, dass hier immer eine anscheinend zufällige Instanz in dem collision_line Bereich angesprochen wird, aber die anderen nicht. Mit folgendem Code ist dies der Fall.

    GML-Quellcode

    1. with (collision_line(x,y,x+lengthdir_x(laserdistance,laserdirection),y+lengthdir_y(laserdistance,laserdirection),enemyparent,true,true))
    2. {
    3. b = instance_create(x,y,obj_hit)
    4. b.damage = 10
    5. }


    Abgesehen davon, habe ich schon gedacht, die collision mask einfach mit dem Laserstrahl zusammen zu vergrößern, dies möchte jedoch gar nicht funktionieren.

    Ich hoffe ihr könnt mir helfen oder vielleicht auch nur einen Denkanstoß oder Idee geben, wie ich dieses Problem weiter angehen kann. :D
  • Das funktioniert deswegen nicht, weil collision_line immer nur eine Instanz erkennt.
    Wenn du mehrere Instanzen erkennen willst die in einem bestimmten Bereich (Linie, Quadrat, was auch immer) sind, oder auch nur überprüfen willst ob sich zwei Instanzen die gleichen Koordinaten teilen,
    dann geht das mit den Kollisionsfunktionen nicht.
    Du könntest mit with alle Instanzen eines Objektes abfragen und deren X- und Y-Koordinaten auslesen, oder von jeder Instanz aus eine Collision Line zeichnen und deren Position und Ausrichtung anpassen (was aber sehr langsam ist - daher nicht zu empfehlen),
    oder einfach anstatt einer Collision Line ein unsichtbares Objekt (in Linienform), und beim Objekt das kollidiert eine Kollisionsabfrage mit diesem Objekt, einbauen.
    Es gibt sicher noch andere, auch mathematische Methoden, oder irgendetwas das ich übersehen habe, aber mehr fällt mir gerade im müden Zustand nicht ein.^^
  • Gute Ideen, aber irgendwie bekomme ich mit jeder Methode genau das selbe Ergebnis. Die Idee mit dem Objekt erstellen hatte ich auch schon, aber wie genau soll ich die Objekte genau auf der Linie erstellen ? Anscheinend brauche ich doch etwas konkretere Vorschläge :S
  • dede165 schrieb:

    Die Idee mit dem Objekt erstellen hatte ich auch schon, aber wie genau soll ich die Objekte genau auf der Linie erstellen ?

    Wenn du die Abfrage im Enemyobjekt machst (ob diese mit obj_line o.ä. kollidiert) sollte das doch kein Problem sein, nur musst du aufpassen dass du die aktuelle Instanz-ID,und nicht den object_index ansprichst.

    astrolux schrieb:

    Kannst du nicht einfach die Schuss-Linie Punkt für Punkt ablaufen (das ist Mathematisch ja nicht kompliziert) und dann für jeden Punkt (oder jeden 5ten Punkt) mit "collision_point" auf eine Kollision testen?

    Wäre vielleicht auch eine Lösung nur braucht es da eine zusätzliche Abfrage, ob eine bestimmte Instanz schon überprüft wurde,
    sonst werden über eine Instanz hinweg wohl mehrere obj_hit erstellt.
  • Du machst einfach deine collision line, wenn diese != noone ist setzt du deinen Schaden und dann deaktivierst du die instanz des gegnerobjekts. Das ganze in ner while schleife mit while(collision_line != noone). So erwichst du jeden gegner und die collision line wird so oft neu getestet bis alle gegner im weg deaktiviert sind. nach der schleife aktivierst du dann wieder alle instanzen

    GML-Quellcode

    1. var enemyList = ds_list_create();
    2. while (collision_line(x,y,x+lengthdir_x(laserdistance,laserdirection),y+lengthdir_y(laserdistance,laserdirection),enemyparent,true,true) != noone) {
    3. with (collision_line(x,y,x+lengthdir_x(laserdistance,laserdirection),y+lengthdir_y(laserdistance,laserdirection),enemyparent,true,true)) {
    4. // HP -= 8 bla bla
    5. ds_list_add(enemyList,id);
    6. instance_deactivate_object(id);
    7. }
    8. }
    9. while (!ds_list_empty(enemyList)) {
    10. var ins = ds_list_find_value(enemyList,0);
    11. ds_list_delete(enemyList,0);
    12. instance_activate_object(ins);
    13. }
    14. ds_list_destroy(enemyList);
    Alles anzeigen


    habs nicht getestet müsste aber klappen
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel: