Finde den Weg

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Funktionalität & mögliche Erweiterungen

Leider funktioniert das Programm nur theoretisch. Während des Programmablaufes gibt es einen Laufzeitfehler, der nicht behoben wurde.

Wenn sich der Spieler im Feld bewegt, verdeckt er leider durch seinen Schatten immer wieder Teile des projizierten Feldes. Mitthilfe eines weiteren Beamers, der von der anderen Seite das Bild projiziert und exakt auf das Bild des anderen abgestimmt ist, könnte dieses Problem gelöst werden.

Grundidee

Das Spiel aus der Fernsehsendung TabalugaTV transportabel machen. Hier mussten die Kandidaten sich einen Weg durch ein Eisschollenfeld einprägen und ihn anschließend ablaufen.

Hardware

Für die Projektion wurde einen Kurzdistanz-Beamer (Sanyo PLC-XL50 ) genutzt. So erspart man sich die aufwendige Montage an der Zimmerdecke. Als Input wurde eine Webcam verwendet. Blick- und Projektion-Richtung müssen übereinstimmen, der Spieler bewegt sich darauf zu.

Software

Erstellt wurde das Programm in Code::Blocks mit der Open Frameworks Libary.

Spielfeld

Im Gegensatz zum original Spielfeld wurde hier ein rechteckiges Feld verwendet. Was zwei Vorteile bietet, zum einen ist die Speicherung in einem Array sehr einfach und eindeutig, zum anderen erleichtert es auch die Positionsbestimmung.

Spielfeld.jpg

Hinweise zur Nutzung

Der Spieler bewegt sich während der Nutzung auf den Beamer zu. Zusätzlich ist es wichtig, dass der Spieler keine Schatten zur Seite wirft, da sonst die Detektion sich nach rechts bzw. links verschiebt.

Detektion

Der Spieler betritt eine Eisscholle, wobei die für ihn "sichere Fläche" kleiner ist als das Rechteck was detektiert wird. So wird die Wahrscheinlichkeit einer sicheren Erkennung erhöht.

Die Positon wird über eine Hintergrundsubtraktion und anschießende Blob-Erkennung realisiert. Als Position wird der Mittelpunkt der unteren Rechtecksline genutzt. Hier noch mit einem Test-Spielfeld: Spieler auf feld.jpg

Betrieb

Initialisierung:

Die Ecken des Spielfeldes werden detektiert, um die Verzerrung der Kamera heraus zu rechnen. Ist die Initialisierung abgeschlossen, so erscheint ein „Welcome“ Screen.

Spiel:

Der Spieler hat zuerst die Wahl zwischen 3 Schwierigkeitsgraden. Anschließend wird ihm der Weg gezeigt, den er dann ablaufen muss. Sollte er hierbei ein falsches Feld betreten, so ist das Spiel verloren. Ein Feedback bei richtiger Feld-Wahl wurde noch nicht realisiert.

Weg Generierung

Bei der Generierung wird darauf geachtet, dass der Weg nicht zusätzliche Verbindungen hat, um Abkürzungen auszuschließen. Die Klasse field ist zuständig für das Generieren des Weges.

Sie enthält folgende Funktionen und Variablen:

class Field
{
private:
    int xsize;
    int ysize;
    int** array;
    Parameter parameter;
    void setparameter(int** array);
    void clear();
public:
    ~Field();
    Field(int x, int y);       
    void show();                
    void genway(int size);      
    Parameter getparameter();   
    void getfield(int* dest,int x, int y);
 
};

Die Klasse field enthält ein Objekt Parameter:

struct Parameter
{
    int x;  //Größe des Feldes in x-Richtung
    int y;  //Größe des Feldes in y-Richtung
    int xstart;  //x-Koordinate des Startfeldes
    int ystart;  //y-Koordinate des Startfeldes
    int xziel;  //x-Koordinate des Zielfeldes
    int yziel;  //y-Koordinate des Zielfeldes
    Orientierung * o;
};

Parameter enthält wiederum einen Array der Größe xsize*ysize (also für jedes Spielfeld ein Objekt) aus Orientierung-Objekten:

struct Orientierung
{
    bool c;  //c wie center ist gesetzt, wenn das Feld selbst ein Wegfeld ist
    bool r;  //r wie right ist gesetzt, wenn das Feld rechts daneben ein Wegfeld ist
    bool l;  //l wie left ist gesetzt, wenn das Feld links daneben ein Wegfeld ist
    bool t;  //t  wie top ist gesetzt, wenn das Feld direkt darüber ein Wegfeld ist
    bool b;  //b wie bottom ist gesetzt, wenn das Feld direkt darunter ein Wegfeld ist
};
 
Field(int x, int y)
Beim Ausführen des Konstruktors wird ein zweidimensionales Array der Größe x mal y angelegt.

Die Variable xsize erhält den Wert x, die Variable ysize erhält den Wert y, in der Variable array wird ein Zeiger auf das angelegte Array gespeichert. Anschließend wird die Funktion clear() aufgerufen, die das Array mit Nullen füllt. Dieses int-Array repräsentiert das Spielfeld, wobei jeder int ein Feld ist. Danach wird Parameter in der Variable x die Größe des Feldes in x-Richtung und in Variable y die Größe des Feldes in y-Richtung gespeichert. Alle weiteren Parameter werden vorerst auf Null gesetzt.


void genway(int size)
Es wird zufällig ein Weg mit size Feldern erzeugt. Jedes Feld das Teil des Weges ist wird in array auf 1 gesetzt. Das Zielfeld wird auf 2 gesetzt. Der Rest der Felder bleibt 0. Anschließend wird die Funktion setparameter aufgerufen. Diese aktualisiert nun die Parameter in der Variable parameter.


void show()
Diese Funktion ist nur zu Testzwecken vorhanden. Sie gibt das Array in der Konsole aus.


void getfield(int* dest ,int x, int y)
In array ist für jedes Spielfeld ein int-Wert vorhanden. Mithilfe der Funktion getfield kann das Feld auf eine gewünschte Größe vergrößert werden. Die Variable x gibt die gewünschte Größe in x-Richtung an, die Variable y die gewünschte Größe in y-Richtung. Das entstandene zweidimensionale Array wird schließlich in ein eindimensionales Array umgewandelt und unter der Variable dest gespeichert.

Beispiel

Ein Feld mit 8x8 Felder ist gewünscht und der Weg soll 18 Felder lang sein. Das Feld soll auf 600x600 Bildpunkten dargestellt werden.

Parameter p;
int dest[600*600];
Field spielfeld(8,8);
spielfeld.genway(18);
p = spielfeld.getparameter();
spielfeld.getfield(dest,600,600);

gesamter Code

Code als Zip