14.11.2012 Aufrufe

Projekt Micarpet Projektbericht - artecLab - Universität Bremen

Projekt Micarpet Projektbericht - artecLab - Universität Bremen

Projekt Micarpet Projektbericht - artecLab - Universität Bremen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!