Posts mit dem Label Objekte werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Objekte werden angezeigt. Alle Posts anzeigen

Mittwoch, 9. April 2014

Kleine Tricks mit Objekten

In diesem Post will ich auf einige Tricks mit Objekten eingehen.
Das schöne am GM ist, daß die Objekte nicht zwangsläufig mit Sprites dargestellt werden müssen. Ebenfalls das verwenden einer Scriptsprache. Diese Tatsachen eröffnen gegenüber annderen Klick-Entwicklungs-Umgebungen ungeahnet Möglichkeiten.
Ich möchte in diesem Artikel nicht ins Detail gehen, sondern nur die Möglichkeiten erläutern.

Vor kurzem wollte ich ein Spiel erstellen, bei dem man von einem Seil zum anderen springen muss. Dabei sollen die Seile im Raum frei plazierbar sein und sich Physikalich korrekt verhalten. So habe ich einfach in einer Stepevent die Vorberechnungen durchgeführt und diese dann in der Drawevent mit der "draw_line" Funktion ausgegeben. Das tolle daran ist, dass ich das Objekt "Seil" überall im Level Plazieren kann. Wenn mein Spiel startet, werden die Seile "on-the-fly" berechnet. Es ist so möglich Gravitation oder Wind mit einfließen zu lassen. Dies währe über ein Sprite nur sehr mühsam bis garnicht zu bewerkstelligen.

Solche Objekte kann man auch verwenden um zB ein Baum zu sähen und ihn dann wachen zu lassen. Das kann auf ein Tastendruck erstelltes "obj_Samen" sein, dass neben dem Spieler erstellt wird. Mit der Zeit wächst aus dem Samen ein Baum (Stichwort: Fraktale). Dieser kann dann von  der Beschaffenheit seiner Umwelt beinträchtigt werden.

Ein Trick den ich oft Benutze zB um eine Unsichtbare Sperre/Mauer/Boden zu erstellen ist ein Objekt, daß nur eine Maske hat, die für die Kollisionserkennung benutzt wird. So kann man auch "unsichtbar Schalter" erstellen die bei Kollision eine Event auslösen.

Vor kurzem habe ich etwas bei Google gestöbert und ein GM-Beispiel Programm gefunden, mit dem auf eimer frei definierten Höche im Raum Wasser gezeichnet wird. Die Oberfläche wurde ins schwingem versetzt (Wasserwellen), wenn ein Objekt die Oberfläche berührt hat. Was mich sehr beindruckt hat war die Hoche Performance. Ohne weiteres kann man das Wasser in vorhandene Jump&Run Spiele einbinden. Objekte, die mit dem Wasser interagieren sollen bekommen ein Spezieles Elternobjekt (ein klick im Objekteditor).

Eine sehr beliebte Form der Abstrakten Objekt Anwendeun ist das control-Objekt. Damit kann man allgemeine Spielfunktionen steuern.
Das könnte unteranderem ein Item- bzw. Pausemenü sein.

Fazit:
Es zeigt sich schnell, daß man in Game Maker Objekte nicht zwangsläufig nur auf die Traditionelle Art und Weise verwenden muss. Game Maker biete schier Unendlich viele Möglichkeiten.

Donnerstag, 27. März 2014

Mit Eltern Objekten Arbeiten

Vererbungs Beispiel
Heute möchte ich eine tolle Funktion des Game Makers 8 vorstellen. Es ist das Vererben. Man muß sich das so Vorstellen. Ich erstelle ein Objekt obj_Enemy. Dieses Objekt beherbergt alle wichtigen Events wie z.B. das wenn man es zerstört, der Spieler Punkte bekommt oder eine Explosion entsteht. Im Grunde können in das obj_Enemy alle Events hinein, die wir sowieso in jedes Enemy-Objekt einfügen würden. Wenn unser obj_Enemy fertig ist, kommt der eigentliche Clou. Wir erstellen zwei weitere Objekte z.B. obj_EnemyShip1 und obj_EnemyShip2. Wenn wir eines der Objekte zum bearbeiten öffnen, ist direkt unter der Depth-Einstellung bzw über der Mask Auswahl das Feld für Parent (Eltern). Hier wählen wir für unser obj_EnemyShip1 und obj_EnemyShip2 das Objekt obj_Enemy. Auf diese weise bekomme
nun unsere zwei Objekte die Events von Ihrem "Eltern-Objekt" also obj_Enemy. Auch wenn die Eventliste unserer beiden Objektet leer zu sein scheinen, sie haben die Events von Ihrem Eltern-Objekt.
Jetzt können wir jeden unsere zwei Objekte zusätzliche/besondere Events Anhängen wie z.B. Bewegungsverhalten und Feuerkraft, die diese Individuell machen. Vorteil ist, daß man z.B. Kollisionen jetzt nicht mit dem Objekt A,B,C...n definieren muss, sondern nur mit den obj_Enemy. Was eine Menge an Code spart. Wenn sich das Grundverhalten der Obj_EnemyShip1 & 2 und vielleicht 3 ändern soll. So braucht man nicht alles doppelt und dreifach zu machen, sondern nur das obj_Enemy ändern.

So ich finden das diese Einführung erstmal reichen sollte. Ich würde mich sehr über Anregungen für weitere Themen freuen.

Donnerstag, 20. März 2014

Zugreifen auf Variablen anderer Instanzen

Erstellen einer Instanz aus einer anderen Instanz. Gleich darauf sollen die Variablen der Neuen Instanz verändert werden.


var my_instanceID;
my_instanceID = instance_create(320, 200, obj_enemy);
my_instanceID.speed = 10;
my_instanceID.direction = random(360);



Bei diesem Beispiel wird in der ersten Zeile unsere Variable angelegt, in der wir uns die ID der Neu erstellten Instanz zwischenspeichern.
In der zweiten Zeile erstellen wir an den Koordinaten x=320,y=200 eine Instanz vom Objekt obj_enemy und Speichern Ihre InstanzIdentifizierungsNummer (InstanzID) in die Variable my_instanceID.
In den Zeilen 3 und 4 wird verdäutlicht, wie man die Werte der neu erstellten Instanz Verändern kann.
Dabei wird der InstranzID gefolgt von einem Punkt (.) und der Instanz Variable der jeweilige Wert definiert.

Die InstanzID ist eine Individuelle Adresse einer Objekt-Instanz. Würde den wert der Variable my_instanceID ausgeben, könnte das Ergebniss soetwas sein: (16040)

Wir könnten jetzt auch anstatt der Variable dierekt die ID der Instanz eingeben. Das würde dann etwa so aussehen:

(16040).speed = 10;
(16040).direction = random(360);


Die Werte von bereits vorhandenen Instanzen verändern.


Um die Werte einer Instanz im Spielfeld zu ändern, muß man diese ers finden. Dazu gibt es in Game Maker mehrer Möglichkeiten. Eine ist es alle Instanzen zu durchsuchen:

with(o_Enemy) {
speed += 5;
}:

Mit dieser "Schleife" wird die Geschwindigkeit um 5 für jede Instanz der Objekts o_Enemy erhöht.

Eine Andere möglichkeit ist es ein Objekt in der Nähe von x,y Koordianten zu finden.
Dazu kann man den Befehl instance_nearest(x,y,obj) benutzen.

Weitere Insteressante Instanz Befehle


instance_find(obj,n)
instance_exists(obj)
instance_number(obj)
instance_position(x,y,obj)
instance_nearest(x,y,obj)
instance_furthest(x,y,obj)
instance_place(x,y,obj) 

instance_create(x,y,obj)
instance_copy(performevent)
instance_destroy()
instance_change(obj,perf)
position_destroy(x,y)
position_change(x,y,obj,perf)

Wichtiger Nachtrag:
Wenn die Variable in Instanz A aus einer Instanz B angesprochen werden soll, dann darf Sie auch nicht in mit dem Befehl "var" initialisiert werden. Denn dann ist diese nur innerhalb den Scripts/Events gültig. Stattdessen sollte die Variable einfach mit Variable=Wert definiert werden.

Was ich vor kurzem herausgefunden habe, man kann Variablen Werte auch wie in der programmier Sprache C zuweisen, indem man zB Variable:=Wert benutzt. Das kann bei der Übersichtlichkeit helfen.