Obj + Script

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

  • Obj + Script

    Guten Tag

    Ich bin mal gespannt, wer mir hierbei helfen kann. Ich will, dass wenn man die Leertaste drückt, ein Eingabefeld aufgeht, indem man eine Zahl eintragen muss, woraufhin der entsprechende Monat in einer Textbox ausgegeben wird.
    Das kann man alles in einem Objekt abwickel, das ist mir klar. Aber ich wollte die Monate in Form eines Arrays in ein seperates script packen.

    Vorhanden ist:
    -1 room, in dem ein Objekt namens "object0" plaziert ist
    -ein Objekt mit folgendem Inhalt:
    Spoiler anzeigen

    Objaktname = object0

    Eintrag = real(get_string("bitte Zahl 1-12 eintragen","")) - 1;
    Antwort = script0(test);

    show_message(Antwort);

    -ein Script mit folgendem Inhalt:
    Spoiler anzeigen

    Scriptname = script0


    monat[0] = "Januar";
    monat[1] = "Februar";
    monat[2] = "März";
    monat[3] = "April";
    monat[4] = "Mai";
    monat[5] = "Juni";
    monat[6] = "Juli";
    monat[7] = "August";
    monat[8] = "September";
    monat[9] = "Oktober";
    monat[10] = "November";
    monat[11] = "Dezember";


    test = monat[object0.Eintrag];


    Warum geht das nicht? Ich geb die Zahl ein, bestätige und bekomme:
    Spoiler anzeigen


    ___________________________________________
    ############################################################################################
    FATAL ERROR in
    action number 1
    of Keyboard Event for <Space> Key
    for object object0:


    Variable object0.test(100004, -2147483648) not set before reading it.
    at gml_Object_object0_Keyboard_32 (line 4) - Antwort = script0(test);
    ############################################################################################
    --------------------------------------------------------------------------------------------
    stack frame is
    gml_Object_object0_Keyboard_32 (line 4)

    Bin erst seit gestern dabei, darum bitte etwas Nachsicht. ;)
  • du rufst den Script mit dem Parameter "test" auf.
    Diese Variable wird aber erst innerhalb des scriptes bestimmt und ist vorher unbekannt.

    Vermutlich wolltest du "Eintrag" statt "test" übergeben.
    Am Ende vom Script muss auch noch mittels "return" ein Wert zurückgegeben werden, wenn du ihn in "Antwort" speichern möchtest.
  • "Eingabe" existiert nicht. oder meinst du "Eintrag"? Diesen kann ich nicht nehmen, da diese, in eine umgewandelte Zahl, Ziffer, ja erst noch weiter verarbeitet werden muss.
    Wie mich sowas stresst. Klar, das geht alles einfacher, aber ich will verstehen, warum nicht exakt so.
    Ja, "test" wird erst im script definiert, müsste von der Reihenfolge aber passen denke ich.
  • Porblemumverlagerung!
    So ich habe den script gelöscht, da ich das mittels script nicht geregelt bekomme.
    habe jetzt ein 2. obj erstellt, a die Monate reingepackt und spreche in obj0 das obj1 mit den monaten an, das klappt alles soweit.
    Neues Problem:
    (muss jetzt aufpassen, dass ich das verständlich erkläre, denn das problem hatte ich schon paar mal)

    erstmal die 2 objekte

    Spoiler anzeigen

    Objektname = object0
    Eintrag = real(get_string("bitte Zahl 1-12 eintragen","")) - 1;
    show_message(MONATE.monat[Eintrag]);

    Spoiler anzeigen

    Objektname = MONATE

    monat[0] = "Januar";
    monat[1] = "Februar";
    monat[2] = "März";
    monat[3] = "April";
    monat[4] = "Mai";
    monat[5] = "Juni";
    monat[6] = "Juli";
    monat[7] = "August";
    monat[8] = "September";
    monat[9] = "Oktober";
    monat[10] = "November";
    monat[11] = "Dezember";


    Wenn ich das per leertaste starte, klappt alles. wenn ich das aber instant/per create ausführe, also direkt zu Beginn, dann bekomme ich jene wunderbare Botschaft:
    Spoiler anzeigen


    ___________________________________________
    ############################################################################################
    FATAL ERROR in
    action number 1
    of Create Event
    for object object0:


    trying to index a variable which is not an array
    at gml_Object_object0_Create_0 (line 9) - show_message(MONATE.monat[Eintrag]);
    ############################################################################################
    --------------------------------------------------------------------------------------------
    stack frame is
    gml_Object_object0_Create_0 (line 9)

    Bin froh für allen Beistand. ;)
  • Wenn das createevent von einem objekt vor dem anderen ausgeführt wird kann er nicht auf die Variable des anderen zugreifen, weil sie noch nicht existiert.

    So würde dein Script aus dem ersten Post richtig aussehen:

    GML-Quellcode

    1. monat[0] = "Januar";
    2. monat[1] = "Februar";
    3. monat[2] = "März";
    4. monat[3] = "April";
    5. monat[4] = "Mai";
    6. monat[5] = "Juni";
    7. monat[6] = "Juli";
    8. monat[7] = "August";
    9. monat[8] = "September";
    10. monat[9] = "Oktober";
    11. monat[10] = "November";
    12. monat[11] = "Dezember";
    13. return monat[argument0];
    Alles anzeigen


    und zum aufrufen:

    GML-Quellcode

    1. Eintrag = real(get_string("bitte Zahl 1-12 eintragen","")) - 1;
    2. Antwort = script0(Eintrag);
    3. show_message(Antwort);
  • Noch 2 Sachen am Rande:
    Wenn du eine Varianle im Skript übergibst, dann kannst bzw. musst du mit Argumenten arbeiten. Bin grad auf der Arbeit am Handy, deswegen kann ich dir das nicht so schick hinzaubern grad:

    Objekt:
    blub = 1
    test = scr_bla(blub)
    show_message(test)

    scr_bla:
    var blub2, blub3;
    blub2 = 2
    blub3 = argument0 + blub2
    return blub3;

    Bei show_message(test) kommt dann 3 raus, weil der erste Parameter (test) im Script dann argument0 ist.

    Zweite Sache:
    Du solltest ein Präfix für deine Assets verwenden. Also spr_deinSprite, obj_deinObjekt
    So läufst du nicht Gefahr, dass ein Sprite und ein Objekt den selben Namen haben