Eigener Timer will nicht so richtig.

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

  • Eigener Timer will nicht so richtig.

    Animiert durch einen anderen Post wo es um Animation geht,
    habe ich versucht per Code eine Animation Zeitlich selber zu steueren.
    Bekomme aber immer wieder diese Fehlermeldung:

    ___________________________________________
    ############################################################################################
    FATAL ERROR in
    action number 1
    of Step Event0
    for object object0:

    Push :: Execution Error - Variable Get -5.temptime(100003, -2147483648)
    at gml_Object_object0_StepNormalEvent_1 (line 3 ) - if (time - temptime) >= 500
    ############################################################################################



    In Create Event habe ich die Variablen als Global declariert (Hmm mit den Gültigkeits bereich von GML steig ich noch nicht ganz durch)

    GML-Quellcode

    1. globalvar time;
    2. globalvar temptime;
    3. globalvar go;
    4. go = 0;


    im Step Event ist das hier:

    GML-Quellcode

    1. time = get_timer()
    2. if (time - temptime) >= 500
    3. {
    4. temptime = time
    5. go = 1
    6. }
    7. else
    8. {go = 0}



    Sinn ansich sollte sein, alle 500 Millisecs die Variable go
    auf 1 zu setzen.
    Wenn diese 1 ist irgend einen Counter zählen lassen.
    Ist beim Schleifendurchlauf die Zeit noch nicht erreicht wird/bleibt sie auf 0.

    Bestimmt was simples aber für mich nicht zu Entdecken :(
  • Also um globale Variablen auszulesen oder zu schreiben muss man vor den globalen varialen "global. " setzen. Das wäre hier in dem Fall im Create Event global.go = 0.
    (Ausserdem sollten die anderen Variablen auch noch voher deklariert werden :D )
    Und im stepevent ebenfalls ein "global. " vor den Variablen setzen.

    Ansonsten fragst du dort Lokale Variablen ab die ja nicht existieren. Die globalvar Zeilen können ruhig bleiben :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von 3D2Y Bandicoot ()

  • Wenn man eine Variable mittels globalvar deklariert braucht man nicht mehr "global." vor jede Variable schreiben.

    Der Fehler sagt, dass er temptime nicht kennt, weil diese Variable bevor sie das erste mal einen Wert bekommt bereits in der if Abfrage abgefragt wird.
  • Hier noch Informationen dazu: docs.yoyogames.com/source/dadiospice/002_reference/001_gml language overview/variables/global variables.html

    Ich kann es nicht empfehlen, wie oben gezeigt globale Variablen zu machen, weil man später im Code nicht sehen kann, ob die Variable global ist oder nicht. entweder man gibt denen entsprechende Namen, etwa in dem man vor jeden Namen gl_ schreibt, oder man zieht es konsequent mit global. durch, womit ich ganz gute Erfahrungen gemacht habe.
    Byte GameMaker Magazin - Online Zeitschrift für Spieleentwickler
  • the_black_wall schrieb:

    Wenn man eine Variable mittels globalvar deklariert braucht man nicht mehr "global." vor jede Variable schreiben.

    Der Fehler sagt, dass er temptime nicht kennt, weil diese Variable bevor sie das erste mal einen Wert bekommt bereits in der if Abfrage abgefragt wird.

    Ha, genau.
    Ich bin, gewohnterweise, davon ausgegangen das die Variable automatisch den wert NULL bekommt wenn man ihr beim deklarieren keinen wert zuweist.

    TrunX schrieb:

    Hier noch Informationen dazu: docs.yoyogames.com/source/dadiospice/002_reference/001_gml language overview/variables/global variables.html

    Ich kann es nicht empfehlen, wie oben gezeigt globale Variablen zu
    machen, weil man später im Code nicht sehen kann, ob die Variable global
    ist oder nicht. entweder man gibt denen entsprechende Namen, etwa in
    dem man vor jeden Namen gl_ schreibt, oder man zieht es konsequent mit global. durch, womit ich ganz gute Erfahrungen gemacht habe.


    Guter Tipp, Danke.
    Ich möchte eigentlich versuchen so gut es geht ohne Globale Variablen zu Arbeiten.
    Ich bin hier noch am experimentieren :)

    Ich kann in einem Objekt obj_eins unter Create eine Variable, z.b var name erstellen.
    in einem anderen Objekt mit obj_eins.name den Wert auslesen.
    Soweit habe ich das auch hinbekommen, nur bei einer If abfrage zickt es noch.

    Aber egal, werde hier noch einiges hin und her testen müssen :)

    Ihr habt mir hier schon weiter geholfen.
    Vielen Dank.
  • Fabbio schrieb:

    Ich kann in einem Objekt obj_eins unter Create eine Variable, z.b var name erstellen.
    in einem anderen Objekt mit obj_eins.name den Wert auslesen.
    Soweit habe ich das auch hinbekommen, nur bei einer If abfrage zickt es noch.
    Mit vardefinierst du eine lokale Variable im aktuellen Scope.
    D.h. wenn du im Create-Event var test = 42; deklarierst, kannst du auf diese Variable nur im Create-Event zugreifen.
    var verhindert so gesehen, das temporäre Variablen die du in einem Objekt definierst, nur gerade für ein Zweck gebraucht werden. (eine for-loop bspw.)
    :saint:
  • Ok.
    Ich habe es in etwa so verglichen, wie ich es in GLB gewohnt bin.

    Ich sehe im moment ein objekt in GM:S ähnlich wie in GLB ein TYPE
    Wenn ich eine

    Quellcode

    1. TYPE myT
    2. x
    3. y
    4. FUNCTION test:
    5. return self.x+self.y
    6. endfunction
    7. ENDTYP

    erstelle,
    greife ich auf die Variablen im Type mit "." zu.
    myT.x = 100
    myT.y = 200
    blah = myt.test()

    Hier ist x genauso wie in GM:S obj_player.x
    nur für diesen Type / Objekt gültig
    Aber wenn ich mit var x das ich im CREATE Event erstellt habe nur hier darauf zugreifen kann ist für mich verwirrent ( Im Moment)
    Ich dachte hier erstellen ich grundsätzlich die Variable die ich im gesammten Objekt benutzen kann.

    Naja, ich werd schon noch dahinter kommen wie GM:S Tickt :)
  • Also es gibt drei Möglichkeiten, Variablen zu deklarieren:

    GML-Quellcode

    1. var hallo = 13;

    Bei dieser Variante kann man nur innerhalb des Eventes oder des Skriptes auf die Variable zu greifen.

    GML-Quellcode

    1. hallo = 13; self.hallo = 13;
    2. //oder
    3. obj_player.hallo = 13;

    Hier kann man innerhalb des Objektes drauf zu greifen und von außerhalb mit der letzten Schreibweise (also Instanzname.Variable)

    GML-Quellcode

    1. globalvar hallo;
    2. hallo = 13;
    3. //oder
    4. global.hallo = 13

    Hier kann man von überall auf die Variable zu greifen.