Variablen an objekt weitergeben.

  • GM 8

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

  • Variablen an objekt weitergeben.

    Hi,
    ich arbeite ja seit letzterem wieder intensiver mit dem GM, nun beschäftigt mich eine Frage.
    Ist es möglich einem gerade erstellten Objekt eine interne Variable zu vererben?
    Hoffe ihr wisst was ich meine.

    Mit freundlichen Grüßen
    C5_Booster
  • Mit der "parent"-Zuweisung. Erstelle ein parent-Objekt und alle "tochter"-Objekte erben alle Events (create, step, ...) es sei denn du überschreibst diese events im "tochter"-Objekt durch eigene.

    gruß
    naibaf77
    True story!
  • Ne, soganz habs ich nicht gemeint, eher so..
    Mithilfe der Controll Instance erstelle ich die Block Instance, diese besitzt mehrene Zustände (z.b Erde, Stein usw),
    Mit dem Scrollrad leg ich dann bei der Controll Instance eine Variable fest (nennen wir sie "Zustand"), nun wird mit Linksklick die Block Instanc erstellt und die Variable Zustand zur neuerstellten Block Instance vererbt. Damit diese anschließend den jeweiligen Zustand annehmen kann.

    Mit freundlichen Grüßen
    C5_Booster
  • nur was schreibt man in die erstellte Instance rein?
    Erstmal solltes du im Create-event.
    die Variable eigenschaft nicht definieren.
    Sonst wird der Wert beim erstellen mit meinem Code
    sozusagen "Überschrieben".

    Falls das Object erstellt wird ohne die Variable eigenschaft festzulegen,
    solltes du im Create-event überprüfen ob diese Variable existiert. Wenn nicht
    wird sie definiert und mit einem Default Wert beschrieben.
    Das könnte so aussehen:

    GML-Quellcode

    1. if (!variable_local_exists('eigenschaft')) eigenschaft = 'erde'; // Hier wird der Block auf erde gestellt wenn er keine Eigenschaft bekommen hat.


    Im Step-event könntest du dann die Variable eigenschaft mit einem
    Switch-case abfragen:

    GML-Quellcode

    1. switch (eigenschaft) {
    2. case 'erde':
    3. sprite_index = spr_erde;
    4. break;
    5. case 'stein':
    6. sprite_index = spr_stein;
    7. break;
    8. case 'holz':
    9. sprite_index = spr_holz;
    10. break;
    11. }
    Alles anzeigen
    :saint:
  • Leider funktioniert der Ansatz nicht, die Variable wird nicht gefunden.

    obj_controll
    Create

    GML-Quellcode

    1. i = instance_create(x, y, obj_test);
    2. i.eigenschaft = 1;


    obj_test
    Create

    GML-Quellcode

    1. sprite_index = eigenschaft;


    Error Text
    Spoiler anzeigen

    Error in code at line 1:
    sprite_index = eigenschaft;
    ^
    at position 16: Unknown variable eigenschaft


    Mit freundlichen Grüßen
    C5_Booster
  • Wie wäre es, wenn du dem Controller eine Variable "Eigenschaft" verpasst, die die richtige Eigenschaft enthält, und du dann im obj_test dann

    GML-Quellcode

    1. Eigenschaft = obj_controll.Eigenschaft
    in das Create - Event schreibst? Dann würde der Controller nicht dem Objekt die Variable zuschreiben, sondern sich das Objekt die Variable vom Controller holen, was aufs gleiche rauskommt.
  • Ööhm, das wär zwar auch machbar, ist aber die unsaubere Lösung. Wenn's später mit dieser Funktion Probleme gibt, du im Projekt aber schon viel weiter bist, musst du erstmal wieder suchen, wo du denn die Variable "Eigenschaft" hingeworfen hast. Wenn du das alles im Funktionsblock machst, in dem die Instanz erstellt wird, ist es übersichtlicher und leichter zu debuggen. Deswegen würde ich Tice' Ansatz an dieser Stelle bevorzugen.

    Auch wenn ich ihn an einer Stelle verbessern muss: Das variable_local_exists im Create-Event ist gar nicht nötig, da die Instanz dieses Event sofort nach ihrer Erstellung, als noch vor der Zuweisung der Variable durch das controller-Objekt, ausführt.
    Daher also an C5_Booster: Erweiter das Create-Event des Blocks noch um eine Dummy-Zuweisung, etwa

    GML-Quellcode

    1. eigenschaft=spr_yanmc;
    2. sprite_index=eigenschaft;


    Damit ist jeder neue Block erstmal vom Sprite spr_yanmc und wird dann erst durch den Controller verändert.

    Achja, und außerdem würde ich immer, immer, immer mit Sprite-IDs arbeiten, niemals niemals niiiemals mit festen Zahlenwerten. Es ist nämlich um einiges weniger umständlich, einfach ne Tabelle im Sinn von {eigenschaft 1 = spr_gras; eigenschaft 2 = spr_blubberpaste} zu erstellen, als jedes Mal selbst nachzugucken, welche ID dein Sprite denn nun hat. Aber das ist nur ein nebensächlicher Tipp, der mit deinem Thema eigentlich kaum was zu tun hat, von daher: :sleeping: