Verschachtelung Create Events

  • GM 8

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

  • Verschachtelung Create Events

    Hi,

    habe ein kleines Problem bzw. eine Frage zu verschachtelte Create-Events.
    [hide="Objekt Struktur (etwas vereinfacht):"]obj_ur_parent

    >obj_parent_1
    >>obj_1a
    >>obj_1b

    >obj_parent_2
    >>obj_2a
    >>obj_2b[/hide]

    [hide="obj_ur_parent Create Event:"]

    GML-Quellcode

    1. [...]
    2. switch (self.object_index)
    3. {
    4. case obj_parent_1: scr_parent_1_init(); break;
    5. case obj_parent_2: scr_parent_2_init(); break;
    6. default: break;
    7. }
    8. spr_current = spr_reload;
    9. [...]
    Alles anzeigen
    [/hide]
    [hide="scr_parent_1_init:"]

    GML-Quellcode

    1. [...]
    2. switch (self.object_index)
    3. {
    4. case obj_1a: scr_1a_init(); break;
    5. case obj_1b: scr_1b_init(); break;
    6. default: break;
    7. }
    8. [...]
    [/hide]
    [hide="scr_1a_init:"]

    GML-Quellcode

    1. spr_reload = spr_reload_1a;
    [/hide]
    [hide="scr_1b_init:"]

    GML-Quellcode

    1. spr_reload = spr_reload_1b;
    [/hide]
    [hide="scr_parent_2_init scr_2a_init scr_2b_init:"]

    GML-Quellcode

    1. //analog zu den Vorgängern
    [/hide]
    Wenn ich jetzt ein obj_1a in den room setze bringt er mir die Fehlermeldung, dass die Variable spr_reload nicht gefunden wird. Die parents hab ich alle gesetzt und die Variablennamen hab ich auch kontrolliert.

    Müsste das nicht normal folgendermaßen ablaufen?

    obj_1a wird created und ruft das parent-create-event von obj_parent_1 auf, welches wiederum das parent-create-event von obj_ur_parent aufruft. Hier wird nun überprüft welches Objekt gerade erstellt wurde. Aha, ein obj_parent_1. Also wird scr_parent_1_init aufgerufen, wo wiederum festgestellt wird, dass es sich um ein obj_1a handelt und somit scr_1a_init aufgerufen wird. Hier wird der Variable spr_reload das Sprite (oder genauer gesagt die Sprite-ID) zugewiesen. scr_1a_init wird beendet, und zurück gehts in das Script scr_parent_1_init, welches auch beendet wird. Übrig bleibt die Zuweisung spr_current = spr_reload, was jedoch nicht zu funktionieren scheint.
    [hide="Zusammenfassung:"]-> obj_1a.create
    -> obj_parent_1.create
    -> obj_ur_parent.create
    -> object_index = obj_parent_1
    -> scr_parent_1_init
    -> object_index = obj_1a
    -> scr_1a_init
    -> spr_reload = spr_reload_1a
    -> spr_current = spr_reload
    -> Fehler[/hide]
    Hab auch versucht, das Sprite im obj_ur_parent Create Event mit spr_reload = noone; zu initialisieren, aber dann kann er kein nicht existierendes Sprite zeichnen, weil irgendwie nur die "noone"-Zuweisung stattgefunden hat.

    Bin für jede Hilfe, jeden Hinweis dankbar
    "Es gibt nie ein glückliches Ende, denn es endet nichts." - Schmendrick
  • Danke für die schnelle Antwort.

    Aber laut Hilfe muss man das

    GML-Quellcode

    1. event_inherited()

    nur ausführen, sobald im Child-Objekt ein Event mit Actions existiert, welches auch im Parent-Objekt vorkommt. Außerdem wird hier nur das UR-Parent-Create-Event aufgerufen. Von dem aus werden ja nur Scripte ausgeführt, keine Events...

    Edit: hab mal ne Beispiel-Datei hochgeladen.
    Dateien
    "Es gibt nie ein glückliches Ende, denn es endet nichts." - Schmendrick

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Klaus C. Haber ()

  • Also ich hab mir die Codes mal angeschaut (mehr nicht) und ich denke du solltest wie andre111 gesagt hat, event_inherited() benutzen. Das würde das Problem wahrscheinlich um einiges vereinfachen. Warum so kompliziert?
    EDIT: Achja, der Fehler war, dass object_index niemals obj_parent_1 bzw. -_2 ist. Siehe object_get_parent().
  • Super! Riesen Dank copyboy! Hat mit object_get_parent() funktioniert.

    Mein Problem war, dass ich der Meinung war:
    (voriges Beispiel mit object_index von obj_1a)

    object_index = obj_1a -> true
    object_index = obj_parent_1 -> true
    object_index = obj_ur_parent -> true


    copyboy schrieb:

    Warum so kompliziert?

    Bin grad dabei, eine TowerDefense zu machen. Da hab ich verschiedene Gebäudetypen, wie Turm, Mauer, usw. Natürlich gibts auch verschiedene Türme und verschiedene Mauern. Weil z.B. das Zeichnen von jedem Gebäude gleich abläuft, hab ich das Zeichnen-Skript ins Gebäude-Parent-Objekt reingepackt. Türme haben natürlich andere Eigenschaften als Mauern, ergo wieder zwei Objekte mit verschiedenen Initialisierungs-Skripts. Da aber jeder einzelne Turm ein eigenes Sprite besitzt, muss ich den Türmen dieses wieder zuordnen. Jeder Turm, jede Mauer, jedes Gebäude besitzt nun eine Variable, sagen wir mal: spr_stand, der das jeweilige Stand-Sprite zugewiesen wird. Nun kann ich bequem im Parent-Objekt auf die jeweiligen Sprites mit spr_stand zugreifen.

    Kurz gesagt: Damit ich nicht in allen (Parent-)Objekten die Events zuordnen muss, packe ich alles in ein (oder mehrere) Skripte, welche ich nur vom UR-Objekt ausführen brauche. Das Objekt, oder genauer gesagt der object_index dient mir lediglich, um zu sehen, wie meine Objekte und Instanzen initialisiert werden müssen.
    "Es gibt nie ein glückliches Ende, denn es endet nichts." - Schmendrick