Nächstgelegende Ziele erfassen

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

  • Nächstgelegende Ziele erfassen

    Hallo

    Ich will ein Zielerfassungssystem wie beim Spiel Ikaruga das so funktioniert:

    Ich habe 16 Raketen gleichzeitig abgefeuert. Mein Schiff sucht nach dem nächstgelegenste Ziel, und greift es mit der zubenötige Menge von Raketen um es zu zerstören. Sollten noch Raketen übrigbleiben sucht er sich das nächste gelegenste usw. Hat man dann noch Raketen übrig werden diese einfach ins nichts verschoßen. Ich brauche nur den Code für die Zielerfassung.

    Ich hoffe ich hab es Ausführlich genug geschrieben
  • GML-Quellcode

    1. ziel=instance_nearest(x,y,gegner)

    am besten ins create event von den raketen oder beim abfeuern vom spiele.
    aber nicht ins step event von den raketen^^
    Die Schönheit liegt im Auge des Betrachters :D

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

  • Das entspricht nicht dem was ich haben will.
    Folgende Situation:

    Ich habe 16 Raketen und zwei Gegener. Der Erste ist näher als der andere und brauch 5 Raketen zur Zerstörung. Der Andere braucht 13 zur zerstörung. Der Erste wird zuerst (weil er am nächsten dran ist) mir 5 Raketen reserviert. Und dann erst der Andere mit 11 (Hab ja nur 16 Raketen).
  • Na dann tu den Code einfach ins Step Event. Dann suchen die Raketen ständig nach dem nächsten Gegner, auch wenn der erste nicht mehr vorhanden ist.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • oder diese Abfrage ins Step Event, dann folgt er dem Ziel solange, bis es tot ist und dreht nicht ab, wenn ein anderes Ziel in die Nähe kommt.

    GML-Quellcode

    1. if (!instance_exists(ziel) ziel=instance_nearest(x,y,gegner);
    Einige meiner Spiele:
  • Das Problem ist, dass es keinen Befehl für die zweitnächste Instanz gibt. Da musst du wohl per Schleife selber durch alle gegner Instanzen laufen und den Abstand mit dem Schiff abgfragen, das ganze in einer Liste sortieren, die übrigen Lebenspunkte abfragen und erst dann den Raketen die Ziele zuweisen. Zumindest wäre das meine grobe Idee.
    Einige meiner Spiele:
  • du kannst auch die gegner instanz die am nächsten ist
    wenn sie vollständig mit raketen bestückt ist ändern:

    z.b. instance_change(instance_nearest(x,y,obj_gegner),obj_gegner_fast_tot)

    dann wird er in der abfrage nicht mehr erfasst und die raketen fliegen zum 2. nächsten

    ciao
    iTeM
  • Warum instance_change? einfach eine Variable bei diesem gegner setzen, die dann überprüft wird! In etwa so (hab ich jetzt nicht getestet, aber als Denkanstoß zumindest sollte es genügen ;) )

    GML-Quellcode

    1. /*Create-Event des gegners*/
    2. rockettargets=5; //je nach gegner
    3. lives=rockettargets;
    4. /*Create Event des Objektes, wo die Raketen abgeschossen werden*/
    5. rockets=16;
    6. /*Event, wo die raketen abgeschossen werden sollen*/
    7. while(rockets>0)
    8. {
    9. do{
    10. target=instance_nearest(x,y,obj_gegner);
    11. }until(target.rockettargets>0)
    12. target.rockettargets-=1;
    13. rockets-=1; //Zieht eine Rakete vom Spieler ab
    14. //Hier Code um Rakete zu starten
    15. }
    16. /*Kollisionsevent Rakete mit Gegner*/
    17. other.lives-=1;
    18. instance_destroy();
    Alles anzeigen


    Wer Fehler findet kann sie sich an die Wand hängen.
    “Computers are good at following instructions, but not at reading your mind.” (Donald Knuth)

    Ich schreibe mit Neo.
  • @Bottlemeck

    Ok, das ist genial.

    Brauchte da noch nicht die While und Do - Until Schleifen.
    Nur warum hast du noch eine Varibale lives benutzt? Das hätte Rockettargets ersetzen können. Wozu 5 Raketen auf einen Gegner abfeueren der nur 4 Raketen braucht ;).

    Edit:

    Es gibt noch ein Problem unzwar:

    target=instance_nearest(x,y,obj_gegner)

    verändert sich nicht während der While Schleife.

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

  • ohja, denkfehler, meins funzt nicht, du brauchst du doch ein instance_change wie iTeM sagte.

    @lives/rockettargets: Die Rockettargets sind die Raketen die abgeschossen werden. Hab gedacht vielleicht willst du extra lives, die dann abgezogen werden wenn eine rakete TRIFFT. Dann kannst du nämlich machen, dass if(lives=0) instance_destroy(); den gegner zerstört, wenn er genügend oft getroffen wurde. Das gleiche mit rockettargets würde dazu führen, dass der gegner zerstörtr wird, wenn alle raketen abgeschossen wurden, und das ist ja nicht erwünscht.
    “Computers are good at following instructions, but not at reading your mind.” (Donald Knuth)

    Ich schreibe mit Neo.
  • Für Situationen wie diese gibt es: instance_deactivate_object(obj)

    Dann wird das objekt deaktiviert und nicht mehr gefunden. Dannach einfach noch instance_activate_all() und die sache hat sich gegessen.

    EDIT:

    Ich hab es hinbekommen! Ich hab das letzte "Element" in mein Game rein bekommen. *Freu*

    --GELÖST--

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