Projekt Micarpet Projektbericht - artecLab - Universität Bremen
Projekt Micarpet Projektbericht - artecLab - Universität Bremen
Projekt Micarpet Projektbericht - artecLab - Universität Bremen
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Projekt</strong> MiCarpet <strong>Projekt</strong>bericht<br />
Mit 1. wird eine Funktion lua_foo aus dem Namensraum unter dem Namen foo bei der Virtual Machine<br />
registriert. Zur Laufzeit steht damit die Funktion in LUA zur Verfügung und wenn ein Script dann<br />
also foo() aufruft, wird die Funktion lua_foo() angesprungen und ausgeführt. Bei 2. kommt die<br />
Template Klasse class_ zum Einsatz, welche ein CLuaObj in C++ als Objecttyp Obj unter LUA registriert.<br />
3. ist eine Member-Funktion, die an 2. gebunden wird. Dazu gibt es noch viele Modifikationen<br />
für abstrakte, bzw. abgeleitete Klassen, Konstruktoren und ähnliches.<br />
Skripte Um ein Script zur Laufzeit auszuführen, muß auf der static Klasse<br />
CScript::exec(“script.lua”) ausgeführt werden. Das Script wird dann von der Virtual Machine<br />
interpretiert.<br />
Den Scripten, die konkrete Aktionen innehaben, sind eine Reihe von Hilfsfunktionen zur Seite gestellt.<br />
Die Definitionen dazu befinden sich im Unterverzeichnis ./header/, die immer nach Funktionsgruppen<br />
zusammengefasst sind und über Funktionspointer in Tabellen verlinkt sind. Dies bedeutet, wenn<br />
man beispielsweise auf das Titel-Textfeld zum Head-Up Display zugreifen will, findet sich dies unter<br />
HUD.title(“Text”).<br />
So wie wir es hier in einem einfachen Beispiel Script, welches beim Laden eines Levels geladen werden<br />
könnte, sehen:<br />
OBJ.getDynamic("level1"):setVisible( false )<br />
ring_map = {"null","Ring1","Ring2","Ring3","Ring4","Ring5","won"}<br />
ring_map_index = 1<br />
ring_map_maxindex = table.getn(ring_map)<br />
HUD.title("Level 1", 4000)<br />
HUD.subtext("durchfliege alle Ringe", 4000)<br />
OBJ.getDynamic("Ring1"):setVisible( false )<br />
OBJ.getDynamic(“name”) liefert die Referenz auf ein CDynamicObject auf dem dann alle<br />
freigegebenen C++ Funktionen des Objekts wie hier setVisible(..) aufgerufen werden können.<br />
Direkt darunter sieht man mit der Tabelle eine von LUAs Standardstrukturen. Praktisch alle weiteren<br />
Strukturen und Erweiterungen sind über die Tabellenstruktur realisiert.<br />
Es ist zu beachten, daß jedes Script augenblicklich zurückkehren muß, da die Abarbeitung blockierend<br />
erfolgt. Eine geplante Ablaufsteuerung kann nur über Trigger erfolgen.<br />
Um mit Triggern bzw. Kollisionen allgemein relativ leicht arbeiten zu können, existiert das Script<br />
additional-collisions.lua bzw. die entsprechende Handler-Stuktur in<br />
header/collisions.lua. Hiermit lassen sich Kollisionen unter Objekten konkreten Typs durch<br />
die Funktionen __add_(..) und __add_t(..) mit Behandlungen belegen. Also durch den Aufruf<br />
__add_(“player”, “coin1”, __coin_hit_ )<br />
legt man fest, daß bei einer Kollision zwischen den Objekten des Typ player und coin1 die Funktion<br />
__coin_hit_ aufgerufen wird. Dies wird für u.a. für interaktive Elemente wie das Piratenschiff, die<br />
einzusammelnden Münzen, Levelübergänge oder jedes Soundevent verwendet.<br />
6. Januar 2005 Seite 113