Gegner wiederbeleben nach Player-Tod

  • GM 8

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

  • Gegner wiederbeleben nach Player-Tod

    Hallo Leute,

    wenn mein Player in meinem Jump N Run einen Gegner tötet soll der Gegner verschwinden. Wenn der Player tot ist wird er mit

    GML-Quellcode

    1. x=xstart;y=ystart;


    wieder an den Anfang des Levels gesetzt.


    Nun zu meiner Frage:

    Wie mache ich es, das die Gegner die ich bis zum Tod des Players getötet habe (und die daraufhin verschwunden sind) wieder da sind (und zwar an ihrer Anfangsposition) wenn der Player wieder von vorne startet, nachdem er gestorben ist?

    Hoffe ihr versteht mein Problem und könnt mir helfen.

    Vielen Dank im Voraus!


    Gruß,
    Pascal
  • Das wird nicht klappen, jlsnews. xstart und ystart sind Variablen der ausführenden Instanz, nicht einer Instanz des Objektes, die du als dritten Parameter in instance_create angibst.
    Und was room_restart angeht, ist das auch ne relativ eklige Lösung, weil dann wirklich ALLE Instanzen neu erstellt und alle Create-Events nochmal ausgeführt werden - etwas, was man unter Umständen vielleicht vermeiden will. Als GML-Fortgeschrittener solltest du diese Dinge eigentlich wissen.

    @ Pascal:
    In einem meiner älteren Projekte hab ich das folgendermaßen gelöst: Statt instance_destroy() hab ich in den Objekten, die aus dem Level verschwinden sollten, einfach instance_deactivate_object(self) ausgeführt. Damit war das Teil einfach deaktiviert und hat auf das reset des Levels gewartet, wenn der Spieler draufgeht oder manuell neu startet.
    Beim Skript, in dem das neustarten gehandhabt wurde, schrieb ich dann

    GML-Quellcode

    1. instance_activate_all();
    2. with par_actors{
    3. x=xstart;
    4. y=ystart;
    5. event_perform(ev_create,ev_create);
    6. }

    par_actors war dabei das Parent-Objekt für alle Objekte im Spiel, die kein controller-Objekt, statischer Teil des Hintergrunds oder Dekoration waren - sondern halt Gegner, Items, Schalter, etc. etc.
    Und in den jeweiligen Create-Events hab ich dann eben solche Sachen wie die Lebensenergie der Gegner, den Zustand eines Schalters, den Typ eines Items und so weiter festgelegt.

    Vielleicht kannst du das ja für dein Spiel adaptieren.
  • jlsnews schrieb:

    Wenn 1 Room = 1 Level:

    GML-Quellcode

    1. room_restart();


    ansonsten:

    GML-Quellcode

    1. instance_create(xstart,ystart,obj_feind);
    Danke für Deine Antwort, aber das funktioniert nicht aus den Gründen die Irrenhaus 3 schon erläutert hat.

    Irrenhaus3 schrieb:

    Das wird nicht klappen, jlsnews. xstart und ystart sind Variablen der ausführenden Instanz, nicht einer Instanz des Objektes, die du als dritten Parameter in instance_create angibst.
    Und was room_restart angeht, ist das auch ne relativ eklige Lösung, weil dann wirklich ALLE Instanzen neu erstellt und alle Create-Events nochmal ausgeführt werden - etwas, was man unter Umständen vielleicht vermeiden will. Als GML-Fortgeschrittener solltest du diese Dinge eigentlich wissen.

    @ Pascal:
    In einem meiner älteren Projekte hab ich das folgendermaßen gelöst: Statt instance_destroy() hab ich in den Objekten, die aus dem Level verschwinden sollten, einfach instance_deactivate_object(self) ausgeführt. Damit war das Teil einfach deaktiviert und hat auf das reset des Levels gewartet, wenn der Spieler draufgeht oder manuell neu startet.
    Beim Skript, in dem das neustarten gehandhabt wurde, schrieb ich dann

    GML-Quellcode

    1. instance_activate_all();
    2. with par_actors{
    3. x=xstart;
    4. y=ystart;
    5. event_perform(ev_create,ev_create);
    6. }

    par_actors war dabei das Parent-Objekt für alle Objekte im Spiel, die kein controller-Objekt, statischer Teil des Hintergrunds oder Dekoration waren - sondern halt Gegner, Items, Schalter, etc. etc.
    Und in den jeweiligen Create-Events hab ich dann eben solche Sachen wie die Lebensenergie der Gegner, den Zustand eines Schalters, den Typ eines Items und so weiter festgelegt.

    Vielleicht kannst du das ja für dein Spiel adaptieren.
    Danke das könnte funktionieren. Ich sehe nur insofern Schwierigkeiten, das ich alle Objekte im View aktiviere nachdem ich sie außerhalb des Views deaktiviert habe (um CPU Leistung einzusparen). Somit würden ja auch die getöteten Gegner wieder aktiviert werden... Ich muss also irgendwie eine Unterscheidung zwischen lebendigen und toten Gegner hinbekommen, damit ich diese aus der Aktivierung ausschließen kann.
  • Dann pack die ID der Instanzen, die du wieder aktivieren willst, in eine ds_list-Struktur und reaktivier via instance_activate_object(id) alle in dieser Liste gespeicherten Instanzen.
    Oder, wenn das nicht geht, halt andersrum: Erst alles reaktivieren, dann den Inhalt der Liste wieder deaktivieren. Das ist aber mehr Rechenaufwand, nach Möglichkeit solltest du also die erste Variante benutzen. ;)
  • Irrenhaus3 schrieb:


    Dann pack die ID der Instanzen, die du wieder aktivieren willst, in eine ds_list-Struktur und reaktivier via instance_activate_object(id) alle in dieser Liste gespeicherten Instanzen.
    Oder, wenn das nicht geht, halt andersrum: Erst alles reaktivieren, dann den Inhalt der Liste wieder deaktivieren. Das ist aber mehr Rechenaufwand, nach Möglichkeit solltest du also die erste Variante benutzen.
    Mit einer Liste habe ich noch nie gearbeitet. Kannst Du mir vielleicht bezogen auf mein Problem kurz aufzeigen wie sowas aussieht?
  • Selbstverständlich.

    Zuerst erstellst du beim Spielstart via ds_list_create() eine neue Liste, die du in einer globalen Variable ablegst und bei Spielende über ds_list_destroy wieder loswirst.
    In dem Codeteil, der ein Objekt bis zum Levelneustart deaktiviert, fügst du dann folgendes hinzu:

    GML-Quellcode

    1. ds_list_add(liste,self);
    2. instance_deactivate_object(self);


    Um beim Levelneustart dann die ganze Liste wie folgt zu reaktivieren:

    GML-Quellcode

    1. for(i=0;i<ds_list_size(liste);i+=1){
    2. instance_activate_object(ds_list_find_value(liste,i));
    3. }
    4. ds_list_clear(liste);


    Nach dem letzten Befehl ist die Liste wieder komplett leer und kann im nächsten Leben des Spielers wieder nur so vollgestopft werden mit umgenudelten Gegnern - oder was auch immer du sonst da reinpacken willst, es sollten halt instance-IDs sein. ;)
  • Benutzer online 1

    1 Besucher