Instance Creation Code

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

    • Instance Creation Code

      Titel: Instance Creation Code
      Verfasst von: Chronic (Administrator auf GMC)
      Mit Erlaubnis des Autors übersetzt von: Kilik (Moderator auf gm-d.de)
      Original Link: Klick

      Der Instance Creation Code ist wahrscheinlich ein viel zu oft übersehenes Feature im Game Maker. In diesem Tutorial werde ich beschreiben wie man sich dieses Feature zunutze machen kann und nebenbei auch ein kleines Example Schritt für Schritt auseinander nehmen.

      Ich habe für dieses Tutorial Game Maker 6.1 verwendet, aber mit dem Game Maker 5.3a sollte es genauso gut funktionieren.

      Aufrufen (ja, die Übersetzung dieses Begriffes hinkt, aber mir fiel nichts besseres ein)

      Dieses Feature aufzurufen ist wirklich leicht. Zuallererst sollte man seinen Game Maker in den Advanced Mode gestellt haben (File -> Advanced Mode)

      Als nächstes erstellt man ein Objekt und einen Raum und fügt eine Instanz des Objektes in den Raum ein. Halte jetzt 'Strg' gedrückt und rechtsklicke auf die Instanz. Nun sollte ein Kontext-Menü mit mehreren Optionen zu sehen sein.


      Instance Context Menü


      Wenn man nun auf "Creation Code" klickt erscheint ein Codeeingabe Fenster wie bei "Execute a piece of code", in welches man nun seinen Code eingibt. Alles was hier eingegeben wird gilt nur für diese Instanz.

      Sobald du der Instanz also einen Code verpasst hast, wird ein kleiner Tooltip mit dem text "has code" angezeigt, sobald sich der Cursor über ihr befindet.

      Example

      Ich werde nun anhand eines Teleporter-Objektes eine der vielen Verwendungsmöglichkeiten dieses Features demonstrieren.

      Erstelle ein neues Projekt mit folgenden Ressourcen:
      • 2 Sprites - spr_player, spr_telepad.
      • 2 Objekte - obj_player, obj_telepad.
      • 1 Raum - room0.

      Als Sprites habe ich verwendet:


      Spieler Und Teleporter Sprites


      Gib dem obj_player nun ein Step Event mit folgendem Code für das grundlegende Verhalten:

      GML-Quellcode

      1. //Step Event
      2. {
      3. move_towards_point(mouse_x,mouse_y,5);
      4. }


      Platziere nun eine Instanz von obj_player im Raum und probiere aus ob alles soweit funktioniert. Wenn sich das Objekt in Richtung der Maus bewegt ist alles wie es sein soll und du kannst weitermachen.

      Als nächstes brauchen wir obj_telepad. Gib diesem Objekt ein Collision Event mit obj_player und füge folgenden Code ein:

      GML-Quellcode

      1. // Collision with obj_player
      2. {
      3. other.x = teleX;
      4. other.y = teleY;
      5. }


      Platziere nun ebenfalls eine Instanz von obj_telepad in room0. Das Spiel jetzt auszuführen würde eine Fehlermeldung hervorbringen, da 'teleX' und 'teleY' noch nicht definiert wurden.

      Dazu werden wir jetzt den Creation Code verwenden. Öffne nun diesen der Instanz des Objektes obj_telepad, wie bereits am Anfang des Tutorials erklärt, und füge dort folgenden Code ein:

      GML-Quellcode

      1. //Creation Code
      2. {
      3. teleX = 100;
      4. teleY = 200;
      5. }


      Jetzt kannst du das Projekt ausführen um den Teleporter auszuprobieren. Lass den Spieler einfach über den Teleporter laufen, und er sollte zu den Koordinaten geschickt werden, welche du im Creation Code definiert hast.

      Als Beweis, dass der Creation Code wirklich instanzenabhängig ist, erstelle einfach noch eine Instanz von obj_telepad und gib dieser andere Zielkoordinaten im Creation Code.

      Eine Sache, welche wichtig wäre zu erwähnen, ist dass du bei der Berührung des obj_telepad einen Error bekommen wirst, insofern du 'teleX' und 'teleY' nicht vorher definiert hast. Um das zu vermeiden reicht es folgenden Code in das Create Event von obj_telepad. Das ist ideal, da der Instance Creation Code noch VOR dem Create Event ausgeführt wird.

      GML-Quellcode

      1. //Create Event
      2. {
      3. if (!variable_local_exists("teleX")) { teleX = 16; }
      4. if (!variable_local_exists("teleY")) { teleY = 16; }
      5. }


      Gehen wir noch einen Schritt weiter

      Es ist übrigens auch möglich das Objekt auf diese Weise an eine bestimmte Stelle in einem ganz anderen Raum zu teleportieren. Zu diesem Zweck erweitern wir unser kleines Script ein wenig.

      GML-Quellcode

      1. //Create Event
      2. {
      3. if (!variable_local_exists("teleX")) { teleX = 16; }
      4. if (!variable_local_exists("teleY")) { teleY = 16; }
      5. if (!variable_local_exists("newRoom")) { newRoom = -1; }
      6. }


      Und das Collision Event folgendermaßen:

      GML-Quellcode

      1. //Collision with obj_player
      2. {
      3. other.x = teleX;
      4. other.y = teleY;
      5. if (newRoom > -1) { room_goto(newRoom); }
      6. }


      Im Creation Code deiner Instanz von obj_telepad kannst du nun in einen anderen Raum wechseln indem du die Variable newRoom folgendermaßen definierst:

      GML-Quellcode

      1. //Creation Code
      2. {
      3. teleX = 100;
      4. teleY = 200;
      5. newRoom = room1;
      6. }


      Das letzte was dazu noch zu tun ist, wäre obj_player persistent zu machen

      Zum Abschluss

      Wie du also gesehen hast, kann dieses Feature des Game Maker sehr nützlich sein. Eine andere Anwendungsmöglichkeit wäre z.B. eine Schatztruhe, in welcher du dem Spieler normalerweise ein zufälliges Item geben würdest, bei bestimmten Truhen jedoch ein spezifisches.

      Die fertigen Resultate dieses Tutorials siehst du hier:

      Instance Creation Code

      Thanks for reading.


      Hinweise auf Rechtschreib- und/oder Grammatikfehler an Kilik, inhaltliche Fehler oder Bugreports
      (auch wenn ich mir ziemlich sicher bin, dass es dererlei keiner gibt) an Chronic (bitte auf Englisch).
      Hier werden sie geholfen:
      [Regeln] [GML] [Hilfe] [Suche] [Posten] [Duden.de]
      [Wenn das alles nicht mehr hilft] [Dunning-Kruger]


      "Die Vernunft sollte Autorität definieren; nicht umgekehrt!"
      "Selber denken regt das Gehirn an."
      - Niffel f.k.a. Kilik
    • Hallo Kilik,

      Vielen Dank für dieses Tutorial und Deinen Einsatz hier generell. :happy: Gerade solch Anfängern wie mir haben Deine Tutorials bisher sehr geholfen. Mach bitte weiter so.
      Viele Grüße.
      UPUAUT
    • kann man sowas auch in GML machen?
      also ich bin im room rom_laden
      und dann möchte ich einer instanz (im room rom_game) ein eigenes Creation Event machen?
      hab schon in der Hilfe gesucht, ich meine sowas wie z.B.:

      GML-Quellcode

      1. obj = room_instance_add(rom_game,320,240,obj_player);
      2. room_instance_creation(rom_game,obj,'image_angle = 90')


      gruß, der kopierjunge :hau:

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

    • Jap, ist auch möglich.
      Nennt sich 'Pointer'.

      GML-Quellcode

      1. i=instance_create(x,y,obj_bla);
      2. i.variable=wert;

      Den kann man aber zu jeder Zeit einsetzen und nicht nur beim Erstellen der Instanz.
      Hier werden sie geholfen:
      [Regeln] [GML] [Hilfe] [Suche] [Posten] [Duden.de]
      [Wenn das alles nicht mehr hilft] [Dunning-Kruger]


      "Die Vernunft sollte Autorität definieren; nicht umgekehrt!"
      "Selber denken regt das Gehirn an."
      - Niffel f.k.a. Kilik
    • Du hast mich nicht richtig verstanden (glaub ich).
      Ich meine in einem anderen Raum, wenn man eine Instanz mit

      GML-Quellcode

      1. obj = room_instance_add(...);
      (die Funktion gibt ja die ID der erstellten Instanz zurück, wenn ich mich nicht irre)
      erstellt hat, dass man dann nur DIESER Instanz (die ja in einem anderen Raum ist),
      ein Creation Code hinzufügt.

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

    • Und du hast Kilik nicht ganz verstanden. Dieser Instance Creation Code hat eigentlich nur den Sinn, dass man nicht ein zusätzliches Controller Objekt erstellen muss, das bei Spielstart alle Instanzen initialisiert, sondern dass man das so direkt an den Instanzen machen kann. Wenn du über GML ein Objekt erstellst kannst du auch direkt, so wie Kilik beschrieben hat, über wie instance_id aktionen ausführen.
    • Das ist ziemlich umständlich, ich muss jetzt ein extra persistentes Objekt erstellen und scripten, dass dann eine Variable bei einem bestimmten Objekt einstellt, oder wie soll ich das sonst anstellen? (Ich habe wie schon gesagt 2 Rooms, und im ersten erstelle ich Objekte im zweiten Room)

      Hier ist der code, der alle Instanzen created:
      Spoiler anzeigen

      GML-Quellcode

      1. if !(file_exists('Savefiles\map_objects.sav')) {exit;}
      2. var file,index,obj,xxx,yyy,dir;
      3. pos = 0;
      4. file = file_text_open_read('Savefiles\map_objects.sav');
      5. while (1)
      6. {
      7. if (file_text_eof(file)) {break;}
      8. str = file_text_read_string(file);
      9. obj = scr_decodieren_get(str,'|',0);
      10. xxx = scr_decodieren_get(str,'|',1);
      11. yyy = scr_decodieren_get(str,'|',2);
      12. dir = scr_decodieren_get(str,'|',3);
      13. room_instance_add(rom_game,xxx,yyy,variable_global_get('object_'+obj));
      14. file_text_readln(file);
      15. }
      16. file_text_close(file);
      Alles anzeigen

      Das Problem ist, dass ich so nicht image_angle (hier dir) einstellen kann...
      Es wäre ganz nett, das in einem Instanz Creation Code unterzubringen.

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

    • Benutzer online 1

      1 Besucher