Manuals
Manuals




This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English

Bausteine

Der Aufbau von Defold beruht auf einigen Konzepten, die du gut verstehen solltest. Dieses Handbuch erklärt, woraus die Bausteine von Defold bestehen. Lies anschließend das Handbuch zur Adressierung und das Handbuch zur Nachrichtenübermittlung. Außerdem stehen dir direkt im Editor eine Reihe von Tutorials zur Verfügung, die dir einen schnellen Einstieg ermöglichen.

Bausteine

Es gibt drei grundlegende Arten von Bausteinen, mit denen du ein Defold-Spiel aufbaust:

Sammlung
Eine Sammlung (collection) ist eine Datei, mit der du dein Spiel strukturierst. In Sammlungen baust du Hierarchien aus Spielobjekten (game objects) und weiteren Sammlungen auf. Üblicherweise strukturierst du damit Spiellevels, Gegnergruppen oder Figuren, die aus mehreren Spielobjekten bestehen.
Spielobjekt
Ein Spielobjekt ist ein Container mit einem Bezeichner (ID), einer Position, einer Drehung und einer Skalierung. Es dient dazu, Komponenten (components) aufzunehmen. Spielobjekte werden üblicherweise verwendet, um Spielfiguren, Geschosse, das Regelsystem des Spiels oder eine Funktion zum Laden von Levels zu erstellen.
Komponente
Komponenten sind Einheiten, die du in Spielobjekte einfügst, um ihnen im Spiel eine visuelle, akustische und/oder logische Darstellung zu geben. Üblicherweise erstellst du damit Sprites für Figuren und Skriptdateien oder fügst Soundeffekte oder Partikeleffekte hinzu.

Sammlungen

Sammlungen sind Baumstrukturen, die Spielobjekte und weitere Sammlungen enthalten. Eine Sammlung wird immer in einer Datei gespeichert.

Beim Start lädt die Defold-Engine eine einzelne Startsammlung (bootstrap collection), die in der Einstellungsdatei game.project festgelegt ist. Die Startsammlung heißt häufig “main.collection”, du kannst aber jeden beliebigen Namen verwenden.

Eine Sammlung kann Spielobjekte und weitere Sammlungen enthalten, die als Referenz auf die Datei der jeweiligen Untersammlung eingebunden sind. Du kannst sie beliebig tief verschachteln. Hier siehst du eine Beispieldatei namens “main.collection”. Sie enthält ein Spielobjekt (mit der ID “can”) und eine Untersammlung (mit der ID “bean”). Die Untersammlung enthält wiederum zwei Spielobjekte: “bean” und “shield”.

Sammlung

Beachte, dass die Untersammlung mit der ID “bean” in einer eigenen Datei namens “/main/bean.collection” gespeichert ist und in “main.collection” lediglich referenziert wird:

Sammlung bean

Du kannst Sammlungen selbst nicht adressieren, da es zur Laufzeit keine Objekte gibt, die den Sammlungen “main” und “bean” entsprechen. Manchmal musst du jedoch den Bezeichner einer Sammlung als Teil des Pfads zu einem Spielobjekt verwenden (Einzelheiten findest du im Handbuch zur Adressierung):

-- file: can.script
-- get position of the "bean" game object in the "bean" collection
local pos = go.get_position("bean/bean")

Eine Sammlung wird einer anderen Sammlung immer als Referenz auf eine Sammlungsdatei hinzugefügt:

Führe einen Rechtsklick auf die Sammlung in der Ansicht Outline aus und wähle Add Collection File.

Spielobjekte

Spielobjekte sind einfache Objekte, die während der Ausführung deines Spiels jeweils eine eigene Lebensdauer haben. Spielobjekte besitzen eine Position, eine Drehung und eine Skalierung, die du jeweils zur Laufzeit verändern und animieren kannst.

-- animate X position of "can" game object
go.animate("can", "position.x", go.PLAYBACK_LOOP_PINGPONG, 100, go.EASING_LINEAR, 1.0)

Du kannst Spielobjekte leer verwenden, etwa als Positionsmarkierungen. Üblicherweise sind sie jedoch mit verschiedenen Komponenten wie Sprites, Audiokomponenten, Skripten, Modellen, Fabriken (factory) und weiteren ausgestattet. Spielobjekte werden entweder im Editor erstellt und in Sammlungsdateien platziert oder zur Laufzeit dynamisch durch Fabrikkomponenten erzeugt.

Spielobjekte werden entweder direkt in eine Sammlung eingefügt (in-place) oder einer Sammlung als Referenz auf eine Spielobjektdatei hinzugefügt:

Führe einen Rechtsklick auf die Sammlung in der Ansicht Outline aus und wähle Add Game Object (direkt einfügen) oder Add Game Object File (als Dateireferenz einfügen).

Komponenten

Komponenten (components) verleihen Spielobjekten (game objects) eine bestimmte Darstellung und/oder Funktionalität. Komponenten müssen in Spielobjekten enthalten sein und werden durch die Position, Drehung und Skalierung des Spielobjekts beeinflusst, das sie enthält:

Komponenten

Viele Komponenten haben typspezifische Eigenschaften, die du ändern kannst. Außerdem gibt es typspezifische Funktionen für die Interaktion mit ihnen zur Laufzeit:

-- disable the can "body" sprite
msg.post("can#body", "disable")

-- play "hoohoo" sound on "bean" in 1 second
sound.play("bean#hoohoo", { delay = 1, gain = 0.5 } )

Komponenten werden entweder direkt in ein Spielobjekt eingefügt (in-place) oder einem Spielobjekt als Referenz auf eine Komponentendatei hinzugefügt:

Klicke mit der rechten Maustaste auf das Spielobjekt in der Ansicht Outline und wähle Add Component (direkt einfügen) oder Add Component File (als Dateireferenz einfügen).

In den meisten Fällen ist es am sinnvollsten, Komponenten direkt im Spielobjekt zu erstellen. Die folgenden Komponententypen müssen jedoch in separaten Ressourcendateien erstellt werden, bevor du sie einem Spielobjekt als Referenz hinzufügst:

  • Script
  • GUI
  • Particle FX
  • Tile Map

Eine Liste aller verfügbaren Komponententypen findest du in der Komponentenübersicht.

Objekte direkt oder als Referenz hinzufügen

Wenn du eine Datei für eine Sammlung, ein Spielobjekt oder eine Komponente erstellst, legst du damit einen sogenannten Prototyp an (in anderen Engines auch als „Prefabs“ oder „Blueprints“ bekannt). Dadurch wird lediglich eine Datei zur Dateistruktur des Projekts hinzugefügt. Deinem laufenden Spiel wird nichts hinzugefügt. Um eine Instanz einer Sammlung, eines Spielobjekts oder einer Komponente auf Grundlage einer Prototypdatei hinzuzufügen, fügst du eine Instanz davon in eine deiner Sammlungsdateien ein.

In der Ansicht Outline kannst du sehen, auf welcher Datei eine Objektinstanz beruht. Die Datei “main.collection” enthält drei Instanzen, die auf Dateien beruhen:

  1. Die Untersammlung “bean”.
  2. Die Skriptkomponente “bean” im Spielobjekt “bean” in der Untersammlung “bean”.
  3. Die Skriptkomponente “can” im Spielobjekt “can”.

Instanz

Der Vorteil von Prototypdateien wird deutlich, wenn du mehrere Instanzen eines Spielobjekts oder einer Sammlung hast und alle ändern möchtest:

Spielobjektinstanzen

Wenn du die Prototypdatei änderst, wird jede Instanz, die diese Datei verwendet, sofort aktualisiert.

Prototyp eines Spielobjekts ändern

Hier wird das Sprite-Bild der Prototypdatei geändert, und sofort werden alle Instanzen aktualisiert, die diese Datei verwenden:

Aktualisierte Spielobjektinstanzen

Spielobjekte einem übergeordneten Spielobjekt zuordnen

In einer Sammlungsdatei kannst du Hierarchien von Spielobjekten aufbauen, sodass ein oder mehrere Spielobjekte einem einzelnen übergeordneten Spielobjekt untergeordnet sind. Wenn du ein Spielobjekt auf ein anderes ziehst und dort ablegst, wird das gezogene Spielobjekt dem Zielobjekt untergeordnet:

Spielobjekte einem übergeordneten Spielobjekt zuordnen

Eltern-Kind-Hierarchien von Objekten sind dynamische Beziehungen, die beeinflussen, wie Objekte auf Transformationen reagieren. Jede Transformation (Bewegung, Drehung oder Skalierung), die auf ein Objekt angewendet wird, wird wiederum auch auf dessen untergeordnete Objekte angewendet, sowohl im Editor als auch zur Laufzeit:

Transformation eines untergeordneten Objekts

Umgekehrt erfolgen Verschiebungen eines untergeordneten Objekts im lokalen Koordinatensystem des übergeordneten Objekts. Im Editor kannst du wählen, ob du ein untergeordnetes Spielobjekt im lokalen Koordinatensystem oder im Weltkoordinatensystem bearbeitest. Wähle dazu Edit ▸ World Space (die Standardeinstellung) oder Edit ▸ Local Space.

Du kannst das übergeordnete Objekt auch zur Laufzeit ändern, indem du eine set_parent-Nachricht an das Objekt sendest.

local parent = go.get_id("bean")
msg.post("child_bean", "set_parent", { parent_id = parent })

Ein häufiges Missverständnis ist, dass sich die Position eines Spielobjekts in der Sammlungshierarchie ändert, wenn es Teil einer Eltern-Kind-Hierarchie wird. Dabei handelt es sich jedoch um zwei sehr unterschiedliche Dinge. Eltern-Kind-Hierarchien verändern den Szenengraphen dynamisch, sodass Objekte visuell miteinander verbunden werden können. Die Adresse eines Spielobjekts wird ausschließlich durch seine Position in der Sammlungshierarchie bestimmt. Sie bleibt während der gesamten Lebensdauer des Objekts unverändert.