Globale Variable im Room Creation, Objekt-Instanz sagt dennoch, die sei nicht definiert.

    Globale Variable im Room Creation, Objekt-Instanz sagt dennoch, die sei nicht definiert.

    Hallo @all,

    da ich nur eine bestimmte Anzahl von Land-Arten (Strand, Wiese, Berg) zulassen will, muss ich mir merken, wie viele ich von den Typen schon vergeben habe. Darum habe ich im Room Creation Code folgende Einträge:

    GML-Quellcode

    1. global.gLandTypBergGesezt = 0;
    2. global.gLandTypLandGesezt = 0;
    3. global.gLandTypStrandGesezt = 0;


    Wenn ich dann im Creation Code des Objekt drauf zugreifen will:

    GML-Quellcode

    1. if(global.gLandTypBergGesezt <= eLandMaxAnzahl.Berg){
    2. ...


    kommt die Meldung:
    "....not set before reading ist .... if(global.gLandTypBergGesezt <= eLandMaxAnzahl.Berg)"

    Wo sehe ich den Wald vor lauter Bäumen nicht?

    Viele Grüsse :)
    Beachte die Reiehnfolge beim Erstellen der Objekte bzw. beim Einlesen der Variablen.

    Setze die Variablen mal anstatt Room Creation ins normale Creation oder mach dir gleich ein komplett eigenes Objekt für sämtliche globale Variablen, dass du einen besseren Überblick hast und setze das im Raum. Ich erstelle mir immer ein Controll-Objekt, da packe ich alle globalen rein ins Create Event und kommentiere diese aus, damit ich bescheid weiß wo und wofür.

    "eLandMaxAnzahl.Berg"
    Ist eLandMaxAnzahl dein Objekt? So wie ich das verstanden habe müsste das genau andersrum sein, ich gehe mal davon aus, dass Berg dein Objekt ist.
    Es ist immer sinnvoll die Objekte bspw mit einem obj_-Präfix zu kennzeichnen, also z.B.: obj_Berg

    1. Das erleichert die Übersicht nicht nur für dich, sondern auch bei Problemen wie diesen
    2. Wenn du ein Sprite hast mit genau den selben Namen, dann bekommst du einen Error
    In einem Creation Codes eines extra Objekts hatte ich den Code schon, hat nicht funktioniert. Dann bin ich in der Forums-Suche eben auf den Creation Code vom Room gestossen.

    Zum eLandMaxAnzahl -> das ist eine Enumeration, daher das e am Anfang. :) Genau so wie das g bei Globalen Variablen. Habe mir da so meine Namenskonvention aufgebaut :)

    In der Enumeration habe ich die Max Zahlen drin & solange die gesetzte Anzahl kleiner gleich der Max Anzahl sind, soll der Schleifen-Inhalt durchlaufen werden.
    Hallo :)
    Kannst du die ganze Fehlermeldung senden? Eigentlich sollte dort noch stehen, welche Variable er nicht kennt.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe

    DjBepy schrieb:


    Zum eLandMaxAnzahl -> das ist eine Enumeration, daher das e am Anfang. :) Genau so wie das g bei Globalen Variablen. Habe mir da so meine Namenskonvention aufgebaut :)
    In der Enumeration habe ich die Max Zahlen drin & solange die gesetzte Anzahl kleiner gleich der Max Anzahl sind, soll der Schleifen-Inhalt durchlaufen werden.


    Entweder hast du mich falsch verstanden, oder ich dich :D

    Du hast da stehen global.gLandTypBergGesezt <= eLandMaxAnzahl.Berg.
    Wenn du also in eLandMaxAnzahl die Zahl drin hast, dann musst du es genau andersrum schreiben, sprich: Berg.eLandMaxAnzahl
    Berg ist ja nehme ich an dein Objekt und du leitest von diesem Objekt die lokale Variable eLandMaxAnzahl ab, oder?
    Dann wäre es auch kein Wunder, dass der GM dann meckert :)

    icqgamer schrieb:


    Entweder hast du mich falsch verstanden, oder ich dich :D

    Du hast da stehen global.gLandTypBergGesezt <= eLandMaxAnzahl.Berg.
    Wenn du also in eLandMaxAnzahl die Zahl drin hast, dann musst du es genau andersrum schreiben, sprich: Berg.eLandMaxAnzahl
    Berg ist ja nehme ich an dein Objekt und du leitest von diesem Objekt die lokale Variable eLandMaxAnzahl ab, oder?
    Dann wäre es auch kein Wunder, dass der GM dann meckert :)


    Das ist schon richtig so, das Enumeration-Objekt beginnt mit e ->eLandMaxAnzahl & dann rufe ich den entsprechenden Wert darin ab -> Berg.

    GML-Quellcode

    1. enum eLandMaxAnzahl
    2. {
    3. Strand = 12,
    4. Land = 8,
    5. Berg = 4
    6. }


    Anbei noch die Fehlermeldung aus GM.
    Bilder
    • GM_Fehlermeldung.jpg

      50,17 kB, 505×317, 23 mal angesehen
    Wird die Abfrage schon in einem Create Event oder vor der Initialisierung ausgeführt?

    Ansonsten vergewissere dich ob das Objekt im Raum ist. Am besten ist es auch, im Menü oder ähnliches globale Variablen zu Initialisieren.

    Edit: kann es sein, dass du ein Tippfehler hast?
    Gesetzt hast du Gesezt geschrieben.
    Edit2: Oh die Variablen sind auch so beim erstellen benannt worden. Ich nehm's zurück :D
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe

    Husi012 schrieb:

    Wird die Abfrage schon in einem Create Event oder vor der Initialisierung ausgeführt?

    Ansonsten vergewissere dich ob das Objekt im Raum ist. Am besten ist es auch, im Menü oder ähnliches globale Variablen zu Initialisieren.


    Die Abfrage auf die Variable findet im Creator Event des obj_Land statt, also dem Objekt das dann den Land-Typ & die damit verbundenen Eigenschaften annehmen soll.
    Wo genau ist denn die Initialisierung?
    Lasse dir mal dabei eine Nachricht ausgeben und schaue, ob sie vor dr Abfrage kommt.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
    Nein, die show_message("start global"); wird nicht vorher ausgeführt, das erklärt natürlich einiges :(

    Wo kann ich die Reihenfolge der Objekte definieren? Dass das obj_global ganz oben ist scheint keinen Einfluss zu haben. Das Onjekt ist auch im Room, darin liegt es also auch nicht.

    Was wird denn aufgerufen, bevor er die Objekte initialisiert & den Room aufbaut?
    Bei "settings" kannst du im Room auf "instance order" gehen und dort die Objekte verschieben.

    Was vorm Initialisieren ausgeführt wird ist auf jeden Fall der Room davor.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
    Deshalb hatte ich dich auch gefragt welche Version du benutzt, aber bei der 1.4 geht das ja auch (siehe Husis Post), habe das bis gerade eben aber bei der 4.1er auch nicht gewusst, dass es das gibt. Wahrscheinlich weil ich das nie gebraucht habe und weil das eher weniger ins Auge fällt, aber wieder mal was dazugelernt :D

    Husi012 schrieb:

    Bei "settings" kannst du im Room auf "instance order" gehen und dort die Objekte verschieben.


    Die guten Nachrichten, wenn ich das obj_Global ganz nach oben in der Order setze, dann wird dessen Creation Event auch brav vor den anderen ausgeführt (das show_message wird angezeigt). Die schlechte Nachricht, die Exception kommt immer noch :( An der enum liegt es auch nicht, habe die mal zum Test durch die festen Werte ersetzt, ändert aber nichts :(
    Im Moment weiß ich auch nicht weiter. Kannst du nochmal alle Codes auflisten? Es kann ja sein, dass da sich irgendwo ein Fehler eingeschlichen hat.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
    Aktuell habe ich nur in 2 Objekten Code. Im obj_Global:

    GML-Quellcode

    1. ​enum eLandTyp
    2. {
    3. Strand = 0,
    4. Land = 1,
    5. Berg = 2
    6. }
    7. enum eLandMaxAnzahl
    8. {
    9. Strand = 12,
    10. Land = 8,
    11. Berg = 4
    12. }
    13. show_message("start global");
    14. global.gLandTypBergGesetzt = 0;
    15. global.gLandTypLandGesetzt = 0;
    16. global.gLandTypStrandGesetzt = 0;
    17. show_message("end global");


    und im obj_Land:

    GML-Quellcode

    1. //Land Typ setzen
    2. if(global.gLandTypBergGesezt <= eLandMaxAnzahl.Berg){
    3. global.gLandTypBergGesetzt++;
    4. sprite_index = spr_Berg;
    5. } else if (global.gLandTypLandGesezt <= eLandMaxAnzahl.Land){
    6. global.gLandTypLandGesetzt++;
    7. sprite_index = spr_Land;
    8. } else {
    9. global.gLandTypStrandGesetzt++;
    10. sprite_index = spr_Strand;
    11. }


    Und im "Instance order" ist das obj_Global an erster Stelle.
    Jetzt hast du doch einen Schreibfehler. Du schreibst Gesezt statt Gesetzt.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe