GML Fragen: globale Variablen, Controller-Objekt, Quellcode anzeigen

  • GM 8

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

  • GML Fragen: globale Variablen, Controller-Objekt, Quellcode anzeigen

    Hallo Liebe GM-D Gemeinde!

    Ich habe gestern mit GM(L) angefangen, und habe einige Fragen die im Tutorial 1 und 2 nicht wirklich behandelt werden.
    Leider werden solch scheinbar triviale Fragen nicht in Windapple ansonsten super Thread behandelt:

    Frage 1: Wo erstelle ich am besten meine globalen Variablen?
    Bisher habe ich mir ein Objekt erstellt, dass persistent und ohne Sprite ist.
    Im create-event habe ich dann

    GML-Quellcode

    1. globalvar xyz;
    eingetragen.
    Das Objekt habe ich einem Raum zugewiesen
    Ausserdem habe ich noch andere Objekte (mit sprite, nicht persistent falls das irgendwas ausmacht) im selben Raum, deren create-event will diese Variable jetzt aber ändern.
    Bei mir kommt dann die Fehlermeldung dass die Variable noch nicht existiert als sie schon geändert werden soll.

    Mittels SuFu habe ich nur den Hinweis gefunden die im create-event des Raums zu erzeugen.
    Leider plane ich aber mittelfristig mit mehreren Räumen, und die anderen Räume hätten dann vielleicht Probleme?

    Kann man den Objekte einen Prioritätsreihenfolge geben?
    Dann könnte ich ja einfach dem MAIN-Objekt die Prio 1 geben das initialisiert dann alles.

    Frage 2: Was ist das controller objekt?
    Ich lese im Forum immer wieder von controller objekt, bin mir aber nicht sicher was damit gemeint.

    Frage 3: Quellcode anzeigen?
    Kann man sich das komplette Projekt, also den Quellcode meines Programms anschauen und vielleicht sogar bearbeiten?

    Danke für eure Zeit!
  • Zu Frage 1:
    Wenn du einmal eine globale Variable initialisierst, ist sie für den Rest des Spiels noch da, d.h. du musst sie nicht jedesmal neu initialisieren, wenn du den Raum änderst. Z.B. wenn du am Anfang des Spiels ein Lade-Raum machst, wo globale Variablen initialisiert werden.

    Zu Frage 2:
    Controller Objekte sind Objekte, die genau das machen, was ihr Name sagt: Sie kontrollieren irgendwas, z.b. das spawnen von Feinden oder das createn von Bonus Gegenständen. Diese Objekte müssen natürlich selber gemacht werden. Solche Objekte werden einfach allgemein als Controller-Objekt bezeichnet.

    Zu Frage 3:
    Nein, nicht wirklich.
    Du kannst zwar in den Object-Properties eine Zusammenfassung aller Codes des jeweiligen Objekts anschauen.
    Wenn du Code verändern willst, dann musst du halt den Code ändern^^, also nicht per "Gesamt-Skript" sondern halt da, wo du ihn geschrieben hast (Sollte verständlich sein^^).
  • Frage 1: Wo erstelle ich am besten meine globalen Variablen?
    Am besten (wenn du sie durch ganzes Spiel berauchst) gleich am Anfang in einem Create-Event:

    GML-Quellcode

    1. global.xyz=42;
    2. global.lol="lol";

    Frage 2: Was ist das controller objekt?
    Ein Objekt das den ganzen Spielverlauf kontrolliert, z.B. Anzeigen oder bei einem Multiplayerspiel den "Client" kontrolliert. Das Objekt ist also das was du dir darunter vorstellst.
    Frage 3: Quellcode anzeigen?
    Der Game Maker hat die Funktion alles von einem Objekt anzuzeigen, von einem kompletten Quellcode hab ich noch nie was gehöhrt. Damit ich, so denke ich, gemeint die Codes die du im Create-/Step-/Draw-Event verwendest.
    Leider plane ich aber mittelfristig mit mehreren Räumen, und die anderen Räume hätten dann vielleicht Probleme?
    Mach einen Raum ganz am Anfang und nenne ich z.B. rm_init dort tuts du alles "laden" was du brauchst und definierst die Variablen (globale Variablen bleiben über alle Räume beständig sind also "persistente" Variablen)
    Kann man den Objekte einen Prioritätsreihenfolge geben?
    Dann könnte ich ja einfach dem MAIN-Objekt die Prio 1 geben das initialisiert dann alles.
    Die Abrauffolge der Events werden von der ID und der depth gesteuert (afaik).


    Bei mir kommt dann die Fehlermeldung dass die Variable noch nicht existiert als sie schon geändert werden soll.
    Meines Wissen definiert var/globalvar nur einmalig eine Variable d.h. nach Ende des Scripts/Code-Stück gibt es die Variable nicht mehr, daher global.Variablen_Name verwenden.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Zu 3. noch was:

    Also meinst du, dass jemand dein Spiel decompilen könnte (nicht legal, nur so)?
    Theoretisch ja, allerdings ist für den GM 8.1 kein Decompiler vorhanden,
    da dauernd neue Versionen durch Updates aufkommen.
    Wenn du sicher gehen willst, dass dir niemand die Ressourcen klaut,
    (Der Code ist selten das Ziel), dann solltest du sie encypten und extern lagern
    und sie am Spielstart laden lassen.
  • Hui, da geht man mal kurz duschen und der Thread ist voll.

    Ihr seid ja fix!!!

    Danke für die Antworten.
    Nen Lade-Raum zu bauen die Idee ist nicht schlecht.
    Aber wie ist die Reihenfolge beim laden der Räume, wie stelle ich sicher, daß der Raum zuerst initialisiert wird?
    Ich erstelle ja alle Räume am Anfang und switche dann nur während des Spiels den aktiven Raum oder?

    Zum Thema Quellcode:
    Die Sicherheit der Skripte bzw. das jemand das ganze dekompilieren könnte ist mir nicht so wichtig.
    Allerdings programmiere ich lieber, als das ich Zeug zusammenklicke.
    Deswegen hätte ich mich über die Möglichkeit gefreut das ganze nur coden zu können ;)
  • Allerdings programmiere ich lieber, als das ich Zeug zusammenklicke.
    Deswegen hätte ich mich über die Möglichkeit gefreut das ganze nur coden zu können ;)


    Das kannst du auch machen kein Problem. Du kannst das ganze Spiel in ein Script packen.
    Es gibt Funktionen mit den man Objekte erstellen kann und welche, mit denen man
    dann Events hinzufügen kann alles kein Problem, also wenn's dir spaß macht :D
  • Irgendwie klappt das doch nicht :(
    Ich habe die variable im room-create-event initialisiert:

    Quellcode

    1. globalvar ai_tiles;
    2. globalvar i_num_walls;
    3. var i;
    4. var j;
    5. i_num_walls = 0;
    6. for (i=0; i<I_MAP_CELLS_WIDTH; i+=1)
    7. for (j=0; j<I_MAP_CELLS_HEIGHT; j+=1)
    8. ai_tiles[i,j] = I_CELL_NORMAL;

    Dann habe ich ein objekt wall.
    Dieses Objekt hat den creation code:

    Quellcode

    1. i_cell_x = i_get_cell_from_x_coord(x);
    2. i_cell_y = i_get_cell_from_y_coord(y);
    3. if (i_cell_x < I_VALUE_INVLD) && (i_cell_y < I_VALUE_INVLD)
    4. {
    5. ai_tiles[i_cell_x,i_cell_y] = I_CELL_BLOCKED;
    6. i_num_walls +=1;
    7. }

    Ausserdem habe ich ca. 16 mal diese Wall im Raum platziert.
    Er findet aber keine Variable i_num_walls zum hochzählen :(
    Ich könnte jetzt natürlich abfragen existiert die variable und wenn nicht erzeuge ich sie global, aber das klingt mir doch ziemlich nach "Durch die Brust ins Knie"
    Ich habe mal mein Testprogramm angehängt, vielleicht seht ihr ja meinen Bug...


    Wegen der Skripte:
    Für den Anfang muss ich noch lernen wie das ganze zusammenspielt.
    Für später ist das aber schon ne gute Idee!!!

    Edit:
    Boah also das einfügen von Quelltest klappt hier irgendwie gar nicht vernünftig...
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Sledge Hammer ()

  • Ich kann leider dein Projekt nicht öffnen, da ich nur den GM8.0 habe, und nicht den 8.1.
    Jedoch erwähnst du den Room-Creation Code.

    Ünglücklicherweiße arbeitet der Game Maker den Room-Creation Code aber erst nach dem "Instanz Creation Code", dem "Create Event" sowie dem "Game Start Event" ab. Also die Reihenfolge der Create Events ist folgendermaßen:

    1. Instanz Creation Code
    2. Create Event
    3. Game Start Event
    4. Room Creation Code
    5. Room Start Event
    Somit logisch, dass die globale Variable, welche erst in Schritt 4 eingerichtet wird, nicht im 2. Schritt vorhanden sein kann.

    Lösen könntest du dies mittels mehrerer Möglichkeiten:

    Eine Instanz eines Objektes (welches als erstes im Raum erzeugt wurde, damit dessen Create Event in der internen Abfolge zuerst durchgeführt wird, und die globalen Variablen initialisiert/ggf. auch deklariert werden) welche nur ein Create Event beinhaltet, mit der Initialisierung/Deklarination der globalen Variablen.

    oder:

    Ein, wie schon öfter erwähnt, "Laderaum", welcher als erstes aufgerufen wird. Einfach im Room Creation Code alle Variablen initialiseren, und zum nächsten Raum springen.

    oder:

    Eine der schon vorhandenen Instanzen mit den globalen Variablen im Instance Creation Code beschmücken.

    Letztere Methode ist wahrscheinlich die Einfachste, aber auch eher umsauberste. Da Inhalte die im Instance Creation Code stehen gerne Vergessen werden, oder mit löschen der Instanz ach weg sind, und eine ganze Kettenreaktion an Fehler auswirken könnten.

    Mfg.,
    Mokuyobi
    木曜日 (Mokuyōbi)
  • Das erklärt natürlich einiges. Danke!!!

    Noch 2 Fragen:
    Was ist der Instanz Creation Code und das Create Event?
    Das letztes ist das was ich am Objekt triggere oder?
    Wie packe ich code in den ersteren?

    Ich habe jetzt einen Raum gebaut der nicht anderes macht als zu initialisieren, und danach den anderen Raum mit room_goto(raumname); aufruft.
    Das funktioniert soweit.

    Woher weiss der Raum, dass er zuerst kommen muss?
    Wovon hängt ab welcher Raum zuerst geladen wird?
  • Sledge Hammer schrieb:

    Das erklärt natürlich einiges. Danke!!!

    Noch 2 Fragen:
    Was ist der Instanz Creation Code und das Create Event?
    Das letztes ist das was ich am Objekt triggere oder?
    Wie packe ich code in den ersteren?

    Woher weiss der Raum, dass er zuerst kommen muss?
    Wovon hängt ab welcher Raum zuerst geladen wird?


    Wen du im Room von einem Object eine Instanz Platziert hast, kannst du mit Rechtsklick den Instanz Creation Code eingeben.
    Create Event code is das was man dem object zu teilt, was dann jede instanz davon auch hat.


    Zu den Rooms, die reinfolge ist wie unten im Gamemaker zu sehen, der raum der oben steht wird als erstes genommen, danach kommts auf den code an, in welchen room man geht.

    mfg Death

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Deathscythearan ()