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 />

12.3 Eventsystem<br />

Schon in frühzeitiger Planungsphase war klar, daß das System in der Lage seien sollte, diverse Ein- und<br />

Ausgabegeräte abseits Tastatur und Monitor zu unterstützen. Unter dieser Prämisse wurde ein [PlugIn??]-<br />

Interface gebaut, welches eben diese Bedingung erfüllt.<br />

Schnittstelle Generell wird unterschieden zwischen Input- und Output-[PlugIn??]s, wo Input-[PlugIn??]s<br />

- wie der Name schon sagt - Eingaben annehmen und daraus eine Veränderung des Internzustandes der<br />

Welt produzieren und Output-[PlugIn??]s entsprechende Events verarbeiten, die auf Basis aktualisierter<br />

Weltdaten eine Reaktion für die Außenwelt produzieren (z.B. eine Kollision, die eine ForceFeedback Reaktion<br />

produziert); analog dazu wird ersteren das Interface mica::IInput und letzterem das Interface<br />

mica::IOutput bereitgestellt. Die jeweiligen [PlugIn??]s leiten dann von den entsprechenden Klassen<br />

ab und müssen updateInput(..) bzw. updateOutput(..) implementieren. Die Update-<br />

Methoden werden bei jedem Frame von der Engine aufgerufen und mit einem Pointer auf eine Eventliste<br />

sowie der Zeit seit dem letzten Update versehen. Die konkreten Implementationen der [PlugIn??]s füllen<br />

dann diese Liste mit Events, die von der Engine anschließend abgearbeitet werden.<br />

Damit [PlugIn??]s überhaupt durch updateInput(..) bzw. updateOutput(..) aufgerufen<br />

werden können, müssen sie bei der Engine registriert werden. Dies wird von der Klasse CExtModuleManager<br />

geregelt, welche eben diese Funktion übernimmt und intern zwei Listen mit Referenzen auf die jeweiligen<br />

IInput- und IOutput-Objekte hält. Für jedes [PlugIn??] muß nach dessen Initalisierung beim<br />

Hochfahren der Engine ein addExtObject(..) auf dem Modul-Manager aufgerufen werden. Der<br />

Methode muß die Referenz auf die [PlugIn??]-Instanz, welche von IInput bzw. IOutput abgeleitet<br />

wurde, übergeben werden. Damit sind die [PlugIn??]s beim System registriert und werden bei jedem<br />

Update von der Engine entsprechend aufgerufen.<br />

Events Die Eventliste vom Typ tEventList ist eine [STL??]-Liste und speichert die konkreten<br />

Events der verschiedenen [PlugIn??]s. Dabei ist jeder Event vom abstrakten Typ CEvent. Die Implementation<br />

der konkreten Klassen hängt dann von der Art des Events ab. Je nachdem was das [PlugIn??]<br />

in den Event an Nutzdaten schreiben will bzw. was für Informationen übertragen werden sollen,<br />

benötigt man verschiedene Implementationen. Dabei muß nicht jedes [PlugIn??] eine eigene Event-<br />

Implementation einführen; idR. reichen Standardmodelle wie CEventAcc für Beschleunigung oder<br />

CEventOrientation für Ausrichtung.<br />

Jede Implementation muß einen eindeutigen Typ haben, wodurch jedes CEvent Objekt anhand seiner<br />

ID bzgl. seiner Implementation unterschieden werden kann. Die folgende Liste enthält die verschiedenen<br />

ID bzw. Typen von Events auf:<br />

eEVENT_KEY Tastatur-Event<br />

eEVENT_ACC Beschleunigungs-Event<br />

eEVENT_ORIENTATION Neue Ausrichtung direkt setzen<br />

eEVENT_ORIENTATIONCH Änderung der Ausrichtung des Spielers<br />

eEVENT_ORIENTATION_AXIS Setzen der Ausrichtung des Spielers über die Achsen<br />

eEVENT_REPOSITION Versetzt den Spieler an eine Position<br />

eEVENT_RESETPLAYER Vetzt den Spieler auf die Startposition<br />

eEVENT_COLLISION Kollision aufgetreten; Outputevent<br />

6. Januar 2005 Seite 106

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!