Startvariable von Create in ein Script einbauen

  • Startvariable von Create in ein Script einbauen

    Hallo,

    bin noch Neuling in Gamemaker und schon länger auf der Suche nach einem Ort wo ich nachfragen kann wenn ich mir nicht mehr selber helfen kann, hoffe ich bin hier richtig. ^^

    Ich habe mir ein Script gemacht das erkennen soll in welche Richtung sich das Objekt bewegt und dann das Sprite danach ausrichten soll. Dazu benutze ich eine Variable namens „Zeit“ die momentan noch im Create des Objekts für den beginn auf „Zeit = 2“ gesetzt wird.

    Meine Frage ist wie bekomme ich „Zeit = 2 „ vom Create des Objekts in das Script eingebaut?

    Wenn ich am Anfang des Scripts „Zeit = 2“ schreibe wird sie immer wieder darauf zurückgesetzt aber sie soll ja von 5 runter auf 0 laufen und nur zu Beginn einmal auf 2 damit sie überhaupt erstmal vorhanden ist. Ich habe überlegt ob mir dieses „var“ helfen kann aber ich versteh den Unterschied nicht zwischen „zeit = 2“ und var zeit; (nächste Zeile) zeit = 2“ nicht, passiert bei mir dasselbe. xD

    Hab im Anhang ein Bild von meinem Script.

    Vielen Dank für Hilfe
    Bilder
    • Bild.png

      89,6 kB, 906×745, 31 mal angesehen
  • Hey Willkommen im Forum!
    Eine Variable welche mit "var" deklariert wird ist nur temporär, sie gilt nur für den Block in dem sie erzeugt wurde. Wenn du also "Zeit = 0" in deinem create erstellst, und im selben Objekt dann dein Script ausführst, bezieht sich "Zeit" automatisch auf diese Variable. Davon abgesehen ist dein Code viel zu übertrieben für das was du erreichen willst. Wenn es um ein Spielergesteuertes Objekt geht, kannst du einfach direkt bei den Tastendrücken sagen in welche Richtung dein Sprite gemalt werden soll. Aber auch sonst geht zB:

    GML-Quellcode

    1. var direction = point_direction(xprevious,yprevious,x,y); // Hier bekommst du eine Gradzahl raus
    2. image_angle = direction; // Du kannst zB direkt das Sprite rotieren

    Oder um etwas näher an deinem obrigen Code zu bleiben:

    GML-Quellcode

    1. xx = sign(x - xprevious); //mit sign() bekommen wir -1, 0 oder 1 heraus
    2. yy = sign(y - yprevious);
    3. if (xx != 0) { //wenn Bewegung auf xAchse
    4. //hier könntest du dann auch einzelne Subimages setzen
    5. //du kannst aber sogar mit nur 2 Bildern (horizontal/vertikal) auskommen
    6. sprite_index = spr_player_horizontal;
    7. image_xscale = xx; //damit können wir das Sprite spiegeln
    8. image_yscale = 1;
    9. }
    10. if (yy != 0) { //wenn Bewegung auf yAchse
    11. sprite_index = spr_player_vertikal;
    12. image_xscale = 1;
    13. image_yscale = yy;
    14. }
    Alles anzeigen


    So das war jetzt etwas ausschweifender aber ich hoffe ich konnte helfen. Ansonsten stell hier gerne weiter deine Fragen.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Hi, ich werfe noch eine globale Variable in den Raum ;)

    GM unterscheidet zwischen 3 Arten von Variablen:

    1) Lokal -> var player_step // gilt nur für das eine Event, in dem sie gesetzt wird(hier also im Step-Event)
    Viele beginnen eine lokale Variable mit Unterstrich, um diese als solche zu kennzeichnen, also: _player_step

    2) Objekt bezogen -> player_speed // gilt für alle erstellten Events im Objekt Player(als Beispiel)

    3) Global -> global.player_speed //wird von allen Objekten, Script, Events, usw., als Variable erkannt

    Wenn Du also in Deinem Beispiel in einem Kontroll-Objekt, ein global.Zeit = 2, schreibst, dann ist Dein Problem
    schon gelöst. Bedenke allerdings, dass globale Variablen immer vorhanden sind und daher auch permanent den
    Speicherbereich belegen, den sie benötigen.
    Daher bitte nur mit Bedacht verwenden und gegebenenfalls bessere Lösungen suchen oder dem Beispiel von
    @Rhazul folgen.

    Miradur

    PS.: sieh Dir mal das "YoYo-Dungeon" Beispiel an, da siehst Du sehr gut, wie man seine benötigten globalen
    Variablen, per Script, am Anfang setzt. Generell ein sehr lehrreiches Projekt, wenn Du mal etwas mehr in die
    Materie eingetaucht bist.
  • Hallo,

    vielen vielen Dank für die Hilfe. ^^

    Ich wollte meine "Figuren" gerne mit der Maus steuern, also anvisieren und dann rechtsklick auf die Karte zum hinlaufen. Daher musste ich mir was anderes einfallen lassen als mit Tasten das Sprite auszurichten. Es handelt sich auch um eine menschliche Figur, daher half mir auch das drehen nicht wie im Unfo Tutorial, sonst steht sie mit den Füßen nach oben. xD

    Das mit der globalen Variable scheint eine tolle Idee zu sein. Wenn ich mir so ein Kontroll Objekt erstelle mit den wichtigen globalen Variablen für andere Objekte wie bekomme ich es hin das dieses Objekt immer vor allen anderen Objekten erstellt wird, damit sie nicht schimpfen das es diese Variable nicht gibt?

    Danke
  • Hi, dafür gibt es den Befehl "gml_pragma", hier eine Stelle aus der Hilfe:

    ​"global", "[gml code]" - Das "global" pragma erlaubt es Ihnen, GML-Code vor allem anderen aufzurufen und führt den zweiten GML-String in einem globalen Bereich aus, bevor der erste Raum des Spiels ausgeführt wird. Zum Beispiel:
    gml_pragma("global", "scr_Init()");


    Wenn Du also als Beispiel, ein Script namens scr_global_vars() hast, dann schreibst Du als erste Zeile in dieses Script:

    gml_pragma("global", "scr_global_vars()"); // "global" ist hierbei eines der Kommandos, die gml_pragma versteht

    Der Befehl sorgt dafür, dass das angegebene Script, noch vor allen Instanzen und Räumen, aufgerufen wird.
    Näheres dazu kannst Du der Hilfe entnehmen.

    Miradur