Prüfen ob lokale Variable existiert, bzw. gesetzt ist

  • GM 8

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

  • Prüfen ob lokale Variable existiert, bzw. gesetzt ist

    Hi.. :)

    Die Suche ergab zwar einen Treffer, aber da ging es mehr um globale Variablen und es wurde nur der Code geschrieben, um lokale zu prüfen... Ich krieg das allerdings nicht hin.

    Situation: Einheiten, Gebäude und viele Teile des GUIs haben eine Beschreibung in der Variable "desc" gespeichert. Diese soll in der Statusleiste angezeigt werden. Das funktioniert auch bestens.

    Ich möchte jetzt aber machen, dass diese Beschreibung nur angezeigt wird, wenn auch eine angegeben ist, weil ich einen Knopf mit einer Beschreibung habe, die erst abrufbar wird, wenn der Knopf durch eine andere Sache zuvor aktiviert wurde. In dem Fall wird geprüft, ob die gerade selektierte Einheit bauen kann, also mit "can_build = true" und nur dann wird intuitiverweise der Bauknopf angezeigt, inklusive Beschreibung (das brauch ich vorallem, wenn ich später machen will, dass die Knöpfe relativ nacheinander platziert werden, je nach den Fähigkeiten der selektierten Einheit und nicht an festen Plätzen).

    Problem: Ich krieg es nicht hin, dass dies geprüft wird. Die Beschreibung wird nur angezeigt, wenn ich das "variable_local_exists" komplett weglasse und sonst krieg ich nur eine 0 oder so ein komisches Sonderzeichen. Irgendwie spricht es das selektierte Objekt nicht an - das macht es nur, wenn ich nicht prüfe, ob es die Variable gibt. :| Normalerweise spreche ich die Variable der gerade selektierten Einheit mit "id.desc" an, so wie alle anderen Werte von Einheiten und Gebäuden, aber wenn ich die Variable überprüfe, klappt auch das nicht. Bei dem unten stehenden Code gibt es mir immer nur eine 0 aus - egal, ob die Instanz eine Beschreibung hat oder nicht.

    Ich denke, der Code erklärt es selbst am besten... Und nicht wundern über die komisch gesetzten Klammern: Ich krieg die GML-Formatierung hier im Forum nicht hin... Eigentlich sieht das übersichtlicher und strukturierter aus. :)

    obj_statusbar
    Spoiler anzeigen

    GML-Quellcode

    1. // Draw instance description on statusbar
    2. with(obj_mouseover) // Check all instances which offer mouseover support
    3. {
    4. if mouseover = true // If mouse is over an instance
    5. { if variable_local_exists("desc") // If instance has a description
    6. { with(obj_hud_infobar) { draw_text(view_xview[0]+185, view_yview[0]+view_hview[0]-17, id.desc);
    7. }
    8. }
    9. else // If instance has no description
    10. { with(obj_hud_infobar){ draw_text(view_xview[0]+185, view_yview[0]+view_hview[0]-17, "No description");
    11. }
    12. }
    13. }
    14. }
    Alles anzeigen


    Nur, damit keine Verwirrung entsteht: with(obj_mouseover) ist das oberste aller Parents, damit spreche ich alle Instanzen darunter an, die obj_mouseover als Parent haben. Hierarchie: obj_mouseover -> obj_own -> obj_unit und obj_build getrennt. Also da liegt der Fehler nicht. Die Variablenprüfung haut einfach nicht hin.


    P.S.: "if global./local.variable != null" fänd ich viel intuitiver :(

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von Bonsaiheld ()

  • GML-Quellcode

    1. with(obj_hud_infobar) { draw_text(view_xview[0]+185, view_yview[0]+view_hview[0]-17, id.desc);
    2. }


    Diese Zeile bewirkt das die desc von
    obj_hud_infobar gedrawt wird,
    nicht von nicht die von obj_mouseover denn id ist ihr die ID von obj_hund_infobar
    wegen dem "with-statement". Für genauere Infos lies in der Hilfe nach.
    Am besten schreibst du die desc des gecheckten obj_mouseover in eine globale
    Variable und lässt diese dann zeichnen.

    EDIT: Hast du "Treat uninitialized variables as 0" auf aus gestellt?

    EDIT 2 (22.11.12-16:48): Das Problem is also gelöst oder?^^

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Shapow ()

  • @Shapow: Du hattest natürlich Recht. Hatte wohln Tunnelblick und hab es nicht gesehen, obwohl der Code so klein ist. :D

    Es funktionierte anschließend wie es sollte, allerdings auch bestens ohne globale Variable. Wie geschrieben, funktionierte der Code, wenn ich die Prüfung wegließ.

    Mittlerweile hab ichs anders gelöst, weil das langfristig sowieso die völlig falsche Lösung war, weil ich später irgendwie machen will, dass die Knöpfe relativ aneinander gereiht werden, anstatt an festen Positionen zu erscheinen (ich schätze, das geht mit Schleifen, aber ich hab noch keine Ahnung). Jetzt wird der Knopf einfach als Instanz frisch erstellt und dann kann auch nur die Beschreibung angezeigt werden, wenn diese existiert. :)

    Danke für die Hilfe!

    P.S.: Und nein, ich hab die Funktion, dass unangegebene Werte 0 sind, immer aktiviert. Eigentlich nur, um Fehlern aus dem Weg zu gehen, bevor sie zuschlagen können. Möglicherweise ist das nicht die beste Herangehensweise...

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }
  • P.S.: Und nein, ich hab die Funktion, dass unangegebene Werte 0 sind,
    immer aktiviert. Eigentlich nur, um Fehlern aus dem Weg zu gehen, bevor
    sie zuschlagen können. Möglicherweise ist das nicht die beste
    Herangehensweise...
    Die Funktion ist dafür da Fehler zu ignorieren und sollte nicht angestellt werden, sonst kann es eventuell (nach Code) zu bestimmten anderen Fehler führen. (Du musst nur eine Variable falsch schreiben und du hast z.B. eine Teilung durch 0) und du wirst den Fehler nur schwer finden!

    Nur anstellen wenn du das explizit willst (das wahrscheinlich bei guter Programmierweise nie der Fall sein wird).
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • (Du musst nur eine Variable falsch schreiben und du hast z.B. eine Teilung durch 0)
    Ehehe... Gut, dass dus erwähnst. Dann weiß ich ja jetzt, warum ich GENAU DAS vor 10 Minuten hatte. :D

    Hab testweise eine erste, einfache Einheitenfähigkeit für den Magierarchetypen gebaut: Feuerball. Der hat einen Angriff und einen Maximalangriff und der wird beim Aufschlag auf das Ziel durch dessen Magiebwehr (ebenfalls mit Maximalwert) geteilt. Und das ergab manchmal unerklärlicherweise einen "Divided by 0"-Fehler (vermutlich weil 15 / 20 = < 1 und ich ganze Zahlen erzwang), also hab ich einfach als Mindestschaden 1 gemacht... Hm. Ich mach das aber lieber mal aus, macht echt keinen Sinn. Ich hatte das ganz am Anfang aktiviert als ich kaum GML konnte und den Code winzig halten wollte. Damals, vor einer Woche. :)

    GML-Quellcode

    1. if ! (freedom) { instance_destroy(gamemaker); instance_create(x, y, html5); }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Bonsaiheld ()