Entwicklung einer netzwerkfähigen Brettspiele-App für
Transcrição
Entwicklung einer netzwerkfähigen Brettspiele-App für
Fachbereich 3: Mathematik und Informatik Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren Jeffrey Wolfe [email protected] 236 957 8 Saskia Müller [email protected] 236 720 9 1. Oktober 2012 1. Gutachter: Dr. Christoph Stahl 2. Gutachter: Prof. Dr. Bernd Krieg-Brückner Jeffrey Wolfe, Saskia Müller Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren Bachelorarbeit, Fachbereich 3: Mathematik und Informatik Universität Bremen, Dezember 2012 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren Selbstständigkeitserklärung Hiermit erkläre ich, dass ich die vorliegende Arbeit selbstständig angefertigt, nicht anderweitig zu Prüfungszwecken vorgelegt und keine anderen als die angegebenen Hilfsmittel verwendet habe. Sämtliche wissentlich verwendete Textausschnitte, Zitate oder Inhalte anderer Verfasser wurden ausdrücklich als solche gekennzeichnet. Bremen, den 1. Oktober 2012 Jeffrey Wolfe Saskia Müller 3 Inhaltsverzeichnis Inhaltsverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i Abbildungsverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v 1 Einleitung 1 1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Ziel der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3 Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 Ähnliche Projekte 2.1 2.2 2.3 2.4 2.5 2.6 3 iPawn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.1 Abgrenzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 zAPPed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2.1 Abgrenzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 ePawn Arena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3.1 Abgrenzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Disney’s Appmates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.4.1 Abgrenzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Dice+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.5.1 Abgrenzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3 Konzeption von Brettspielen 11 3.1 Geschichtlicher Hintergrund . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.2 Klassische Brettspiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.3 Regeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.4 Spielablauf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.4.1 Gerichteter Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.5 Spielfiguren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.6 Spielzug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.6.1 17 Spielzug Ende erkennen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Technische Grundlagen 19 i Bachelorarbeit Spielfiguren 4.1 4.2 4.3 4.4 4.5 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 4.1.1 Dalvik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 4.1.2 Android Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 4.1.2.1 Androidmanifest.xml . . . . . . . . . . . . . . . . . . . . . . . . 21 4.1.2.2 Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.1.2.3 Intents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4.2.1 Simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 XMPP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 4.3.1 Jingle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.4.1 Khronos Group . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.4.2 OpenGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.4.3 WebGL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.4.4 OpenGL ES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.4.5 Shader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.4.6 OpenGL Räume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Touchscreens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.5.1 Resistive Touchscreens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.5.2 Surface Acoustic Wave Touchscreen . . . . . . . . . . . . . . . . . . . . . 31 4.5.3 Infrarot Touchscreens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.5.4 Kapazitive Touchscreens . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.5.5 Multitouch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.5.6 Was wir verwenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5 ANABEL 5.1 5.2 5.3 36 5.1.1 Vorüberlegungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.1.1.1 Spielfiguren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.1.1.2 Würfel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Testumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 5.2.1 38 Acer Iconia A200 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Anwendungsbeispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 5.3.1 Spiel Erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 5.3.1.1 Login Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 5.3.1.2 Choice Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 5.3.1.3 Create Game Activity . . . . . . . . . . . . . . . . . . . . . . . . 40 5.3.1.4 XMPP Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Spiel Beitreten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.3.2 ii 35 Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 5.3.2.1 Login Activity und Choice Activity . . . . . . . . . . . . . . . . 41 5.3.2.2 Join Game Activity . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.3.2.3 Accept Invite Activity . . . . . . . . . . . . . . . . . . . . . . . . 42 5.3.2.4 Spielansicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 6 Implementierung 47 6.1 Android Manifest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 6.2 Boardgame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 6.2.1 GameApp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 6.2.1.1 Regeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.2.1.2 Spielfigur setzen . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 CreateGameActivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 6.2.2.1 Take Picture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 XMPPActivity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Spielobjekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 6.3.1 Board . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Spieldarstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.4.1 GameView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 6.4.2 GameRenderer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 6.4.3 RendererDie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 6.4.4 Texturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Netzwerkkommunikation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 6.5.1 Funktionsweise XMPP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 6.5.2 Klasse Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 6.5.3 Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 6.5.4 6.2.2 6.2.3 6.3 6.4 6.5 6.6 6.7 Network Objekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Interne Abläufe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 6.6.1 Spiel Erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.6.2 Spiel Beitreten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 6.6.3 Spielzüge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Ausblick Implementierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 6.7.1 Rule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6.7.1.1 StateRule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6.7.1.2 MoveRule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Edge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 6.7.2 7 Fazit und Ausblick 85 7.1 Was Implementiert wurde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 7.2 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 A Appendix 87 iii Bachelorarbeit Spielfiguren iv Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen A.1 Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 A.2 Glossar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 A.3 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 A.4 Arbeitsanteil an ANABEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren Abbildungsverzeichnis 2.1 iPawn Gänsespiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2 zAPPed edition! Quelle: http://volumique.com/ . . . . . . . . . . . . . . . . . . . 4 2.3 ePawn Arena Quelle: http://www.ePawn.fr/ . . . . . . . . . . . . . . . . . . . . . 6 2.4 Appmates Quelle: http://www.langitberita.com . . . . . . . . . . . . . . . . . . . 7 2.5 DICE+ Quelle: http://scr3.golem.de/screenshots/1206/Dice/DICEcolors.jpg . . . 8 3.1 Mensch ärgere dich nicht Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 5.1 Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.2 Login Activity 39 5.3 Choice Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 5.4 Create Game Activity Online Modus, vier Spieler Ansicht . . . . . . . . . . . . . 40 5.5 XMPP Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.6 Join Game Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.7 Accept Invite Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.8 Spielansicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.9 Angezeigtes Ziel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 5.10 Gewinnmeldung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 6.1 Klassendiagramm Paket Boardgame . . . . . . . . . . . . . . . . . . . . . . . . . 48 6.2 Reduzierte Klasse GameApp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.3 Reduzierte Klasse CreateGameActivity . . . . . . . . . . . . . . . . . . . . . . . . 51 6.4 gameLogic Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 6.5 Spiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.6 Renderer-Paket Klassendiagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 6.7 reduzierte GameView Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 6.8 reduzierter GameRenderer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 6.9 Standart Feld Textur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 6.10 Hervorgehobene Textur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 6.11 Würfel Textur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 6.12 reduzierter RendererDie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 6.13 Spielbrett Textur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 6.14 Spielzug Textur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 6.15 Foto Umrandungs Texturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 6.16 Klassendiagramm Network Paket . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 6.17 Klasse Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 6.18 Interner Spielablauf beim Spiel erstellen . . . . . . . . . . . . . . . . . . . . . . . 77 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.19 Interner Spielablauf beim Spiel beitreten . . . . . . . . . . . . . . . . . . . . . . . 79 6.20 Interner Spielablauf beim Spielzug . . . . . . . . . . . . . . . . . . . . . . . . . . 81 6.21 Klassendiagramm Verallgemeinerung von Regeln . . . . . . . . . . . . . . . . . . 82 A.1 QR Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 1 Kapitel 1 Einleitung 1.1 Motivation Jeffrey Wolfe Ein gemütlicher Spieleabend mit Freunden und Familie ist ein sehr beliebter Zeitvertreib, bei dem man wunderbar das Zusammengehörigkeitsgefühl stärken kann. Außerdem eignen sich Brettspiele für eigentlich jeden, egal ob jung oder alt. Leider ist es oft nicht möglich zusammen zu spielen, da man z.B. zu weit voneinander entfernt wohnt, es an Zeit mangelt oder es einfach an der Organisation, alle an einem Ort zu versammeln, scheitert. Wie macht man es nun einfacher, dass man unabhängig vom Ort mit jemandem spielen kann? Typischerweise dienen in dieser Situation Computerspiele, jedoch sind diese gerade für ältere Menschen meist ungeeignet, da ihnen der Umgang mit Computern schwer fällt oder einfach nicht gefällt. Stattdessen haben wir uns überlegt, wie man dem echten Brettspiel möglichst nahe kommt und trotzdem entferntes Spielen über das Internet realisieren kann. Da wir aus dem bereits genanntem Grund Computer ausgeschlossen haben, boten sich Tablets an, die sich zurzeit immer größerer Beliebtheit erfreuen. Ein Tablet lässt sich wie ein Spielbrett flach auf den Tisch legen und über den Bildschirm bedienen. Um so nah wie möglich am echten Brettspiel zu bleiben, wollen wir aber Spielfiguren statt eines Fingers nutzen. 1.2 Ziel der Arbeit Das Ziel unserer Arbeit ist es, eine Android App für Tablets zu entwickeln, mit der es möglich ist, klassische Brettspiele mit echten Figuren, gemeinsam über das Internet an verschiedenen Orten spielen. Die App soll leicht bedienbar sein und auch auf die Bedürfnisse von Älteren angepasst sein, z.B. durch große Schrift. Mit der App sollen verschiedene Brettspiele gespielt können und der Spielablauf dabei so natürlich wie möglich gestaltet werden. Das bedeutet, dass 1 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 1.3. ÜBERBLICK wie bei Brettspielen aus Pappe keinerlei bzw. so wenig wie möglich Unterstützung im Bezug auf Spielregeln geschieht. Da auch entfernte Spieler mitspielen können sollen, müssen wir allerdings immer protokollieren, welcher Spieler gerade am Zug ist, an welcher stelle sich die Figuren befinden und wann ein Zug zu Ende ist. Der Würfel soll hierbei ein dreidimensionaler virtueller Würfel sein. Mit der App sollen auch Fotos der Spieler gemacht werden können, um sich so näher mit den entfernten Personen verbunden zu fühlen. Auch sollen die Fotos Anzeigen, wer gerade am Zug ist. Um die klassischen Brettspiele in die heutige Zeit zu versetzten, soll jedes Brettspiel visuelle Unterstützungen bieten und die Kommunikation an der mehrere Personen an verschiedenen Orten teilnehmen soll über XMPP laufen. Unterstützt werden, sollen zwei bis vier Personen Spiele. Diese sollen an mindestens zwei verschiedenen Orten und an mindestens zwei verschiedenen Tablets spielbar sein. 1.3 Überblick Bevor wir mit der Arbeit an unserer App angefangen haben, haben wir uns darüber informiert, was es bereits für ähnliche Projekte gibt, darum befassen wir uns im zweiten Kapitel mit diesen und grenzen uns von diesen ab. Im dritten Kapitel gehen wir genauer auf Brettspiele ein und speziell darauf, auf was man bei Mensch ärgere dich nicht achten muss, damit wir dieses Spiel auf dem Tablet und über das Internet Spielen können. Im vierten Kapitel erklären wir alle Grundlagen, die für das weitere Verstehen unserer Bachelorarbeit nötig sind. Im fünften Kapitel stellen wir die entwickelte App und das benutzte Tablet vor. Anschießend folgt im sechsten Kapitel die Implementierung unserer App und als letztes in Kapitel sieben folgt unser Fazit und ein Ausblick darüber, was noch umgesetzt werden kann. 2 Kapitel 2 Ähnliche Projekte In diesem Kapitel stellen wir einige Projekte vor, die unserem mehr oder weniger ähneln und grenzen uns von ihnen ab, um hervorzuheben, was an unserem Projekt neu ist. 2.1 Abbildung 2.1 Jeffrey Wolfe iPawn Gänsespiel Quelle: http://wpuploads.appadvice.com/wp-content/uploads/2011/11/iPawn.jpg 3 Bachelorarbeit Spielfiguren 2.2. ZAPPED Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Die Spielefirma Jumbo vertreibt unter dem Namen iPawn eine Reihe von Gesellschaftspielen, die auf einem Ipad gespielt werden können. Für jedes der Spiele werden spezielle Spielfiguren und Spielaccessoires verkauft, für die man eine kostenlose Spiele App herunterladen kann. Diese Spielfiguren sind dafür ausgelegt zur Interaktion mit dem Spiel zu dienen, je nach Spiel und Figur werden im Spiel unterschiedliche Dinge ausgelöst.[14] 2.1.1 Abgrenzung iPawn ist unserem Projekt sehr ähnlich, zwei der bisher erhältlichen Spiele, Gänsespiel und Leiterspiel, sind ebenfalls Brettspiele. Damit eine Interaktion zwischen Figuren und dem Tablet möglich ist, werden genau wie in unseren Projekt leitfähige Figuren genutzt. Das größte Unterscheidungsmerkmal ist das Fehlen einer Möglichkeit die Spiele auf verschiedenen Tablets miteinander zu spielen. 2.2 zAPPed Die Firma Volumique entwickelt unterschiedliche Augmented Reality Apps für iOS, die entweder die Kamera des iPhones bzw. iPads oder den Touchscreen dazu nutzen eine App und die Realität miteinander zu verbinden. Unter der Bezeichnung zAPPed Edition! werden diese von Hasbro verkauft. Zwei dieser Spiele, BattleShip Zapped Edition und SPELLSHOT zAPPed edition!, ähneln dabei dem was wir in unserem Projekt umsetzen wollen. Abbildung 2.2 zAPPed edition! Quelle: http://volumique.com/ Die Figuren haben eine leitfähige Lackierung, die die Unterseite nicht komplett bedeckt. So hat jede Figur mehrere Touch-Punkte, die in einer bestimmten Form angeordnet sind, damit ein 4 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 2. ÄHNLICHE PROJEKTE Muster entsteht durch das man die Figuren voneinander unterscheiden kann.[20] 2.2.1 Abgrenzung Wie bereits iPawn unterscheiden sich diese Produkte vor allem durch das Fehlen eines Netzwerkmodus. Außerdem kann man nicht jede beliebige Figur aus einem Leitfähig Material nehmen, sondern braucht die passenden Figuren für die jeweilige App. 2.3 ePawn Arena Saskia Müller Die Firma ePawn [8] hat eine neue Technologie entwickelt, die vorraussichtlich Ende des Jahres auf dem Markt erscheint. Es handelt sich um die ePawn Arena. Wenn es erscheint, wird es ein 26” Display, welches Figuren erkennen und Bewegungen verfolgen kann. Der momentane Prototyp ist noch deutlich kleiner und dicker als das finale Gerät sein soll. An dieses Display kann jedes Smartphone oder Tablet angeschlossen werden, auf dem Android oder iOS laufen. Auf den angeschlossenen Geräte läuft das Spiel und die Logik, nicht auf dem Display selber. Die Entwickler von ePawn stellen ein SDK bereit, mit dem jeder seine eigenen Spiele entwickeln kann. Die ePawn Arena kann bis zu 80 Figuren erkennen. Die Figuren sind mit Tags ausgestattet, durch die es möglich ist, die Ausrichtung, die Ausrüstung und den Typen der Figur zu erkennen. Hierdurch können auch Tabletop Spiele umgesetzt werden. 5 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 2.4. DISNEY’S APPMATES Abbildung 2.3 2.3.1 ePawn Arena Quelle: http://www.ePawn.fr/ Abgrenzung ePawn Arena unterscheidet sich in mehreren Dingen von unserem Projekt. Zum Einen benutzt die ePawn Arena ein eigenständiges Display, welches Möglichkeiten zur Figurerkennung und Verfolgung bietet und keinerlei Spiellogik in sich hat. Zum Anderen ist es eher auf Tabeltop Spiele als auf klassische Spiele ausgelegt, die aber dennoch implementiert werden könnten. Außerdem gibt es keine Möglichkeit, mehrere ePawn Arenas über das Internet zu verbinden und so über Entfernung mit Freunden zu Spielen. 2.4 Disney’s Appmates Bei der App Disneys Appmates [3] handelt es sich um eine App für Ipads, bei der man mit einem Auto aus dem Film ”Cars”, einem Spielzeugauto zum Anfassen, auf verschiedenen Untergründen fährt. Beispielsweise kann das Auto über Hindernisse springen, was durch schöne Animationen dargestellt wird. Auch Rennen gegen virtuelle Autos können gefahren werden. Bei diesen Rennen bewegt man das Auto kaum, das Meiste passiert durch gut gemachte Animationen und Drehen des Autos in die Richtung, in die es fahren soll. Damit das Auto bzw. die Bildschirmanimation sich bewegt, muss das Auto nur leicht nach unten gedrückt werden, dadurch reagieren die Sensoren die unter dem Auto angebracht sind. Begleitet wird das Spiel von passenden Sounds. 6 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 2. ÄHNLICHE PROJEKTE Abbildung 2.4 2.4.1 Appmates Quelle: http://www.langitberita.com Abgrenzung Disney’s Appmates ist am weitesten von unserem Projekt entfernt, da es nichts mit Brettspielen im eigentlichen Sinne zu tun hat. Die Ähnlichkeit zu unserm Projekt ist, dass echte Figuren auf einem Tablet benutzt werden und somit eine erweiterte Realität geschaffen wird. In der Art und Weise, wie die Welt geschaffen wird unterscheidet es sich sehr, da sich die Welt laufend ändert und die ganze Zeit animiert ist. Unser Animationen sind nur beim Würfeln oder wenn ein Event erfolgt. 2.5 Dice+ Dice+ ist ein Würfe,l der über Bluetooth das Würfelergebnis an ein Tablet sendet. Die Macher von DICE+ [6], GIC wollen mit diesem Würfel das Misstrauen der Menschen in die Zufälligkeit der Digitalen Würfel unterbinden. Der Würfel hat eine weiche, gummiartige Oberfläche mit einer Seitenlänge von einem Inch. Die Batterien halten bis zu 20 Stunden Dauerrollen oder realistischer ca. eine Woche bei normalem Gebrauch und ist wiederaufladbar über MicroUSB. 7 Bachelorarbeit Spielfiguren 2.5. DICE+ Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Benutzen kann man diesen bei bisher sieben Spielen, die die Firma entwickelt hat. Darunter befindet sich beispielsweise Ludo, welches dem Spiel Mensch ärgere dich nicht sehr ähnelt. Sie wollen also, so wie wir das Gefühl des echten Brettspielfeeling, nur legen sie ihren Fokus auf den Würfel und nicht auf die Figuren. Die sieben Spiele laufen auf Tablets und werden über den Finger gesteuert. Ein Erscheinungstermin steht noch nicht fest, aber der Preis wird sich vermutlich um die 30 Dollar belaufen. Abbildung 2.5 2.5.1 DICE+ Quelle: http://scr3.golem.de/screenshots/1206/Dice/DICEcolors.jpg Abgrenzung Bei DICE+ werden ebenfalls Brettspiele für Tablets entwickelt, die mit echtem Spielzubehör laufen sollen. Hierbei wird ein echter Würfel benutzt, den wir auch noch entwickeln möchten, allerdings wollen wir die Möglichkeit geben, auch einen digitalen Würfel zu benutzen. Außerdem wollen wir eher einen klassischen Plastikwürfel inklusive des Würfelbechers haben, als einen mit einer Gummioberfläche. Zudem Benutzen wir echte Figuren und mit unserer App kann man über das Internet mit anderen Spielern spielen. 8 Bachelorarbeit 2.6 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 2. ÄHNLICHE PROJEKTE Fazit In der unten stehenden Tabelle 2.1 zeigen wir die Stärken und Schwächen der Einzelnen Projekte, dabei stellt sich heraus, dass wir in einem bzw. zwei Punkten als einzige als Positiv in der Tabelle auftauchen. Das bedeutet, dass unser Projekt, das einzige ist, bei dem es Möglich ist über das Internet mit anderen zu Spielen. Auch das aufnehmen von Fotos, ist bei uns einzigartig, dieses Resultiert allerdings daraus, das wir die einzigen mit einem online Spiel sind. Ohne über Entfernung zu spielen, ist es nicht nötig, Bilder zu übertragen, da sich die Personen gegenüber Sitzen. In einem Punkt sind wir allerdings zur Zeit etwas schlechter, als die anderen Projekte. Animationen haben wir zum jetzigen Zeitpunkt noch nicht sehr viele, dieses soll sich aber noch ändern. Feature iPawn ePawn DICE+ Appmates zAPPed ANABEL Echte Spielobjekte + + + + + + Klassische Spiele + + + - + + Besondere Spiele (Tabletop) - + - + + - Animationen + + + + + 0 Netzwerk - - - - - + Tabelle 2.1 Schwächen und Stärken der einzelnen Produkten 9 Kapitel 3 Konzeption von Brettspielen Saskia Müller Jeder kennt sie und jeder hat schon einmal welche gespielt: Die klassischen Brettspiele wie Mensch ärgere dich nicht oder Schach. Das wichtigste und namensgebende Element eines Brettspieles, ist das Spielbrett. Mit ihm wird mittels anderer Elemente interagiert, das häufigste Element ist hierbei die Spielfigur. Es gibt allerdings auch viele andere Elemente, die zu einem Brettspiel gehören können, gerade bei moderneren Spielen wie Scotland Yard, gibt es als Elemente nicht nur Spielfiguren sondern auch Chips aus Pappe. Ein weiteres gutes Beispiel hierfür wäre Agathas letzter Wille. In diesem Spiel gibt es Fallen, die auf dem Spielbrett platziert werden, z.B. in Form eines Kronleuchters oder eines Bücherregals. Da auf einem Tablet allerdings nicht genügend Platz ist für so viele Elemente, haben wir uns auf Brettspiele spezialisiert, bei denen nur klassische Spielfiguren, auch Pöppel genannt, benutzt werden. Deshalb wollen wir hier einmal darauf eingehen, wie man das Brettspiel Mensch ärgere dich nicht, auf dem unser Fokus liegt, auf die Informatik abbilden kann und was wir benötigen, um das Spiel inklusive der Spielregeln zu implementieren, aber erst folgt noch ein kleiner Einblick in die Geschichte der Brettspiele und was wir unter klassischen Brettspielen verstehen. 3.1 Geschichtlicher Hintergrund Zu den erste Brettspielen, die bekannt sind, gehören das Spiel Königliches Spiel von Ur, welches von ca. 2600 v. Chr. stammt und das hauptsächlich in Asien, auch noch heute, großen Anklang findende Spiel Go dessen Ursprung um ca. 400 v. Chr. geschätzt wird. Zu einer ähnlichen Zeit, zu der erste Ausgrabungen zum Speil Go gefunden wurden (kurz n. Chr.) wird auch der Ursprung von Schach, ein noch heute hierzu Lande gespieltes Spiel, geschätzt. Zu den neuzeitlichen Spielen zählen Monopoly, Malefiz und Mensch ärgere dich nicht. Mensch ärgere dich nicht ist im Verhältnis ein noch sehr junges Spiel, welches 1908 von Josef Friedrich Schmidt erfunden und 1910 erstmals veröffentlicht wurde. Es ist zurückzuführen auf 11 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 3.2. KLASSISCHE BRETTSPIELE das Spiel Pachisi bzw. Chaupar oder Yut. Pachisi hat seinen Ursprung in Indien um 400 n. Chr. und wird als eines der Ursprünge der europäischen Spielekultur gezählt. Mensch ärgere dich nicht gilt als eines der populärsten Spiele in Deutschland. Die Spielregen haben sich seit Erscheinung nicht verändert, allerdings haben sich im Laufe der Zeit mehrere Spielvarianten herausgebildet. Für mehr Information über diese siehe: [28], [25] und [30] 3.2 Klassische Brettspiele In diesem Abschnitt wollen wir einmal genau definieren, was wir unter klassischen Brettspielen definieren, und welche Art von Spielen wir mit unserer App unterstützen wollen. Auf jeden Fall unterstützen wollen wir Mensch ärgere dich nicht. Die Spiele, die wir unterstützen wollen, sollen keine Bewegungsregeln enthalten, siehe 3.3, also fallen Spiele wie Schach, Shogi oder Dame raus. Auch Legespiele wollen und können wir nicht unterstützen, zu ihnen zählen alle Spiele, bei denen man viele kleine und spezielle Elemente auf das Spielbrett legen muss, wie bei Scrabble. Doch was verstehen wir jetzt unter klassischen Brettspielen? Wir verstehen darunter Spiele, die nur aus Übergangsregeln und Situationsregeln bestehen und möglichst mit Pöppel gespielt werden können, da wir nicht zu viele verschiedene Spielfiguren benötigen möchten. Dazu würden neben Mensch ärger dich nicht Spiele wie Halma, das Gänse Spiel, Spuk und einige weitere Spiele zählen. Haben wir Erstmal eine Auswahl an Spielen fertig, könnten wir uns auch Spiele wie Monopoly, Dame, Mühle oder Scotland Yard vorstellen. Um Monopoly umzusetzen, müssten wir eine Erkennung von Karten einbauen oder virtuelle Karten benutzen und für die Spielfiguren könnte man die Pöppel benutzen. Das Geld würde, auf jeden Fall, nur virtuell existieren. Bei Scotland Yard würde ebenfalls die Kartenerkennung nötig sein. Für Dame und Mühle wären neue Figuren nötig und für Dame müssten die bereits erwähnten Bewegungsregeln implementiert werden. 3.3 Regeln Saskia und Jeffrey Regeln existieren für jedes Brettspiel, jedoch können diese so extrem unterschiedlich sein, dass es schwer fällt sie zu verallgemeinern. Auch können Regeln sich auf viele unterschiedliche Spielelemente beziehen, daher teilen wir Regeln für unsere Betrachtung in drei Kategorien ein. 12 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 3. KONZEPTION VON BRETTSPIELEN Übergangsregeln Diese Regeln legen fest unter welchen Bedingungen von einem Feld auf das nächste Feld gezogen werden darf, z.B. dass man nur mit einer Sechs eine Figur rausziehen kann. Bewegungsregeln Beschreiben nach welchem Muster sich eine Figur bewegt, z.B der Läufer beim Schach, der sich nur diagonal bewegen darf. Situationsregeln Regeln, die die Spielsituation beeinflussen, z.B. bei einer Sechs darf noch einmal gewürfelt werden oder Ereigniskarten in Monopoly. Wir konzentrieren uns bei der Realisierung zunächst nur auf Spiele mit Übergangsregeln und Situationsregeln, daher würde beispielsweise Schach wegfallen. Da jedes Spiel seine eigenen Regeln hat, ist es nicht möglich eine allgemein gültige Methode zu programmieren. Daher muss ein Grundgerüst für eine Regel geschaffen werden und jedes Spiel muss anhand dessen alle Regeln implementieren. Bei Mensch ärgere dich nicht wären es beispielsweise folgende: • Sind alle Figuren einer Person auf den Anfangsfeldern, darf bis zu dreimal hintereinander gewürfelt werden. • Mit einer Sechs kann eine Figur von den Anfangsfeldern ins Spiel gebracht werden. • Nach dem Rausstellen einer Figur von den Anfangsfeldern muss das Startfeld im Spielfeld schnellstmöglich wieder frei gemacht werden. • Beim Wurf einer Sechs muss, soweit vorhanden, eine Figur von den Anfangsfeldern gezogen werden. • Wurde eine Sechs gewürfelt, darf nochmal gewürfelt werden. • Kann eine Figur geschlagen werden, muss dieses auch geschehen, oder die anderen Mitspieler dürfen eine Figur des Spielers, der nicht geschlagen hat, aufs Anfangsfeld zurückstellen. • Figuren in den Zielfeldern dürfen nicht übersprungen werden. • Die Figuren müssen mit passgenauer Augenzahl auf die Zielfelder gesetzt werden. Es gibt bei diesem Spiel noch viele weitere Regeln und Varianten, wir beschränken uns hier auf die angegebenen Regeln. 3.4 Spielablauf Saskia Müller Der Spielablauf ist bei vielen Spielen gleich oder ähnlich und kann bei fast allen Spielen verallgemeinert werden. Dazu gehört, dass die Spieler abwechselnd an der Reihe sind und nach dem letzten Spieler wieder der Erste an der Reihe ist. Außerdem wird bei vielen Spielen ein sechs-seitiger Würfel benutzt, der nur einmal implementiert werden muss. Gespielt wird immer 13 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 3.4. SPIELABLAUF auf einem Brett, dieses besitzt meistens Felder, auf denen Figuren stehen und Linien, die als Verbindungen zwischen Feldern dienen. Die Verbindungen sind für jedes Spiel anders, aber die grundlegende Strukturen, die dahinter stehen, sind die Gleichen. Es handelt sich dabei um (gerichtete) Graphen mit teilweise speziellen Übergangsregeln. Bei Mensch ärgere dich nicht wären die speziellen Übergangsregeln, dass man auf die Zielfelder nur gehen kann und auch muss, wenn es sich um seine eigenen Zielfelder handelt. Die zweite spezielle Übergangsregel bei dem Spiel wäre, dass man von den Anfangsfeldern nur mit einer Sechs kommen kann. 3.4.1 Gerichteter Graph In ?? zeigen wir den Gerichteten Graphen eines Spielfeldes, anhand unseres Beispiels Mensch ärgere dich nicht. Doch als erstes wollen wir kurz darauf eingehen, was ein Gerichteter Graph ist und aus welchen Bestandteilen er besteht. Ein gerichteter Graph dient dazu eine Menge von Objekten zusammen mit ihren Verbindungen darzustellen und die Richtung in welche diese Verbindung besteht. Häufig werden sie für Netzpläne benutzt, wie z.B. bei Straßenbahnplänen oder Wegepläne. Siehe [26] und [7]. Da ein Spielbrett einem Wegeplan sehr ähnelt, eignet sich auch für ein Spielbrett ein gerichteter Graph sehr gut. Er besteht aus einer Menge von Knoten V, diese sind die einzelnen Felder auf denen die Figuren stehen können, es sind insgesamt 72. Der zweite Bestandteil von gerichteten Graphen sind die geordneten Knotenpaare bzw. die gerichteten Kanten E, die die Richtung vorgeben in welcher man von einem Knoten zum Nächsten kommt. Der Graph G ist also ein Tupel (V, E), die Menge aller Knoten und Kanten. Unter Einbeziehung der Übergangsregeln könnte man G als ein Tripel (V, E, T) darstellen. Hierbei steht T für die Menge aller Übergangsregel (Transition rules). Der Eingangsgrad eines Knotens v ∈ V ist die eingehenden Kante und der Ausgangsgrad ist die ausgehenden Kante von einem Knoten zu anderen Knoten. Bei Mensch ärgere dich nicht ist der Eingangs und Ausgangsgrad in den meisten Fällen eins. Es gibt auch einige Ausnahmen, bei denen sich der Eingangsgrad und Ausgangsgrad unterschieden. Die vier Anfangsfelder jeder Farbe, also 16 Knoten, haben einen Eingangsgrad von null oder aber, wenn man die Regeln beachtet, kann man von jedem nicht-Anfangsfeld und nicht-Zielfeld zurück auf die Anfangsfelder geworfen werden, also wäre der Eingangsgrad immer 40. Die Felder direkt vor den Zielfeldern, also vier Knoten, haben einen Ausgangsgrad von zwei, welches dieser Felder für die einzelnen Figuren als Übergang in Frage kommt, hängt von der Farbe der Figuren ab. Als letztes haben wir noch die vier Startfelder, diese haben jeweils einen Eingangsgrad von fünf. 14 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 3. KONZEPTION VON BRETTSPIELEN Unseren gerichteten Graphen werden wir so ähnlich wie möglich optisch an das Spielfeld anpassen, damit er leichter zu lesen ist. Abbildung 3.1 Mensch ärgere dich nicht Graph Wie zu sehen ist, ist Mensch ärgere dich nicht dargestellt als ein gerichteter Graph mit Mehrfachkanten, da von manchen Knoten mehr als eine Kante abgeht. 3.5 Spielfiguren Bei vielen Brettspielen werden die klassischen Spielfiguren benutzt. Diese sind fürs Spielen auf dem Tablet besonders geeignet, da sie eine gerade, nicht zu große und nicht zu kleine Standfläche haben. Monopoly Figuren sind hingegen eher schlecht geeignet, da sie zum Teil sehr unterschied- 15 Bachelorarbeit Spielfiguren 3.6. SPIELZUG Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen liche und unebene Standflächen mit teilweise mehreren Touchpunkten haben. Ebenfalls gut zu benutzen wären Mühle- bzw. Dame-Figuren. 3.6 Spielzug Ein Spielzug besteht bei fast allen Spielen aus drei Schritten. Der erste Schritt ist das Würfeln, danach kommt das Setzen der Spielfigur und als letztes kommt eventuell noch eine Aktion. Bei Monopoly wäre eine Aktion z.B. eine Karte ziehen oder eine Straße oder Häuser kaufen. Bei Mensch ärgere dich nicht gibt es nur eine mögliche Aktion, die darin besteht eine andere Figur zu schlagen. Bei Mensch ärgere dich nicht gibt es vier Möglichkeiten wie ein Spielzug ablaufen kann: Alle Spielfiguren auf Anfangsfeldern Spieler würfelt und setzt bei einer Sechs seine Figur auf das Startfeld und prüft ob eine Figur rausgeworfen wurde. Bei jeder anderen Zahl ist der gleiche Spieler nochmal an der Reihe, wenn er nicht schon drei mal an der Reihe war. Mindestens eine Figur im Spiel Spieler würfelt und setzt eine Figur auf ein besetztes Feld und wirft die sich auf diesem Feld befindende Figur raus. Spieler würfelt und setzt eine Figur auf das neue Feld, welches frei ist. Wie der Spielzug abläuft kann am Graphen noch genauer gezeigt werden. Jede Spielfigur steht auf einem Feld, befindet sich also zu jedem Zeitpunkt auf genau einem Knoten. Ist ein Spieler an der Reihe würfelt er. Pro angezeigtem Auge auf dem Würfel kann die Figur eine Kante weiter gehen. Wurde beispielsweise eine Zwei gewürfelt kann die gewünschte Figur, von ihrem aktuellen Knoten aus, erst eine Kante weiterziehen und anschließend vom neuen Knoten eine weitere Kante weiterziehen, dann ist der Würfelwurf verbraucht. Bei Mensch ärgere dich nicht existiert für jede Figur immer nur ein Weg von einem Knoten zu einem anderen. Dies ergibt sich daraus, dass die Kanten gerichtet sind, der Eingangsgrad immer nur eins ist und es teilweise bestimmte Übergangsregeln gibt. Die Startfelder mit einem Eingangsgrad von fünf stellen einen Sonderfall dar, was nichts daran ändert, dass es nur einen Weg gibt. Um es anders zu formulieren, der Abstand von einem Knoten zum nächsten ist immer eins und pro Auge des Würfelergebnisses kann man einen Schritt gehen. Bei Mensch ärgere dich nicht gibt es immer nur einen möglichen Weg, bei vielen anderen Spielen gibt es aber mehrere, also gibt es auch mehrere Möglichkeiten, wie ein Spielzug ablaufen kann. 16 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 3. KONZEPTION VON BRETTSPIELEN Damit ein Spielerwechsel erkannt werden kann ist es wichtig zu wissen, wann ein gültiger Spielzug zu Ende ist. Dieses wollen wir im Folgenden genauer betrachten. 3.6.1 Spielzug Ende erkennen Das Wichtigste für die Funktionalität unserer App, ist dass das Ende eines Spielzuges erkannt wird und der nächste Spieler als aktueller Spieler gekennzeichnet wird. Um dieses zu gewährleisten, müssen verschiedene Spielregeln implementiert werden. Für Mensch ärgere dich nicht müssen wir dazu folgende Regeln implementieren: Alle Figuren auf Anfangsfeldern In diesem Fall ist gleich mehreres zu beachten. Sollte keine Sechs gewürfelt worden sein, ist der nächste Spieler an der Reihe, der eventuell der selbe Spieler ist. Außerdem muss beim Würfeln einer Sechs beachtet werden, dass die Figur nur eine Kante laufen darf und nicht wie üblich sechs. Würfeln einer Sechs Wurde eine Sechs gewürfelt ist der selbe Spieler noch einmal an der Reihe. Kein Überspringen von Figuren auf Zielfeldern Dieses ist wichtig, um herauszufinden ob es überhaupt mögliche Züge gibt. Sollte es keine geben ist automatisch der nächste Spieler an der Reihe. Endfeld der zu setzenden Figur erkennen Da nicht jeder seine Figur beim Setzen anhebt und auf dem Endfeld erst wieder absetzt, muss das Endfeld erkannt werden. Ein Beispiel wäre, dass jemand seine Figur zieht, indem er jedes Feld abzählt und die Figur auf jedem Feld einmal absetzt. Kennt man in diesem Fall das Zielfeld nicht, kann es schnell zu einer Fehlerkennung des Endes des Spielzuges kommen. Um das Ende zu erkennen benötigen wir in unserer Implementierung den Graphen. Es sind also insgesamt fünf Regeln, die beachtet werden müssen, um den korrekten Spielablauf bei Mensch ärgere dich nicht zu gewährleisten. • Sind alle Figuren auf den Anfangsfeldern kann bis zu drei mal gewürfelt werden • Bei einer Sechs darf nochmal gewürfelt werden. • Figuren können nur mit einer Sechs von den Anfangsfeldern auf das Startfeld im Spiel gesetzt werden • In den Zielfeldern können keine Figuren übersprungen werden • Eine Figur muss pro Würfelauge genau ein Feld gesetzt werden Sollte auch nur eine der Regeln nicht implementiert werden, kann es dazu kommen, dass das Spiel stehen bleibt, oder ein Spieler an der Reihe ist, der eigentlich nicht an der Reihe sein sollte. Andere Regeln, wie z.B. ob eine Figur bei einer Sechs von einem Anfangsfeld ins Spiel gezogen wird, oder aber eine andere Figur gezogen wird, müssen, und wollen wir nicht beachten, da die 17 Bachelorarbeit Spielfiguren 3.6. SPIELZUG Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spieler selbst für die Einhaltung der Regeln zuständig sein sollen. Da es in vielen Spielen, wie schon erwähnt mehr als nur einen möglichen Weg gibt, müssen alle erkannt werden, damit das Ende eines Spielzuges korrekt erkannt werden kann. Dieses Wege können durch Tiefensuche, die Tiefe entspricht der Augenzahl, beim Erstellen der Wege aus dem Graphen gefunden werden. 18 Kapitel 4 Technische Grundlagen 4.1 Android Jeffrey Wolfe Mit Android wird sowohl ein Betriebssystem als auch eine Software-Plattform für Smartphones und Tablets bezeichnet. Man findet Android aber auch immer häufiger auf anderen Geräten wie Netbooks oder sogennanten Multimedia Sticks, die direkt an den HDMI Eingang eines Fernsehers angeschlossen werden und so jedem TV die Funktionalität eines Smart-TVs bescheren.[21] Entwickelt wird Android von der Open Handset Alliance, deren Gründer und Hauptmitglied Google ist. Sie ist ein Konsortium aus 84 (Stand 2012) Firmen aus den Bereichen Hardware, Software und Telekommunikation. Zu den Mitgliedern gehören unter anderem Branchengrößen wie Google, T-mobile, Samsung oder Qualcomm.[2] Android wird als Open-source Software unter der Apache Lizenz entwickelt. Es ist einem also freigestellt, wie man Android bzw. den Quelltext nutzt, egal ob privat oder kommerziell.[21] Der Kernel des Betriebssystem basiert auf Linux, ist jedoch erweitert um Treiber für typische Hardware von Smartphones und Tablets, sowie zusätzlichen Funktionalitäten und Anpassungen, die das Verhalten auf diesen Plattformen optimieren sollen. Seit März 2012 wurden große Teile des Android Quelltextes in den Linux Kernel integriert und es wird angestrebt, dass sich Android und Linux in der Zukunft eine Codebasis teilen.[21] Neben dem Kernel finden sich in Android auch viele Systemprogramme und Konfigurationsdateien, die man auch in Linux Distributionen findet, wie beispielsweise die wpa_supplicant.conf in der die Konfiguration von geschützten W-lan Zugangspunkten geschieht. Nähere Informationen zu Android in [21] Ein wichtiger Teil der Android Laufzeitumgebung ist die Dalvik Virtuelle Maschine. 19 Bachelorarbeit Spielfiguren 4.1. ANDROID 4.1.1 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Dalvik Auf Computern findet sich, sofern Java Anwendungen unterstützt werden sollen, die virtuelle Maschine von Oracle, ehemals entwickelt von Sun. In Android dagegen wird stattdessen Dalvik genutzt. Dalvik unterscheidet sich in vielen Punkten von der Oracle JVM. Da Dalvik auf deutlich leistungsschwächeren Geräten laufen soll, stellt es eine reduzierte VM mit geringerem Speicherbedarf dar. Im Gegensatz zu Standart Java VMs, die als Kellerautomat konzipiert sind, arbeitet Dalvik als eine virtuelle Registermaschine. Instruktionen arbeiten direkt auf Variablen, die in virtuellen Registern gespeichert sind. Dadurch werden Ladezeiten verkürzt, weil das Laden und Speichern vom Stack entfällt. Es wird weiterhin eine eigene stark optimierte Version von Byte-Code, der durch den Präprozessor dx erzeugt und in dex statt class Dateien vorliegt, genutzt. Der Programmierer bekommt hiervon jedoch nichts mit, man programmiert in normaler Java-Syntax und ein Großteil der Java Standart Klassen wurde entweder für Dalvik implementiert oder es existieren eigene Versionen dieser.[21][17][22] 4.1.2 Android Programmierung Android Anwendung, üblicherweise als Apps bezeichnet, werden meist in Java mit Hilfe des Android SDK oder aber in C bzw. C++ mit dem NDK entwickelt. Wobei das NDK vornehmlich dafür gedacht ist entweder schnell Programme für Android zu portieren, die in diesen Sprachen implementiert wurden oder wenn sich dadurch bessere Performanz erzielen lässt. Es existieren zudem noch Projekte, die die Entwicklung in vielen unterschiedlichen Sprachen wie Ruby1 , Python2 oder c#3 ermöglichen. Diese sind jedoch nicht offiziell unterstützt und befinden sich in einem frühen Stadium. Wenn man eine App schreiben möchte, muss man sich zunächst entscheiden welche API Version man nutzen möchte. Damit wird bestimmt welche Version von Android auf dem Gerät mindestens vorhanden sein muss, damit die App funktionieren kann. Android befindet sich in einem stetigem Wandel, es kommen regelmäßig neue Funktionen hinzuzu oder alte werden entfernt. Festgelegt wird dies in der Haupt-Konfigurationsdatei jeder Android App, der Androidmanifest.xml. 1 http://ruboto.org/. 2 http://code.google.com/p/android-scripting/. 3 http://xamarin.com/monoforandroid. 20 Bachelorarbeit 4.1.2.1 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 4. TECHNISCHE GRUNDLAGEN Androidmanifest.xml In dieser Datei werden wichtige Einstellungen, die eine App betreffen, gemacht. Es ist eine XML Datei, die sich im Wurzelverzeichnis jedes Android Projektes befinden muss, der Aufbau sieht wie folgt aus, wobei nicht jedes Element enthalten sein muss. 1 <?xml version="1.0" encoding="utf−8"?> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <manifest> <uses−permission /> <permission /> <permission−tree /> <permission−group /> <instrumentation /> <uses−sdk /> <uses−configuration /> <uses−feature /> <supports−screens /> <compatible−screens /> <supports−gl−texture /> 16 17 <application> 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <activity> <intent−filter> <action /> <category /> <data /> </intent−filter> <meta−data /> </activity> <activity−alias> <intent−filter> . . . </intent−filter> <meta−data /> </activity−alias> 32 33 34 35 36 <service> <intent−filter> . . . </intent−filter> <meta−data/> </service> 37 38 39 40 41 <receiver> <intent−filter> . . . </intent−filter> <meta−data /> </receiver> 42 43 44 45 46 47 48 <provider> <grant−uri−permission /> <meta−data /> </provider> <uses−library /> 49 50 </application> 21 Bachelorarbeit Spielfiguren 4.1. ANDROID Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen 51 52 </manifest> Listing 4.1 Manifest Die einzigen Elemente, die erforderlich sind für eine gültige Manifest-Datei sind <manifest> und <application>. Allerdings ist es wenig sinnvoll nur diese zu definieren, daher gehen wir kurz auf die Elemente ein, die für unsere Implementierung relevant waren. <application> Allgemeine Einstellung der App, wie z.B. android:name="string" zum Festlegen des App Namens. <uses-sdk> Festlegung der minimal erforderlichen Version von Android, um die App ausführen zu können. <uses-permission> Benötigte Rechte, z.B Internetzugriff, diese werden vor dem Installieren der App angezeigt und müssen vom Nutzer bestätigt werden. <uses-feature> Genutzte Features wie z.B. OpenGL ES 2.0, man kann bestimmen ob diese erforderlich oder optional sind. Bei erforderlichen Features wird die App im Android Play Store nur Geräten angeboten, die diese unterstützen. <activity> Definiert die Activities, aus denen sich die App zusammensetzt. [13]] 4.1.2.2 Activity Jede Android App besteht aus mindestens einer, meist aber mehreren Activities. Eine Activity setzt sich aus einer Java Klasse, die von der Klasse Activity erbt und einer XML Datei, dem Layout, das die grafische Oberfläche beschreibt, zusammen. Das Layout ist sehr simpel aufgebaut. Es gibt zwei Hauptkomponenten in einer Android Gui. Diese sind entweder Views wie z.B. Buttons, Textfelder, usw. oder Container, in denen sich Views befinden und die beschreiben, wie diese angeordnet sind. 1 2 3 4 5 6 7 8 9 <ContainerTyp android:id="ContainerID" ..weitere Einstellungen.. . .> <ViewTyp android:id="ViewID" ..weitere Einstellungen.. . 22 Bachelorarbeit 10 11 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 4. TECHNISCHE GRUNDLAGEN ./> </ContainerTyp> Alle Texte wie etwa Button Beschriftungen sollten optimaler Weise nicht direkt ins Layout geschrieben werden, sondern in die strings.xml Resource Datei ausgelagert werden und mit @string/stringname eingebunden werden, dadurch wird automatisch ein lokalisierter Text verwendet, sofern vorhanden. In der Java Klasse wird die Funktionalität einer Activity implementiert, was passiert wenn ich auf einen Button drücke, Informationen die mir angezeigt werden sollen und viele andere Dinge. Auch legt man in der Klasse fest, welche Aufgaben erfüllt werden sollen, wenn die Activity in einen ihrer drei möglichen Zustände, Resumed, Paused oder Stopped wechselt. 4.1.2.3 Intents Wie schon angedeutet, bestehen nur wenige Apps nur aus einer einzigen Activity, daher muss es eine Möglichkeit geben zwischen verschiedenen Activites zu wechseln. Intents bieten uns diese Funktion, es sind Objekte die eine gewünschte Aktion abstrakt beschreiben. Man initialisiert ein Intent mit dem eindeutigen Bezeichner der Activity, die man starten will. Als zweite Möglichkeit, können noch extra Informationen übergeben werden. Man ist dabei nicht nur auf Activities aus der eigenen App beschränkt, sondern kann auch Activities anderer Apps ausführen die eine benötigte Funktion bereitstellen. In diesem Fall ist es jedoch nicht notwendig explizit eine bestimmte Activity einer bestimmten App aufzurufen. Stattdessen reicht es anzugeben welche Aufgabe erledigt werden soll, etwa ein Foto aufnehmen und Android startet die Activity, die diese Aufgabe im System übernimmt.[13]] 4.2 XML Die Extensible Markup Language ist eine Sprache zur Darstellung von Daten in einer hierarchischen Struktur und wird oft dafür benutzt, Daten zwischen verschiedenen Computersystemen zu übertragen. Durch die Verwendung von Namespaces kann man in einem XML-Dokument mehrere Sprachen mischen, ein Beispiel hierfür wäre: Das Element <p> steht für Person, wenn der Namespace beispielsweise xmlns=“verwaltung:personen” ist. Ist der Namespace hingegen ein Anderer, könnte das Element <p> für etwas ganz anderes stehen, bei XHTML steht es für einen Absatz. Um hier sicher zu gehen, dass das Element <p> richtig gedeutet wird, muss ein Namespace angegeben werden. So kann in einem XML-Dokument das <p> auch für beides stehen, wenn beide Namespaces angegeben wurden, allerdings nacheinander. Der Namespace kann überall im Dokument angegeben werden, wird aber typischerweise 23 Bachelorarbeit Spielfiguren 4.2. XML Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen einmal am Anfang angegeben und einmal oder mehrmals, wenn sich der Namespace ändert. Das Wichtigste beim Aufbau eines XML-Dokuments ist das Element. Der Name eines Elementes kann frei gewählt werden und kann weitere Elemente oder Texte enthalten. Jedes XMLDokument sollte ein Wurzelelement besitzen und jedes Element einen sogenannten End-Tag, der anzeigt, dass das Element beendet wurde. Da XML weitgehend bekannt ist, wollen wir hier nicht weiter darauf eingehen und nur ein Beispieldokument, das in unserer App erstellt wird, zeigen. 1 2 3 4 5 6 7 8 9 10 11 <invite xmlns="game:invite"> <color class="java.util.ArrayList"> <integer>0</integer> <integer>1</integer> </color> <player class="java.util.ArrayList"> <string>hugo</string> <string>franz</string> </player> <playerCount>2</playerCount> </invite> Für weiter Informationen zu XML siehe [23]. 4.2.1 Simple Simple [16] ist ein Java Framework zum Serialisieren und Deserialisieren von Java Objekten in eine XML-Form. Es ist, wie der Name sagt, sehr einfach zu benutzen und kann problemlos auch komplexere Objekte serialisieren und beim Deserialisieren werden sogar Referenzen wieder hergestellt. Das XML, welches dabei entsteht, ist auch für Menschen sehr leserlich und kann somit bei Bedarf auch von Hand zurückgeparst werden. Um Simple zu benutzen, müssen in der Javaklasse, die serialisiert werden soll, einige Ergänzungen gemacht werden. Man kann das Wurzelelement setzen, was im Allgemeinen der Klassenname sein wird, indem man vor Beginn der Klasse @Root schreibt. Einen Namespace kann man z.B. mit @Namespace(reference=”game:invite”) einfügen. Da man die Variablen seiner Klasse auch serialisieren möchte, kann man dafür z.B. @Element benutzen. Um dieses einmal zu verdeutlichen, zeigen wir hier ein einfaches Beispiel einer Javaklasse, die mit Simple serialisiert werden kann und die XML-Datei refinvite die aus der Klasse entsteht. 1 2 3 4 5 6 7 8 9 @Root @Namespace(reference="game:invite") public class Invite implements PacketExtension { @Element public int playerCount; @ElementList public List<String> player; @ElementList public List<Integer> color; 24 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 4. TECHNISCHE GRUNDLAGEN 10 11 public String from; 12 13 public Invite(){ 14 15 } 4.3 XMPP XMPP [9] steht für Extensible Messaging and Presence Protocol und ist ein Internetstandart, der hauptsächlich für Instant Messaging verwendet wird. XMPP benutzt den XML Standard und war früher unter dem Namen Jabber bekannt. Jeremie Miller veröffentlichte 1999 Jabber, ein Echtzeit-XML-Streaming-Protokoll. 2004 wurde dieses Protokoll mit einigen Änderungen unter dem Namen XMPP zum Standard. Es ist ein offen dokumentiertes Protokoll und wird stetig weiter entwickelt. Auch gibt es mehrere Erweiterungen für XMPP, wie beispielsweise Jingle. Für den Betrieb eines XMPP Netzwerks wird mindestens ein Server benötigt, in dem die Benutzer durch sogenannte JabberIDs identifiziert werden können. Diese sind wie E-mail-Adressen aufgebaut. Sie bestehen aus einem Benutzernamen gefolgt von einem Servernamen, die durch das @ Zeichen getrennt werden. Außer der JabberID wird zum Anmelden an den Server ein Passwort und eine Ressource benötigt. Durch unterschiedliche Ressourcen kann man sich auch mehr als einmal am Server anmelden. Server gibt es weltweit tausende, von Privatpersonen, Organisationen sowie großen Firmen wie Google über ihre E-mailAdresse Gmail oder die Software Google Talk. Nachrichten zwischen zwei Personen werden von der ersten Person zum Server geschickt, vom Server des Senders zum Server des Empfängers und anschließend vom Server des Empfängers zum Empfänger der Nachricht. Da hierbei mehrere Stationen sind, an denen die Nachrichten abgehört oder verfälscht werden können, sollten diese verschlüsselt werden. Dies kann durch SSL/TSL geschehen. Code Libraries gibt es für viele verschiedene Programmiersprachen z.B. Smack für Java und ein abgewandeltes Smack für Android mit dem Namen Asmack, von der wir eine Version benutzen, in der Jingle siehe 4.3.1 integriert ist. 4.3.1 Jingle Jingle ist eine Erweiterung für XMPP. Es erweitert XMPP um mehrere Funktionen. Eine Funktion ist Peer-to-Peer, eine Verbindung die Rechner gleichgestellt miteinander verbindet. Andere Funktionen sind Multimedia Funktionen wie Voice over IP oder Videokonferenzen. 25 Bachelorarbeit Spielfiguren 4.4. OPENGL 4.4 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen OpenGL Jeffrey Wolfe Für die Darstellung des eigentlichen Spielablaufes verwenden wir OpenGL, daher wollen wir in diesem Abschnitt näher darauf eingehen,was OpenGL ist und wozu es dient. OpenGL , was für Open Graphics Library steht ist, wie der Name bereits sagt, eine offene Grafikbibliothek, die von der Khronos Group verwaltet wird.[29] 4.4.1 Khronos Group Die Khronos Gruppe wurde 2000 von führenden Unternehmen des Bereichs Medien gegründet. Ihr Ziel ist es, eine offene Standard API zur Erstellung und Wiedergabe von Medien auf einer Vielzahl von Plattformen und Geräten zu erschaffen. Die Khronos Group ist nicht gewinnorientiert und wird von ihren Mitgliedern finanziert, die im Gegenzug dafür über die API Spezifikationen mitentscheiden dürfen und sich an deren Entwicklung beteiligen können. Weiterhin erhalten sie als erstes Zugriff auf kommende Spezifikationen und Konformitätstests. Zu den über 100 Mitgliedern der Khronos Group zählen unteranderem AMD, Intel, Nvidia, Google und Adobe. Aus ihren Bemühungen sind unter anderem OpenGL und dessen verschiedene Varianten und Versionen hervorgegangen. Wir gehen nun kurz auf ein paar dieser ein.[10] 4.4.2 OpenGL Die ersten Iterationen dieser weit verbreiteten Grafikbibliothek legen die Grundlagen für die Funktionsweise von OpenGL. Konzipiert wurde OpenGL als ein Zustandsautomat, das heißt: Man übergibt nicht bei jeder Funktion alle Parameter, sondern setzt diese bei Bedarf, ansonsten werden die aktuell aktiven Parameter verwendet. Beispielsweise möchte man viele verschiedene Objekte in einer Farbe zeichnen, also setzt man einmalig den Parameter für die Farbe und führt dann die Zeichenoperationen aus. So erhalten dann alle Objekte diese Farbe. Ziemlich alle Funktionen von OpenGL verarbeiten entweder Primitive wie Punkte, Linien oder Polygone zu Pixeln oder konfigurieren, wie die Primitive verarbeitet werden. OpenGL ist als eine Low-Level API konzipiert, das heißt, der Programmierer bestimmt jeden einzelnen Schritt der notwendig ist, um die Szene darzustellen, was einerseits sehr viel Detailwissen, aber im Gegenzug große Freiheiten ermöglicht. Die Hauptaufgaben, die OpenGL seit dieser Version bereits erledigt sind: Rasterung Das Umwandeln von Vektor-Grafiken zu den aus Pixeln bestehenden Rastergrafiken 26 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 4. TECHNISCHE GRUNDLAGEN Transform Das Bewegen, Rotieren und Skalieren eines 3D Objektes im Raum und die Projekte dessen auf unseren zweidimensionalen Bildschirm, hierzu später noch mehr Lightning Berechnung der Helligheit und Farbe eines Bildpunktes in Abhängigkeit zu einem vom Programmierer vorgegeben Beleuchtungsmodell Z-Buffering Berechnung der Sichtbarkeit von Pixeln mittels Tiefeninformationen Texture mapping Abbilden einer Textur oder Teile derer auf ein Objekt Alpha blending Verarbeitung von Transparenzen Mit der Version 2.0 wurde die OpenGL Shading Language GLSL eingeführt und damit auch die fixed-function vertex und fragment pipelines ersetzt, darauf gehen wir später näher ein.[29] 4.4.3 WebGL WebGL stellt eine Variante von OpenGL ES dar, die es ermöglicht OpenGL direkt im Webbrowser zu nutzen und somit aufwendige hardwarebeschleunigte 3D-Anwendungen direkt fürs Web in Javascript zu implementieren wie z.b. das Computerspiel Quake 3.[29] 4.4.4 OpenGL ES OpenGL for Embedded Systems oder kurz OpenGL ES stellt eine vereinfachte Version von OpenGL dar, die um redundante Funktionen reduziert wurde, ebenfalls werden weniger Datentypen unterstützt, außerdem fehlen meist die Support Libraries GLUT und GLU. OpenGL ES findet Einsatz in Smartphones, Tablets, mobilen Videospielkonsolen oder anderen Geräten mit geringerer Leistung und Speicher wie z.B. dem Raspberry Pi. Bisher existieren zwei Hauptversionen (OpenGL ES 3.0 wurde im August 2012 veröffentlicht), die in Verwendung sind. 1.0 bzw. 1.1 die auf der OpenGL Spezifikation 1.3 bzw. 1.5 basiert und OpenGL ES 2.0 was auf der OpenGL 2.0 Spezifikation aufbaut, aber eine programmierbare Rendering-Pipeline wie in OpenGL 3.1 nutzt, statt festen Funktionen werden Shader genutzt, die in GLSL geschrieben sind. Da wir in unser Implementierung OpenGL ES 2.0 verwenden, gehen wir auch auf Shader und GLSL ein.[29] 27 Bachelorarbeit Spielfiguren 4.4. OPENGL 4.4.5 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Shader Shader sind Computerprogramme, die direkt auf der GPU ausgeführt werden. Sie sind verantwortlich für den größten Teil der Grafik-Pipeline, also wie ein Objekt im Endeffekt dargestellt wird, mit seiner Position, Ausrichtung, Beleuchtung, Textur, etc. . In OpenGL ES 2.0 stehen zwei verschiedene Typen von Shadern zur Verfügung, die Vertex Shader, die für alle Transformationen eines Objektes verantwortlich sind und Pixel oder auch Fragment Shader, die zum Berechnen der Pixelfarben und Transparenz notwendig sind. Diese beiden Shader werden zu einem Programm kompiliert, wobei der Vertex Shader Daten an den Fragment Shader übergibt.[31] Geschrieben werden Shader in der bereits erwähnten OpenGL Shading Language GLSL, die an C angelehnt ist und dem Programmierer Kontrolle über die Rendering Pipeline auf der Vertex und Fragment Ebene gibt. Vor der Einführung von GLSL mussten Shader in Assembler geschrieben werden, was deutlich komplexer und weniger intuitiv ist, als die Syntax einer Hochsprache. Hier nun zwei Beispiel-Shader, die wir auch in unserem Code verwenden. Die OpenGL API übergibt die Model-View-Projection Matrix, auf die wir im Anschluss noch eingehen werden , Vertexkoordinaten, Farben und Texturkoordinaten an den Vertex Shader, die Farb- und Texturinformationen werden von diesem an den Fragmentshader weitergereicht. Die Vertexkoordinaten werden im Vertex Shader mit der Model-View-Projection Matrix multipliziert, um die Vertexposition für die Darstellung zu berechnen.[31] 28 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 4. TECHNISCHE GRUNDLAGEN uniform mat4 u_MVPMatrix; 1 2 attribute vec4 a_Position; attribute vec4 a_Color; attribute vec2 a_TexCoordinate; 3 4 5 6 varying vec4 v_Color; varying vec2 v_TexCoordinate; 7 8 9 void main(){ v_Color = a_Color; v_TexCoordinate = a_TexCoordinate; gl_Position = u_MVPMatrix * a_Position; }; 10 11 12 13 14 Listing 4.2 Vertex Shader Im Fragment Shader werden aus der Textur und den Farbinformationen die endgültigen Pixelfarben berechnet. precision mediump float; 1 2 uniform sampler2D u_Texture; varying vec4 v_Color; 3 4 5 varying vec2 v_TexCoordinate; void main(){ gl_FragColor = (v_Color * texture2D(u_Texture, v_TexCoordinate)); }; 6 7 8 9 Listing 4.3 Fragment Shader Jeder Datentyp hat in GLSL sowohl eine Typendeklaration, die beschreibt, um was für einen Datentyp es sich handelt, hier z.B. mat4 für eine 4 stellige Matrix oder vec2 für einen 2 stelligen Vektor, als auch einen Typenqualifzierer, wie beispielsweise Attribute für Inputwerte, wie Vertex-Position oder Varying für Daten, die vom Vertexshader zum Fragmentshader durchgereicht werden. Um die Daten aus dem Android Code in den Shader zu übergeben, damit dieser sie verarbeiten und somit zeichnen kann, nutzt man Funktionen der GLES20 API, beispielsweise GLES20.glGetAttribLocation(programHandle, "a_Position") um ein Handle4 für die Postitionsdaten zu erhalten. Um nun die Daten zu übergeben, gibt man OpenGL einen Pointer auf diese mittels GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 0, field.vertexBuffer), wobei es sehr wichtig ist, bei diesem Aufruf den richtigen Datentyp zu nennen. 4 int Wert der Variablen im OpenGL Kontext repräsentiert 29 Bachelorarbeit Spielfiguren 4.4. OPENGL 4.4.6 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen OpenGL Räume Bis zur endgültigen Darstellung eines Objektes auf dem Bildschirm werden dessen geometrischen Daten in mehreren Abschnitten von der Grafik Pipeline verarbeitet, dabei werden sie in verschiedene Räume oder auch Spaces übertragen. Object Space Im Object Space wird das Objekt beschrieben, das heißt, es werden alle Vertices aufgezählt, die dieses Objekt ausmachen. Model Space Nachdem wir nun eine Beschreibung eines Objektes haben, überführen wir dieses in den Model oder auch World Space, also beschreiben wie es in Relation zu anderen Objekten steht. Dazu wird eine Modelmatrix als Identitätsmatrix initialisiert und auf diese alle Transformationen angewandt, die für das Objekt relevant sind z.B. wollen wir das Objekt fünf Einheiten nach rechts bewegen und dann 90 Grad um die X-Achse drehen. Die resultierende Matrix wird dann mit Vertex-Koordinaten des Objektes multipliziert um dessen Repräsentation im World Space zu erhalten. View Space Um zu bestimmen, was wir in unserer Szene überhaupt sehen, definieren wir mittels der Viewmatrix eine virtuelle Kamera. Es wird festgelegt wo im Raum sie sich befindet und wohin sie ausgerichtet ist. Der View Space beschreibt wo sich alle Objekte befinden, wenn wir die Szene durch die Kamera betrachten, also in welcher Relationen zur Kamera sie sich befinden. Wir erhalten eine Matrix, die den View Space beschreibt, wenn wir die Modelmatrix mit der Viewmatrix multiplizieren. Projection Space Wir wissen nun wie die Welt aussieht, die wir durch unsere virtuelle Kamera sehen würden. Diese Darstellung ist aber dreidimensional und wir wollen sie auf einem Gerät betrachten, das nur einen zweidimensional Bildschirm zur Anzeige hat. Um zu bestimmen, wie unsere Welt nun schlussendlich auf dem Display gezeigt wird, müssen wir festlegen,wie die Projektion vom Kamera Space in den Projection oder auch Screen Space erfolgen soll. Es stehen für diese Aufgabe zwei verschiedene Projektionsmodi zur Verfügung. Bei der orthographischen Projektion erscheinen alle Objekte gleich groß, egal wie weit sie entfernt sind. Diese Projektion wird meist bei 2D Spielen benutzt. Die perspektivische Projektion entspricht unserer natürlichen Wahrnehmung, je weiter etwas entfernt ist, desto kleiner erscheint es für uns. Sie wird verwendet, um uns eine dreidimensoniale Welt zu simulieren. [1][15] 30 Bachelorarbeit 4.5 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 4. TECHNISCHE GRUNDLAGEN Touchscreens Touchscreens sind wie in [18] und [32] beschrieben heute weit verbreitete Eingabegeräte, die es ermöglichen Eingaben mithilfe unseres Fingers oder eines Stiftes auf bestimmten Bereichen des Bildschirms zu tätigen. Zu finden, sind sie in vielen Bereichen unseres Alltags, beim Fahrkartenautomaten, in Autos, bei unseren neuen Mobiltelefonen den sogenannten Smart Phones und bei Tablets. Der erste Schritt in Richtung Touchscreens gelang Dr. Sam Hurst mit seiner Entwicklung des ersten Touch Sensor im Jahre 1971. Dieser war im Gegensatz zu den heutigen Touchscreens noch nicht Transparent. 1974 entwickelte Dr. Sam Hurst den ersten Touchscreen, so wie er uns heute bekannt ist, mit einer transparenten Oberfläche. Es gibt mittlerweile verschiedene Technologien die wir hier vorstellen möchten. 4.5.1 Resistive Touchscreens Resistive Touchscreens bestehen aus zwei Schichten einem Top-Layer aus Kunststoff und einem Grund-Layer der im Allgemeinen aus Glas besteht. Zwischen diesen beiden Schichten sind nichtleitende Abstandshalter, die sogenannten Spacer Dots, die die beiden Schichten voneinander trennen. Durch den Druck auf den Top-Layer werden die zwei leitendbeschichteten Oberflächen der beiden Layer zusammengedrückt und es entsteht an der Stelle ein elektrischer Kontakt. Dieser elektrische Kontakt wird dann vom Controller ausgewertet. 4.5.2 Surface Acoustic Wave Touchscreen Bei Acoustic Wave Touchscreens werden Signalgeber verwendet die an den Seiten einer Glasfläche angebracht werden. Diese Signalgeber senden Ultraschallwellen horizontal und vertikal aus. Auf den gegenüberliegenden Seiten der Signalgeber empfangen Sensoren diese Wellen und werden durch den Controller ausgewertet. Durch eine Berührung der Oberfläche werden die gesendeten Schallwellen zum Teil absorbiert, wodurch beim Sensor ein verändertes Ergebnis ankommt, welches vom Controller ausgerechnet wird und so die Position der Berührung berechnet werden kann. Dieses Verfahren ist sehr genau und die Transparenz der Oberfläche ist sehr gut. 31 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 4.5. TOUCHSCREENS 4.5.3 Infrarot Touchscreens Bei Infrarot Touchscreens werden in zwei Seiten im Rahmen des Touchscreens Infrarot LEDs integriert und auf den gegenüberliegenden Seiten sitzen Phototransistoren, die das Licht empfangen. Durch eine Berührung wird die Verbindung zu beiden Seiten, an der Stelle der Berührung unterbrochen dieses kann dann wieder vom Controller ausgewertet werden. 4.5.4 Kapazitive Touchscreens Kapazitive Touchscreens werden wegen ihrer hohen Belastbarkeit, ihrer guten Transparenz und ihrer hohen Genauigkeit oft in Handys oder Tablets verbaut. Sie sind mit durchsichtigem Metalloxid beschichtet. An den Ecken der Beschichtung ist eine Wechselspannung angelegt, die ein gleichmäßiges elektrisches Feld über die Oberfläche verteilt. Wird die Oberfläche berühert, wird ein Teil der elektrischen Ladung über den Finger aufgenommen. Diese Änderung im Elektrischenfeld wird in den Ecken erfasst und stehen im direkten Verhältnis zur Touchposition. Das Ergebnis wird, wie bei allen anderen Touchscreen Technologien, wieder durch den Controller weiterverarbeitet und die X und Y Position der Berührung berechnet. Kapazitive Touchscreens reagieren, im Gegensatz zu den anderen vorgestellten Touchtechnologien, nur auf die Berührung des Fingers oder Objekten die selbstleitend sind. 4.5.5 Multitouch Von glsMultitouch ist die Rede, wenn die Touchscreens nicht nur eine Berührung erkennen, sondern gleich mehrere und diese auch verarbeiten können. Bei Kapazitiven Touchscreens werden hierzu zwei Schichten bestehend aus einer Schicht mit Sendeantennen und einer Schicht mit Empfängerantennen zwischen dem Display und einer Schutzschicht gelegt. An den Empfängerantennen werden die durch eine Berührung ausgelösten Spannungsänderungen gemessen. Die Sendeantennen erzeugen das gleichmäßig elektrische Feld und es entsteht eine Kopplung zwischen Sender und Empfänger. 4.5.6 Was wir verwenden Handelsübliche Tablets, kann man nur mit zwei der vorgestellten Technologien erwerben, Kapazitiven und resistiven Touchscreens. Da bei resistiven Touchscreens ein gewisser Druck, auf den Bildschirm ausgeübt werden muss und dieses auf Grund der Größe von den Figuren nur schwer bzw. nicht 100 prozentig genau ist, ist für unsere App ein resistiver Touchscreen von Nachteil. 32 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 4. TECHNISCHE GRUNDLAGEN Zudem werden resistive Touchscreens meistens nur in billig produzierten Tablets, die oft kein OpenGL ES 2.0 unterstützen, verbaut, was sie für unsere Zwecke unbrauchbar machen. In unserem Tablet wird ein Kapazitiver Touchscreen verbaut und da unser Spiel mit echten Figuren benutzt werden soll, müssen wir eine Kapazität mit diesen Figuren erzeugen damit ein Touchevent erkannt werden kann. Deshalb benötigen wir Figuren, die aus einem leitendem Material bestehen. Alle Tablets haben allerdings unterschiedlich viele Touchpunkte, die sie maximal gleichzeitig erkennen können. Das Maximum liegt bei ca. zehn Touchpunkten gleichzeitig. Bei vielen Spielen, darunter auch unser Anwendungsbeispiel Mensch ärgere dich nicht haben mehr als nur zehn Figuren, deswegen darf das Material unserer Figuren keine eigene Kapazität haben, sondern soll nur Leiten sobald es berührt wird. Man kann auch sagen, es dient als Verlängerung des Fingers. Aus diesem Grund haben wir uns für Spielfiguren aus Metall entschieden. Es können jedoch alle Figuren benutzt werden, die aus einem leitendem Material bestehen. Zum Erkennen der Figuren welche Figur welche ist, gibt es mehrere Möglichkeiten, auf die wir in einem späteren Kapitel 5.1.1 näher eingehen. 33 Kapitel 5 ANABEL Jeffrey Wolfe Jedes Produkt sollte einen Namen haben, damit man weiß wovon gesprochen wird, ohne jedes Mal zu Beschreiben was es ist. Ein Name verleiht etwas eine Identität. Wir haben unsere App auf den Namen ANABEL getauft. ANABEL steht für Augmented and Networked App for Board games to Enhance Life, und soll damit auch gleich beschreiben welchen Zweck diese App hat. In diesem Kapitel werden wir ANABEL einmal genau vorstellen, erklären den Konzeptionellen Aufbau und ein Anwendungsbeispiel. 35 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 5.1. ARCHITEKTUR 5.1 Architektur Saskia Müller Abbildung 5.1 Architektur In dem oben abgebildetem Bild 5.1, sind die Komponenten zu sehen, die dafür nötig sind, um ANABEL über Entfernung mit mehreren mit mehreren Personen zu Spielen. Hier ist die zur Zeit angedachte maximal Anzahl an Standorten zu sehen. Dabei wird an jedem Standort ein Tablet, Internetzugriff, ein XMPPAccount und natürlich die App selber benötigt. Die Verbindung zwischen den einzelnen Tablets geschieht über XMPP und ein bis vier XMPPservern, je nachdem welche Accounts verwendet werden. Die Server untereinander sind ebenfalls über XMPP verbunden. Mit dieser Weiterleitung haben wir nichts zu tun. 5.1.1 Vorüberlegungen Jeffrey Wolfe 5.1.1.1 Spielfiguren Eine Hauptüberlegung bei der Planung war wie man echte Spielfiguren zum Spielen nutzen kann. Wie bereits in 4.5.6 erklärt wurde müssen Spielfiguren aus einem leitfähigen Material genutzt werden, damit sie überhaupt auf dem Bildschirm erkannt werden können. Für uns kamen für die Zuordnung der Figuren nun zwei verschiedene Möglichkeiten in Frage. Entweder alle Figuren sind gleich, dann müssen sie beim Start alle auf einer vordefinierten Position stehen und werden 36 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 5. ANABEL so zugeordnet. Das heißt die App merkt sich wo sich jede Figur auf dem Spielfeld steht und aktualisiert diese Informationen bei jedem Spielzug anhand der Logik. Eine Alternative dazu wäre es, dass Figuren eindeutig erkennbar sind. Anbieten würde sich dafür ein Verfahren ähnlich dem in [5] beschriebenen. Dabei hätte eine Figur mehrere Touchpunkte, diese haben je nach Figur unterschiedliche Entfernungen zueinander. Anhand dieser verschiedenen Distanzen lässt sich dann eindeutig zuordnen um welche Figur es sich handelt. Denkbar wäre es dabei auch, dass man zusätzlich eine Ausrichtung kodieren könnte. Die bereits in 3.2 erwähnten Karten könnten auch auf eine ähnliche Weise erkannt werden. Umgesetzt wurde die Variante mit den gleichwertigen Spielfiguren, die Entwicklung der Kodierung und dafür zu sorgen, dass Spielfiguren mehrere Touchpunkte auslösen, hätte den Aufwand deutlich erhöht. 5.1.1.2 Würfel Bei dem Spielwürfel haben wir uns dazu entschieden diesen zumindest vorläufig virtuell einzubauen, jedoch gab bzw. gibt es auch die Idee einen echten oder Dice+ zu verwenden. Hätten wir einen echten Würfel versucht zu nutzen, sollte es einen Würfelbecher mit einer eingebauten Kamera geben. Diese Kamera würde ein Foto des Würfels aufnehmen wenn er zum Stehen kommt, welches dann mittels Bilderkennung sagen soll welche Seite oben liegt. 5.2 Testumgebung Saskia Müller In diesem Abschnitt gehen wir kurz darauf ein auf welchen Geräten und unter welchen Umständen wir ANABEL bereits getestet haben. Außerdem beschreiben wir unser Haupttestobjekt, das Acer Inconia A200 5.2.1, genauer. Neben dem Acer Tablet haben wir für unsere Tests auch das Nexus 7 benutzt. Das Nexus 7 ist allerdings nur ein 7 Zoll Tablet und deswegen nicht sehr gut geeignet, denn für Figuren ist kein Platz. Da uns nur diese zwei Tablets zur Verfügung standen, haben wir ANABEL nur an zwei und nicht an vier verschiedenen Orten getestet, außerdem haben wir auf jeder Seite der Verbindung nur einen Spieler benutzt und ausschließlich gmail.com Accounts verwendet. Die Internetverbindung bestand in allen Testfällen aus einem Wlan, mit Mobilem Internet wurde bisher noch nicht getestet. Unter diesen hier angegebenen Bedingungen funktionierte ANABEL problemlos, einzige Einschränkung war, dass auf Grund der Größe auf dem Nexus 7 keine Figuren getestet werden konnten. 37 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 5.3. ANWENDUNGSBEISPIEL 5.2.1 Acer Iconia A200 Das Acer Inconia A200, ist das Tablet auf dem ANABEL entwickelt und getestet wurde. Es ist ein 10 Zoll Tablet welches OpenGL ES 2.0 fähig ist. OpenGL ES 2.0 ist notwendig um unsere App laufen zu lassen. Weitere Details zum Tablet listen wir hier einmal auf. • 10 Zoll Display • 1280x800 Pixel Auflösung • Android 4.0 IceCream Sandwich • OpenGL ES 2.0 fähiger Grafikchip • Wlan (Beim spielen mit entfernten Personen) • Kamera Die 10 Zoll sind wichtig, da sonst ein Spielen mit Figuren nicht möglich wäre, da nicht genug Platz auf dem Tablet wäre um alle Figuren aufzustellen. Außerdem sind die einzelnen Punkte zu klein, als das die Figuren überhaupt passend zu den Touchpunkten Größen wären. Da die App in Android 4.0 programmiert wurde, ist auch eine Android Version von mindestens 4.0 erforderlich, damit die App läuft. Die komplette Spieloberfläche wurde in OperGL ES 2.0 geschrieben, deswegen muss der Grafikchip dieses unterstützen. Wlan ist erforderlich, da es bei der App möglich ist auch mit Leuten zu spielen, die sich an einem anderen Ort befinden und die Kamera wird dazu benutzt um vor Spielbeginn ein Bild von den Mitspielern zu machen, die während des Spielens angezeigt werden und besonders im Online Modus von Bedeutung sein sollen, da so das Gefühl gegeben werden soll, dass die andere Person doch nicht so weit entfernt ist. 5.3 Anwendungsbeispiel Saskia Müller Im folgenden Anwendungsbeispiel gehen wir davon aus, dass eine kleine Familie, bestehend aus Mutter, Vater und Kind zu Hause sind in Bremerhaven. Die Oma des Kindes kann leider nicht da sein, da sie in Berlin wohnt. Sie wollen aber miteinander einen schönen Abend verbringen, an dem sie Brettspiele spielen. Da die Oma allerdings nicht sehr Technik bewanndert ist, kommt das Spielen über den PC nicht in Frage, denn die Benutzung der Maus ist für viele ältere Personen schon eine Herausforderung. Deswegen hat die Oma von ihrem Kind ein Tablet geschenkt bekommen, mit dem sie ganz gut umgehen kann, da sie es mit dem Finger bedienen kann und somit genau da Klicken kann wo sie möchte und nicht erst versuchen muss, den Mauszeiger an die richtige Stelle zu bekommen. Da nun beide ein Tablet besitzen, die Familie in Bremerhaven und die Oma in Berlin, können sie mit unserer App Brettspiele spielen und das sogar mit echten Figuren, was der Oma besonders gut gefällt, da sie dadurch eher das Gefühl hat, dass ihre Familie in der Nähe ist und es ihr so leichter fällt, den Überblick über das Spiel zu behalten, als wenn sie nur bunte Punkte auf einem Bildschirm sieht. 38 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 5. ANABEL Wir teilen das Anwendungsbeispiel in zwei Teile auf. Zum Einen zeigen wir die Vorgehensweise der Familie, die das Spiel erstellt und danach zeigen wir aus der Sicht der Oma, wie sie diesem Spiel beitreten kann. Dabei werden wir einmal durch alle Activities unsere App gehen. Activities in einer Android app sind die verschieden Oberflächen, die die Familie durchlaufen muss, bis sie zum eigentlichen Spiel gelangen. 5.3.1 Spiel Erstellen 5.3.1.1 Login Activity Als erstes wenn man die App startet, egal ob man ein Spiel erstellen oder einem beitreten möchte, muss man sich mit einem Xmppaccount, auch Jabberaccount genannt, einloggen. Zur Zeit ist es allerdings nur möglich, sich mit einem Googleaccaunt anzumelden. Zum Anmelden gibt der Vater den Benutzernamen, den Server und das Passwort ein. Anschließend klickt er auf den Button Login. Abbildung 5.2 5.3.1.2 Login Activity Choice Activity Nachdem er sich erfolgreich eingeloggt hat gelangt er zur Choice Activity. Die Choice Activity besteht lediglich aus zwei Buttons, zum Einen Spiel erstellen und zum Anderen einem Spiel beitrete. Hier klickt der Vater auf Spiel erstellen. 39 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 5.3. ANWENDUNGSBEISPIEL Abbildung 5.3 Choice Activity 5.3.1.3 Create Game Activity Nun öffnet sich die Create Game Activity. Standardmäßig ist der Offlinemodus ausgewählt und die Spieleranzahl auf zwei eingestellt. Den Modus kann der Vater über die Radiobuttons jederzeit hin- und herschalten und auch die Spieleranzahl kann er über einen so genannten Spinner jederzeit während des Erstellens eines Spieles ändern. Er wählt nun den online Modus und die vier Spieler. Hier gibt die Familie nun ihre drei Namen ein und wählt ihre Farben aus, den Namen der Oma, gibt sie beim Beitreten zum Spiel selber ein. Sobald der Vater in den Onlinemodus wechselt kommt ein Hinweistext, dass die Namensfelder und die Farbfelder für entfernte Spieler frei bleiben sollen. Außerdem ändert sich der Button von “Spiel erstellen” zu “Erstellen und Freunde Einladen”. Nachdem alles eingetragen ist, klickt der Vater auf diesen Button und die XMPP Activity öffnet sich. Abbildung 5.4 40 Create Game Activity Online Modus, vier Spieler Ansicht Bachelorarbeit 5.3.1.4 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 5. ANABEL XMPP Activity In der XMPP Activity, werden die Freunde vom XMPPaccount angezeigt und es können neue hinzugefügt werden. Der Vater wählt hier den Accountnamen der Oma aus, indem er diesen einmal anklickt und anschließend noch auf “Einladen” klickt. Wäre ihr Accountname noch nicht in der Liste gewesen, hätte der Vater diesen in das Feld direkt unter “Einladen” eingeben können und danach auf “Freund hinzufügen” klicken können, um ihren Account dauerhaft in seiner Freundesliste speichern zu können. Abbildung 5.5 XMPP Activity Durch den Klick auf “Einladen” wurde die Einladung abgeschickt, und die Oma kann diese annehmen. Nachdem das geschehen ist, öffnet sich die Spielansicht, die nach dem Beitreten der Oma genauer gezeigt wird. 5.3.2 5.3.2.1 Spiel Beitreten Login Activity und Choice Activity Um dem erstellten Spiel beitreten zu können, muss die Oma sich ebenfalls zuerst mit ihrem Account einloggen und anschließend in der Choice Activity auf den Button “Spiel beitreten” klicken. 5.3.2.2 Join Game Activity In der Join Game Activity, die sich nach dem Klicken auf Spiel Beitreten öffnet, sind alle Einladungen, die an ihren Account geschickt wurden, zu sehen. Zum Annehmen der Einladung, die 41 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 5.3. ANWENDUNGSBEISPIEL die Oma von dem Account ihrer Familie erhalten hat, muss sie den entsprechenden Button anklicken und anschließend auf “Einladung Annehmen” klicken. Die Zahlen hinter dem Absender der Einladung geben an, wie viele Spieler bereits in das Spiel eingetragen wurden und wie viele insgesamt am Spiel teilnehmen sollen. Abbildung 5.6 Join Game Activity 5.3.2.3 Accept Invite Activity Nun öffnet sich die Accept Invite Activity in der die Oma sieht, welche Einstellungen ihre Familie für dieses Spiel ausgewählt haben, also ihre Namen und die Farbe, die sie ausgewählt haben. In die freien Felder trägt die Oma nun ihren eigenen Namen und die Farbe, die sie haben möchte ein. Nachdem sie alles eingetragen hat, drück sie nun noch auf den Button “Antwort Senden” und das Spiel beginnt auf beiden Seiten. Abbildung 5.7 42 Accept Invite Activity Bachelorarbeit 5.3.2.4 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 5. ANABEL Spielansicht Jeffrey Wolfe Abbildung 5.8 Spielansicht 1 Wie man spielt sollte hoffentlich selbsterklärend sein, trotzdem noch einmal erläutert. Wenn man am Zug ist, angezeigt durch den Pfeil, der auf das eigene Foto und Spielfarbe gerichtet ist, darf man Würfeln. Dies tut man indem man mit dem Finger über den Würfel wischt. Solange alle Spielfiguren auf den Startfeldern stehen hat man drei Versuche eine Sechs zu würfeln und somit eine Figur raus zu setzen. Man kann jede Figur die sich im Spiel befindet entsprechend der gewürfelten Augen vorwärts bewegen. Berührt man eine Figur muss man diese auch ziehen, wohin man ziehen kann wird einem angezeigt siehe Abb.5.9. 1 die Bilder stammen von : http://www.uncoached.com/wp-content/uploads/2011/04/grandma.jpg , http://lespotter001.files.wordpress.com/2009/12/img_1186.jpg , http://www.ichbinpapa.de/fileadmin/grafiken/presse/Daniel_Eichhorn.png und http://www.sabrina-und-andreas.de/myPics/Wir/sonja.JPG 43 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 5.3. ANWENDUNGSBEISPIEL Abbildung 5.9 Angezeigtes Ziel Ob man direkt auf das Zielfeld setzt oder die Felder einzeln abläuft ist einem selbst überlassen. Stellt man seine Figur auf das Zielfeld ist damit der eigene Zug beendet, sofern man keine Sechs hatte, und der nächste Spieler ist dran. Befindet sich auf dem Zielfeld bereits eine andere Spielfigur muss diese wieder auf das nun wieder groß dargestellte Startfeld zurück gesetzt werden. Ist kein Zug möglich ist direkt der Nächste dran. Wenn man das Spielbrett einmal umrundet hat, kann man seine Figur in die Zielfelder setzen, dabei dürfen keine Figuren, die sich bereits dort befinden übersprungen werden. Stehen alle Figuren im Ziel hat man gewonnen und es erscheint eine Nachricht. Um eine Spielfigur zu setzen, muss diese nach dem Würfeln einmal berührt werden, erst dann wird angezeigt, auf welches Feld man diese setzen kann. Bis zu diesem Zeitpunkt kann man jede beliebige Figur nehmen, die einem selbst gehört. Das Ende eines Spielzuges wird immer automatisch erkannt. Es ist also keine bestätigende Eingabe seitens des Benutzer nötig, um den Zug zu beenden, da dieses den Spielfluss unterbrechen würde. Spielregeln, wie bei einer Sechs muss eine Figur rausgestellt werden, werden nicht geprüft, diese einzuhalten liegt in der Verantwortung der Mitspieler. 44 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 5. ANABEL Abbildung 5.10 Gewinnmeldung 45 Kapitel 6 Implementierung Jeffrey Wolfe Die in im Rahmen dieser Bachelorarbeit entstandene App ist ANABEL. In diesem Kapitel wollen wir darauf eingehen, wie wir ANABEL umgesetzt haben oder wofür wir zumindest konkrete Überlegungen gemacht haben wie eine Realisierung aussehen könnte. 6.1 1 2 3 4 5 6 7 8 9 10 11 Android Manifest Jeffrey Wolfe . . <uses−permission android:name="android.permission.INTERNET" /> <uses−permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses−feature android:glEsVersion="0x00020000" android:required="true" /> <supports−screens android:xlargeScreens="true" android:largeScreens="true" android:←requiresSmallestWidthDp="720" android:resizeable="false" android:smallScreens="false" android:normalScreens="false"/> . . android:screenOrientation="landscape" > Listing 6.1 ←- Auszug manifest ANABEL kommt mit lediglich zwei Rechten aus, Internetzugriff und Schreibrechte für den externen Speicher. Die Schreibrechte sind nötig, da die aufgenommen Bilder dort gespeichert werden. Weiterhin haben wir festgelegt, dass OpenGL ES 2.0 zwingend erforderlich ist. Da sich Geräte mit kleinem Bildschirm nicht eignen zum Spielen, sind diese nicht zulässig. Um eine korrekte 47 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.2. BOARDGAME Spieldarstellung zu garantieren, wird die Bildschirmausrichtung im Landschaftsmodus gesperrt. 6.2 Boardgame Saskia Müller Unsere App besteht aus sieben verschiedenen Activities. Sie wurden größten Teils per XML definiert teilweise auch über den Oberflächeneditor für Android in Eclipse und die zwei sehr dynamisch aufgebauten Activities, XMPPActivity und JoinGameActivity wurden hauptsächlich im Java Quelltext definiert. Auf zwei Activities wollen wir an dieser Stelle einmal eingehen, um zu beschrieben, wie eine Activity per XML erstellt wird und wie sie per Quelltext erstellt wird. Außerdem ist in diesem Paket noch unsere Application, GameApp, enthalten. Dieses ist der Zentrale Punkt in dem die meisten Objekte gehalten werden und auf den von überall zugegriffen werden kann. Auch der größte Teil der Logik geschieht zur Zeit in dieser Klasse, dieses werden wir aber beim Weiterführen dieses Projektes ändern siehe Ausblick Implementierung. In diesem Paket sind zusätzlich noch drei weitere Pakete, auf die wir noch genauer eingehen. Abbildung 6.1 6.2.1 Klassendiagramm Paket Boardgame GameApp GameApp ist die Zentrale Klasse unserer Implementierung, fast jede Klasse greift auf sie zu. In ihr werden alle wichtigen Objekte und die Accountnamen der Kommunikationspartner gespeichert. Außerdem läuft zum jetzigen Zeitpunkt noch ein großer Teil der Logik in dieser Klasse ab. Hier haben wir alle in Kapitel 3.6.1 angegeben Regeln, die für den richtigen Spielablauf sorgen implementiert. 48 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG Abbildung 6.2 6.2.1.1 Reduzierte Klasse GameApp Regeln Möglichkeit eines Zugs erkennen Um zu erkennen, ob es einen möglichen Zug für die gewürfelte Augenzahl gibt, wird sobald das Ergebnis des Würfelwurfes bekannt ist, geprüft ob irgendeine Figur des Spielers gesetzt werden kann. Dieses geschieht durch Aufruf der Methode anyPossibleMoves(), die weitere Methoden aufruft. Während des Aufrufs dieser Methode, wird geprüft, ob alle Figuren auf den Startfeldern stehen, und wenn sie es tun, ob eine Sechs gewürfelt wurde. Und es wird geprüft, ob es Figuren in den Zielfeldern gibt, wenn ja wird geguckt, ob mit der Würfelzahl, ohne Überspringen dieser Figur/en, eine Figur gesetzt werden kann. Ist kein Zug möglich wird automatisch die Methode nextPlayer() aufgerufen, die unter Beachtung aller Regeln den nächsten Spieler ermittelt, der auch der selbe Spieler sein kann. 49 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.2. BOARDGAME Möglichkeit Spieler ist ein Weiteres mal am Zug Ob ein Spieler nochmal am Zug ist wird beim Aufrufen der nextPlayer() Methode unter Verwendung der onStartField() Methode geprüft, dazu wird die threeTimes Variable zur Hilfe gezogen. Doch davor wird Überprüft, ob die gewürfelte Zahl eine Sechs ist. Sechs zum Rausstellen einer Figur Immer wenn nach dem Würfeln eine Figur angefasst wird, wird die tryMove() Methode ausgerufen. In dieser wird geprüft, ob die angefasste Figur gesetzt werden kann, und wenn sie gesetzt werden kann wird der Weg, den sie gehen kann in goal gespeichert. Der letzte Eintrag in goal, ist das Endfeld, auf dem die Figur nach Beenden des Zuges stehen muss. Bevor diese Liste aufgebaut wird, wird auf mehrere Fehler überprüft, ob diese Figur überhaupt bewegt werden kann. Es wird geprüft, ob die Figur überhaupt dem aktuellen Spieler gehört, ob vor dem Setzen überhaupt gewürfelt wurde, dafür wird das Objekt role benutzt, ob sich überhaupt ein Token auf dem Feld befindet, dieses kann wichtig sein, wenn der Token auf dem Spielfeld verrutscht ist oder durch Antippen des falschen Feldes (ausversehen) oder wenn eine andere Figur bereits angetippt wurde. Ist ein Zug aber möglich, da die eben genannten Fälle nicht auftreten, wird die Variable goal gefüllt. Ist das angetippte Feld von Typ eins, also ein Startfeld, wird goal nur mit dem nächsten Feld befüllt. In allen anderen Fällen wird es mit n*field.next befüllt, wobei n der Anzahl der Augen des Würfelwurfes ist. Zug endet mit Setzen der Figur auf Zielfeld Da in goal das Zielfeld für die ausgewählte Figur in Bezug auf das Würfelergebnis gespeichert wird, ist dieses sehr einfach umzusetzen. Der Zug endet erst, wenn die Figur auf den letzten Eintrag, der in goal gespeichert ist, gesetzt wird. 6.2.1.2 Spielfigur setzen Damit eine Figur gesetzt wird muss mindestens zwei mal die Methode tryMove() aufgerufen werden. Das erste Mal wird ihr das Feld auf dem die Figur, die gezogen werden soll, steht aufgerufen. Daraufhin wird dieses Feld in der Variable inAction gespeichert und die Liste goal wird befüllt. Beim letzten Mal wird ihr das Endfeld übergeben, auf dem die Figur am Ende des Zuges steht. Daraufhin wird der Token von dem Feld inAction gelöscht und in dem neuen Feld eingetragen. Sollte auf dem neuen Feld bereits ein Token gestanden haben, wird dieser mit dem neuen Token überschrieben. Für den rausgeworfenen Token wird über die Methode lookForFreeField() ein neuer Standort gesucht, auf den dann die Figur zurückgestellt werden muss. Wenn ein entfernter Spieler ein UpdateMove sendet, wird von der Connection die Methode updateMove() aufgerufen. Diese ruft zuerst mit der, in dem Objekt enthalten, oldID die Methode tryMove() und anschließend mit newID auf. Es wird also auch beim entfernten Spieler, die Spiellogik aufgerufen. Mithilfe von sendUpdateMove() wird dieses Objekt versendet. 50 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG Wenn ein UpdateDie eintrifft, wird dieses Ergebnis der Methode fakeRoll() im Renderer mitgeteilt und der Würfelwurf simuliert. 6.2.2 CreateGameActivity Anhand dieser Klasse wollen wir auf Android spezifische Programmierung, wie Komponenten, aufrufen von Activities und ein paar andere Sachen eingehen. Die Klasse CreateGameActivity ist eine Android Activity, die Angabe von “extends Activity” macht es zu einer Activity. Zusätzlich muss jede Activity noch dem Android Manifest bekannt gemacht werden, damit diese beim Aufruf auch als Activity gefunden wird. Das Aussehen dieser Activity haben wir überwiegend in der Android Layout Datei beschrieben und nicht im Code selber. Abbildung 6.3 Reduzierte Klasse CreateGameActivity Layouts In diesem Abschnitt wollen wir ein paar wichtige Komponenten zeigen und wie diese in einer Android Layoutdatei definiert werden, anhand der Klasse CreateGameActivity. 51 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.2. BOARDGAME Button Bei Android Komponenten, die in der XML definiert werden, wird angegeben durch android:layout_width ob die Große dieser Komponente dem ihr zugewiesenen Text angepasst wird durch “wrap_content” oder sie z.B. so langgezogen werden, wie die Überliegende Komponente die oft das Layout ist, hier ein GridLayout, durch “fill_parent”. Die Position, an der der Button angezeigt wird, wird durch die beiden Angaben von android:layout_column und android:layout_row angezeigt. Außerdem kann noch angegeben werden, an welcher Seite die Schwerkraft der Komponente liegt, also an welcher sie angezeigt wird, sollte sie die Position an der sie sich befindet nicht komplett ausfüllen, durch Angabe von android:layout_gravity. Eine Besonderheit bei Buttons ist android:onClick=“onClickCreate” durch diese Angabe wird die Methode mit dem Namen onClickCreate der Klasse CreateGameActivity bei einem Klick auf den Button automatisch aufgerufen. Im Quelltext könnte man dieses durch das Anmelden eines onClickListeners machen. Jede Android Komponente hat außerdem noch eine eindeutige ID, die in der XML zugewiesen wird, durch die auf diese Komponente im Quelltext wieder zugegriffen werden kann. <Button 1 android:id="@+id/bCreate" android:layout_width="wrap_content" android:layout_column="0" android:layout_columnSpan="3" android:layout_gravity="left" android:layout_row="9" android:onClick="onClickCreate" android:text="@string/bcreate" android:textSize="40sp" /> 2 3 4 5 6 7 8 9 10 Spinner Der Spinner in Android, ist eine Dropdown Auswahlkomponente, die man auch aus anderen Programmen kennt. Bei ihr kann der Inhalt, welche Auswahlmöglichkeiten zur Verfügung stehen, in der XML definiert werden, durch Verwendung von Android values. Diese haben wir auch benutzt, und zwar die Arrays, die Zuweisung dieses geschieht bei uns allerdings erst im Quelltext,(siehe Beispiel) nicht bereits in der XML. Dieses geschieht aus dem Grund, dass wir hier die bereits ausgewählten Inhalte, anderer Spinnern, nicht mehr anzeigen wollen, dieses ist allerdings noch nicht implementiert. ArrayAdapter<CharSequence> adapterPlayer = ArrayAdapter.createFromResource(this, R.←array.sp_players, R.layout.text_view); 1 RadioButton RadioButtons werden benutzt um nur einen von mehren Auswahlmöglichkeiten zu akzeptieren, dafür müssen die zusammengehörenden RadioButtons in eine RadioGroup zusammen gefügt werden. RadioButtons haben einen speziellen Wert der gesetzt werden kann, das ist der Wert 52 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG checked. Die übrigen Werte, die wir hier benutzt haben sind zur Beschreibung, an welcher Stelle dieses Objekt dargestellt werden soll und in in welcher Größe. 1 <RadioButton android:id="@+id/rbOffline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" android:checked="true" android:onClick="onClickOffline" android:text="@string/offline" android:textSize="40sp" /> 2 3 4 5 6 7 8 9 Um auf diese Komponenten, die in der XML definiert wurden zugreifen zu können, müssen wir diese in unserer Klasse als Variablen speichern, wir haben uns für globale Variablen entschieden, da wir an vielen Stellen wieder auf sie zugreifen müssen. Dieses geschieht durch den Befehl findViewById(R.id.Komponentenid); und einen Cast in die Komponente. 1 eplayer1 = (EditText) findViewById(R.id.etPlayer1); Dieses machen wir mit allen Komponenten, auf die wir noch einmal zugreifen müssen, dies sind viele aber nicht alle Komponenten des Layouts. Da wir in dieser Klasse auf unseren globalen Zugriffspunkt der GameApp zugreifen müssen, müssen wir in unsere Klasse folgende Zeile einfügen. game = ((GameApp)getApplicationContext()); 1 Die Zugriffe, die wir auf die Komponenten in unserem Quelltext machen, sind das Setzten der Sichtbarkeit, das auslesen von Texten, das Auslesen der Position des Spinners und das Ändern des Textes von den TextViwes. Ist bei dem Klick auf den Button erstellen der RadioButton online gecheckt, wird eine neue Activity ausgerufen, dieses geschieht mit folgendem Aufruf: 1 2 Intent i = new Intent(this, XMPPActivity.class); startActivityForResult(i, 1); Um eine neue Activity aufzurufen, muss zuerst ein neuer Intent erstellt werden mit Angabe der Klasse, die Aufgerufen werden soll. Danach wird mit dem Befehl startActivity(Intent) die neue Activity gestartet. startActivityForResult(Intent, 1); benutzt man immer dann, wenn man nachdem die neu geöffnete Activity geschlossen wurde, ein Ergebnis erhalten möchte und zur ausgangs Activity zurückkehren möchte. Das Ergebnis wird in der onActivityResult() Methode verarbeitet. 6.2.2.1 Take Picture Jeffrey Wolfe Die Möglichkeiten von Intents wie gerade und in 4.1.2.3 erläutert, machen wir uns zu Nutze um ein Foto der Spieler machen zu können. 53 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.2. BOARDGAME 1 2 3 4 5 6 7 8 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { image = createTempFile("image"); } catch (IOException e) { return; } takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image)); startActivityForResult(takePictureIntent, TAKE_PICTURE); Beim Klick des Buttons wird ein Intent zum Aufnehmen eines Fotos erzeugt, in diesem Fall ein Intent der allgemein eine Aufgabe beschreibt. Es wird vom Android System also die standard Activity für diesen Zweck genutzt. Da wir ein vollwertiges Foto brauchen setzen wir ein Extra, das der Foto Activity anweist dieses Bild in einer von uns vorgegebenen Datei zu speichern. 1 2 3 4 5 6 7 private File createTempFile(String name) throws IOException{ File file; name += System.currentTimeMillis(); file = File.createTempFile(name,".png",getExternalFilesDir(null)); file.setWritable(true, false); return file; } Die Datei wird im Daten Ordner, den jede App hat, angelegt und mit einem eindeutigen Bezeichner versehen um Kollision zu verhindern. Um den Ordner unnötig mit etlichen Dateien zu überfüllen, wird der Inhalt bei jedem Start der App geleert. In der onActivityResult Methode wird wenn der ResultCode TAKE_PICTURE entspricht ein weiteres Intent erzeugt. 1 2 3 4 5 6 7 8 9 10 11 12 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setClassName("com.google.android.gallery3d", "com.android.gallery3d.app.CropImage"); intent.setDataAndType(Uri.fromFile(image), "image/png"); intent.putExtra("crop", "true"); intent.putExtra("outputX", 512); intent.putExtra("outputY", 512); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("scale", true); intent.putExtra("noFaceDetection", true); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(croppedImage)); startActivityForResult(intent, CROP_PICTURE); Wir starten CropImage Activity, die Teil der Gallery ist. Damit soll das eben geschossene Foto zugeschnitten werden. Um das Bild als Textur nutzen zu können soll das Seitenverhältnis quadratisch sein und die Auflösung eine Zweierpotenz sein. Damit dies sichergestellt wird setzen wir diese Anforderungen in den Extras. 1 2 3 4 5 6 Bitmap thumb = Bitmap.createScaledBitmap(bitmap, width, height, true); imButton.setImageBitmap(thumb); try { PictureHelper.savePicture(this, pictureForPlayer, bitmap); . . 54 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG Sobald das Bild zugeschnitten wurde, setzen wir eine Thumbnail version als Icon für den Foto Button und speichern es mit Hilfe des PictureHelper aus dem renderer Paket so, dass es eindeutig einem Spieler zugeordnet werden kann. 6.2.3 XMPPActivity Saskia Müller Anhand der XMPPActivity zeigen wir, wie man einem bestehenden Layout weitere Komponenten zufügen kann, da dieses dynamisch gestaltet werden muss, weil jeder Benutzer eine unterschiedliche Anzahl an Freunden hat, die er zu einem Spiel einladen könnte. Das Layout für diese Activity haben wir bereits in der XML festgelegt und uns für ein LinearLayout entschieden, da wir die Activity nur in der Länge verändern wollen und nicht in der Breite. Um diesem Layout nun neue Komponenten hinzuzufügen, müssen wir dieses wieder in einer Variablen in unserer Klasse speichern. Haben wir das getan können wir mit folgenden Befehlen per Quelltext einen neuen Button hinzufügen: 1 2 3 4 5 6 ToggleButton t = new ToggleButton(this); t.setTextOn(text); t.setTextOff(text); t.setTextSize(45); t.setChecked(false); linearLayout.addView(t); Diese Befehle ähneln denen, die in der XML benutzt werden darum wollen wir hier nichts Näheres erklären außer, das es wichtig ist, dass die erstellte Komponente durch die addView() Methode dem Layout bekanntgegeben wird, damit diese auf der Oberfläche auch erscheint. Wir stellen jeden einzelnen Freund der Freundesliste als einen eigenen ToggleButton dar. Wir haben uns für ToggleButtons entschieden, da wir später mehr als nur einen Freund zu einem Spiel einladen können wollen und ToggleButtons dafür schöner fanden als beispielsweise Checkboxen. Diese speichern wir alle in einer ArrayList um die Buttons später einfach durchlaufen zu können. Auf weitere Activities gehen wir nicht weiter ein, da wir dort keine besonderen Dinge tun, auf die genauer eingegangen werden muss, die wir nicht schon durch die zwei Activities beschrieben haben. 6.3 Spielobjekte Jeffrey Wolfe Field Field ist eine recht simple Klasse, sie enthält lediglich zu welchem Spieler sie gehört, den Typ, eine ID, die Kanten und welche Spielfigur dort steht, also das Token. 55 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.3. SPIELOBJEKTE Token Eine Spielfigur wird durch die Klasse Token repräsentiert. Zur Vereinfachung steht im Token sowohl das Feld, auf dem es steht, als auch der Spieler, zu dem es gehört. Player Über Player gibt es ebenfalls nicht viel zu sagen, lediglich, dass das Attribut local für den Spielablauf sehr wichtig ist. Dadurch wird entschieden wie der Zug des Spielers realisiert wird, ein lokaler Spieler wird anders behandelt als ein entfernter, siehe dafür 6.2.1.2. Roll Roll stellt das aktuelle Würfel Ergebnis dar und wie viele Schritte noch übrig sind. Die Schrittweite ist dabei beliebig. 56 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG Abbildung 6.4 gameLogic Paket 57 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.3. SPIELOBJEKTE In der aktuell umgesetzten Version der Logik geschieht die Überprüfung von Spielzügen noch komplett festeinprogrammiert in der GameApp und nicht wie geplant in einer allgemeinen und austauschbaren Weise. Dies ist einer der wichtigsten Punkte der noch umgesetzt werden soll. Später soll die Klasse Rule die Oberklasse für alle Regeln darstellen. Alle anderen Klassen sind implementiert und werden auch genutzt um das Spielen möglich zu machen. 6.3.1 Board Das logische Spielbrett wird durch die Klasse Board repräsentiert, in dieser sind alle Spielfelder enthalten. Alle Instanzen dieses Objekts, die für das komplette Spielfeld nötig sind werden im Konstruktor aus zwei 2D-Arrays generiert. 1 2 3 4 5 6 7 8 9 10 11 12 13 int[][] DefaultLayout = { {11,11,00,00,03,03,22,00,00,21,21}, {11,11,00,00,03,29,03,00,00,21,21}, {00,00,00,00,03,29,03,00,00,00,00}, {00,00,00,00,03,29,03,00,00,00,00}, {12,03,03,03,03,29,03,03,03,03,03}, {03,19,19,19,19,00,49,49,49,49,03}, {03,03,03,03,03,39,03,03,03,03,42}, {00,00,00,00,03,39,03,00,00,00,00}, {00,00,00,00,03,39,03,00,00,00,00}, {31,31,00,00,03,39,03,00,00,41,41}, {31,31,00,00,32,03,03,00,00,41,41}, }; Listing 6.2 Mensch ärger dich nicht Brett Layout Die relevanten Informationen um die Field Objekte zu instanziieren sind recht simpel in den Zahlenwerten kodiert, die erste Ziffer steht für den Spieler, dem das Feld gehört und die zweite Ziffer beschreibt den Typ des Feldes. Eine 1 steht etwa für das Startfeld und eine 9 für das Zielfeld. 1 2 3 4 5 6 String[][] DefaultRule = { {"0101","0105"}, {"0102","0105"}, {"0201","0105"}, . . Listing 6.3 Kanten Die Kanten, siehe 3.4.1, werden auf eine ähnliche Art und Weise generiert. In der ersten Spalte steht ein Feld und in den folgenden Spalten stehen die Felder zu denen man von diesem kommen kann. 58 Bachelorarbeit 6.4 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG Spieldarstellung Jeffrey Wolfe Abbildung 6.5 Spiel Die Darstellung des Spielfeldes erfolgt mittels OpenGL ES 2.0, wobei wir nur die reine OpenGL API Anbindung von Android nutzen und kein fertige Engine, die den Umgang mit OpenGL weiter abstrahiert und zusätzliche Funktionalitäten und Helferklassen liefern würde. Da bisher keine Erfahrung mit OpenGL vorhanden war, habe ich vornehmlich aus Interesse daran OpenGL kennen zu lernen mich dafür entschieden zunächst auf eine vorhandene 3D Engine zu verzichten. Die Wahl dazu ES 2.0 statt 1.* zu nutzen begründet sich ebenfalls auf der mangelnden Vorerfahrung, ich habe es als sinnvoll angesehen direkt die aktuelle Version zu lernen auch wenn der Einsteig sich als schwieriger gestaltet und man weniger Dokumentation findet. Vorteile von ES 2.0 gegenüber der älteren Version sind eine deutliche größere Flexibilität durch die Shader, siehe 4.4.5 und eine bessere Performance. Nach dem Fällen dieser Entscheidung konnte ich damit anfangen den Umgang mit der OpenGL API zu lernen und den renderer zu implementieren. 59 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.4. SPIELDARSTELLUNG Abbildung 6.6 Renderer-Paket Klassendiagram Das Renderer-Paket besteht aus insgesamt 14 (15 wenn man die innere Klasse von GameView mitzählt) Klassen, wobei die meisten davon Unterklassen von RendererObject darstellen, aber meist nur im Konstruktor bestimmte Skalierungen oder ähnliches festlegen. Diese Klassen und RendererObject bedürfen Überarbeitung, RendererObject soll, wie der Name bereits sagt, die Oberklasse aller zu zeichnenden Objekte sein, wird aber nicht von allen Spielobjekten implemen- 60 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG tiert bzw. erweitert. Die Darstellung erfolgt sobald die GameActivity gestartet wird, diese nutzt GameView als ContentView1 . 6.4.1 GameView Abbildung 6.7 reduzierte GameView Klasse Die GameView Klasse stellt eine Implementierung der GLSurfaceView aus dem Android Framework dar, eine spezielle Variante einer SurfaceView auf der mit Hilfe eines OpenGL Renderer gezeichnet wird und dafür in einem eigenen dedizerten Renderer Thread läuft. Da das rendern in einem eigenen Thread erfolgt, pausiert die GameActivity in ihrer onPause() Methode ebenfalls die GameView, da es nicht besonders sinnvoll wäre ein Spiel zu rendern was gerade überhaupt nicht angezeigt wird und dafür Resourcen zu verschwenden. Neben dem Zeichnen des Bildschirms durch den Renderer erfolgt hier auch der Verarbeitung aller Interaktionen des Spielers mit dem Touchscreen, also überschreibe ich die abstrakte onTouch(View v, MotionEvent event) Methode. 1 2 3 public boolean onTouchEvent (MotionEvent event){ return gestures.onTouchEvent(event); } Einfach nur zu wissen wo der Bildschirm berührt wurde ist für uns nicht ausreichend, daher wird das event an einen SimpleOnGestureListener weitergereicht, der die ausgeführte Geste erkennt, man aber nur die Methoden der für uns relevanten Gesten implementieren muss, statt auf alle zu reagieren. 1 private class GestureListener extends GestureDetector.SimpleOnGestureListener{ 2 1 Die Grafische Darstellung einer Activity 61 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.4. SPIELDARSTELLUNG GameView view; 3 4 public GestureListener(GameView view){ super(); this.view = view; } 5 6 7 8 9 public boolean onDown(MotionEvent event) { if(!onBoard(event)) return true; makeMove(event); return true; } 10 11 12 13 14 15 void makeMove(MotionEvent event){ float x = event.getX(); float y = event.getY(); int cols = game.board.cols(); int rows = game.board.rows(); float width = view.getWidth() * boardscale; float height = view.getHeight(); float scaleX = cols/width; float scaleY = rows/height; int fieldX = (int) (x*scaleX); int fieldY = (int) (y*scaleY); Field field = game.board.field(fieldY, fieldX); if(field!=null) game.tryMove(field); } 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if(onBoard(e1)) return false; if(!game.currentPlayer.local) return false; Log.d("event","fling"); int dx = (int) (e2.getX() − e1.getX()); //Richtung auf der X−Achse int dy = (int) (e2.getY() − e1.getY()); //Richtung auf der Y−Achse renderer.rollDie(velocityX, velocityY); return true; } 31 32 33 34 35 36 37 38 39 40 41 /* * Testet ob das Event auf dem Spielbrett war */ private boolean onBoard(MotionEvent event){ float x = event.getX(); float boardwidth = view.getWidth() * boardscale; return(x<boardwidth); } 42 43 44 45 46 47 48 49 50 @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.d("Scroll","erkannt"); if(!onBoard(e1) || !onBoard(e2)) return true; makeMove(e2); return true; } 51 52 53 54 55 56 57 58 59 } 62 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG Zunächst haben wir auf Down, also wenn der Bildschirm einfach berührt wurde und Fling Gesten, schnelles Wischen über den Bildschirm, reagiert. Später beim Testen eines kompletten Spielablaufes mit einer Testperson ist uns aufgefallen, dass das Bewegen der Figuren nur korrekt funktioniert, wenn man die Figur anhebt und auf einem anderen Feld absetzt. Die Testperson hat jedoch versucht die Figur von einem Feld auf ein anderes zu schieben, was von uns zuvor beim testen nicht bedacht wurde. Aufgrund dessen verarbeiten wir zusätzlich Scroll Gesten, beachten dabei jedoch nur das zweite MotionEvent, das Ende des Schiebens, da der Startpunkt bereits in der Down Geste abgearbeitet wurde. Bei allen Gesten testen wir zuerst ob das Spielbrett berührt wurde oder nicht, Fling Gesten sind nur außerhalb des Spielfeldes relevant, da sie dazu dienen dem Würfel entsprechend der Wischgeschwindigkeit auf der X- bzw. Y-Achse einen Drehimpuls zu geben. (36-38) Um zu erkennen welches Spielfeld berührt wurde, rechnen wir in den Zeilen 19-26 die Bildschirmkoordinaten in Feldkoordinaten um. Berührungen der Spielfelder werden direkt an die Spiellogik weitergereicht, die diese dann verarbeitet. Die Darstellung dieser Aktionen und anderer Spielereignisse erfolgt dann im GameRenderer. 63 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.4. SPIELDARSTELLUNG 6.4.2 GameRenderer Abbildung 6.8 reduzierter GameRenderer Eine Implementierung der abstrakten Renderer Klasse stellt der von uns verwendete GameRenderer dar, wie dessen Oberklasse läuft dieser in einem eigenen endlos Thread. Sobald die Surface, die Android Zeichenfläche, existiert werden alle zu zeichnenden Objekt erstellt, OpenGL Einstellungen gemacht, die Matrizen, die die verschiedenden OpenGL Räume repräsentieren, siehe 4.4.6, initialisiert, Texturen geladen und in einen OpenGL Kontext gebunden, die Shader kompiliert und deren handle gesetzt. Wenn all diese Dinge geschehen sind wird endlos die onDraw Methode aufgerufen und somit gezeichnet. 1 2 3 4 Positioniere nal float eyeX nal float eyeY nal float eyeZ das Auge hinter dem Ursprung. = 0.0f; = 0.0f; = 14f; 5 6 7 8 9 Wir schauen in nal float lookX nal float lookY nal float lookZ 64 die ferne = 0.0f; = 0.0f; = −5.0f; Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG 10 11 12 13 14 Blickrichtung der Kamera nal float upX = 0.0f; nal float upY = 1.0f; nal float upZ = 15.0f; 15 16 17 Setzen der Viewmatrix, sie repräsentiert unsere Kamera trix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ); Listing 6.4 1 2 Initialisierung der View Matrix blic void onSurfaceChanged(GL10 gl, int width, int height) { field = new RendererField(); 3 4 GLES20.glViewport(0, 0, width, height); 5 6 7 8 9 10 11 12 13 14 15 // Erstellen einer neuen Projektions Matrix, die höhe bleibt gleich // während die Breite abhängig vom Seitenverhältnis ist. final float ratio = (float) width / height; final float left = −ratio; final float right = ratio; final float bottom = −1.0f; final float top = 1.0f; final float near = 1.0f; final float far = 15.0f; Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far); Listing 6.5 Initialisierung der Projektions Matrix Die Projektionsmatrix wäre abhängig von der Ausrichtung des Tablets, jedoch forcieren wir den Landscape Modus, daher ändert sich diese nicht. Der Großteil des Rendern geschieht passiv, das heißt es wird der Zustand aller Spielobjekte, die eine visuelle Repräsentation haben überprüft und entsprechend ihrer Zustände gezeichnet. Beispielsweise wird über alle logischen Spielfelder iteriert und abgefragt welche Farbe sie haben, abhängig z.B. davon welcher Spieler darauf steht, entsprechend dessen werden sie dann dargestellt. Ein Spielfeld existiert im Renderer nur als ein einzelnes Objekt, dass dann mehrfach an unterschiedlichen Positionen gezeichnet wird. 1 2 3 4 5 6 7 8 for(int col=0;col<game.board.cols();++col){ for(int row=0;row<game.board.rows();++row){ . Abfragen relevanter informationen über das Spielfeld . drawField(x,y,size,color); } } Zur Darstellung des Spielfeldes werden zwei verschiedene Texturen benutzt: 65 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.4. SPIELDARSTELLUNG Abbildung 6.9 Standart Feld Textur Abbildung 6.10 Hervorgehobene Textur2 Zwei wichtige Hilfsklassen zum Darstellen des Spielfeldes sind die beiden Hilfsklassen TextureLoader und TextureColor. TextureLoader Texturen können entweder aus Datein, Bitmaps oder Resourcen geladen und in den OpenGL Kontext gebunden werden. TextureColor Erzeugt aus einer Farbe einen OpenGL kompatiblen FloatBuffer zum Einfärben einer Textur. Das einzige 3D Objekt im Spiel, der Würfel, wird aktiv durch das bereits in 6.4.1 erwähnte Wischen über den Bildschirm beeinflusst. 2 Grau 66 hinterlegt damit man den Schein erkennen kann Bachelorarbeit 6.4.3 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG RendererDie Abbildung 6.11 Würfel Textur Wie man direkt sehen kann, wird diese Textur nicht einfach auf eine Fläche des Würfels abgebildet, sondern Teile der Textur auf unterschiedliche Flächen, so erhalten wir einen komplett texturierten dreidimensionalen Würfel. 67 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.4. SPIELDARSTELLUNG Abbildung 6.12 reduzierter RendererDie Die Rotation des Würfels kann auf zwei Weisen initiiert werden, entweder wenn ein Spieler würfelt oder ein simulierter Wurf, der nur dazu dient darzustellen, dass ein entfernter Spieler gewürfelt hat. Bei einem echten Wurf wird der Würfel zeitabhängig um die X- und Y-Achse rotiert, die Geschwindigkeiten nehmen dabei durch Multiplikation mit einem Dämpfungsfaktor kontinuierlich ab, solange bis beide einen Schwellenwert unterschreiten. Ist dieser Wert unterschritten wird überprüft welche Seite oben liegt. Um zu bestimmen welche Seite dies ist, gehen wir dabei wie folgt vor: Für jede Seite wird ein Vektor im Objektraum definiert, der angibt wohin diese Seite zeigt. 1 2 3 4 5 6 private private private private private private float[] float[] float[] float[] float[] float[] leftVec = new float[]{−1,0,0,1}; rightVec = new float[]{1,0,0,1}; upVec = new float[]{0,1,0,1}; downVec = new float[]{0,−1,0,1}; forwardVec = new float[]{0,0,1,1}; backVec = new float[]{0,0,−1,1}; Wir wollen nun wissen wie diese Vektoren in der Bildschirmdarstellung ausgerichtet sind, dafür werden diese mit der kombinierten Model-View-Projektions Matrix multipliziert. 1 2 3 4 5 6 float[] float[] float[] float[] float[] float[] leftInEyespace = callback.getVecInEyespace(leftVec, modelMatrix); rightInEyespace = callback.getVecInEyespace(rightVec, modelMatrix); upInEyespace = callback.getVecInEyespace(upVec, modelMatrix); downInEyespace = callback.getVecInEyespace(downVec, modelMatrix); forwardInEyespace = callback.getVecInEyespace(forwardVec, modelMatrix); backInEyespace = callback.getVecInEyespace(backVec, modelMatrix); callback ist hier eine Referenz auf GameRenderer. 1 public float[] getVecInEyespace(float[] vec, float[] modelMatrix){ 68 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG float[] resultVec = new float[4]; 2 3 Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, modelMatrix, 0); Matrix.multiplyMV(resultVec, 0, mMVPMatrix, 0, vec, 0); return resultVec; 4 5 6 7 } Um nun zu bestimmen welche Seite aus der Sicht des Spielers oben liegt, bilden wir die Skalarprodukte der erhaltenen Vektoren mit dem Vektor der aus dem Bildschirm heraus zeigt, also somit nach oben gerichtet ist. Der Vektor, der dabei das größte Ergebnis liefert entspricht, nun der Seite die oben liegt, wobei sich gezeigt hat dass ab einem Wert von -16.84 die Seite sehr eindeutig erkennbar oben liegt und wir somit direkt die Rotation stoppen können. Ist der Wert jedoch kleiner, rotieren wir den Würfel entsprechend des Ergebnisses und stoppen dann. Hierbei wäre es für eine spätere Version wünschenswert, wenn der Würfel nicht einfach abrupt stoppen, sondern ausrollen würde. Zuletzt wird die Augenzahl der Spiellogik mitgeteilt. Drei der genutzten Texturen wurden bereits gezeigt, nun nur noch kurz die restlichen Texturen aufgelistet. 6.4.4 Texturen Abbildung 6.13 Spielbrett Textur 69 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.5. NETZWERKKOMMUNIKATION Abbildung 6.14 Abbildung 6.15 Spielzug Textur Foto Umrandungs Texturen Das waren die letzten Texturen die direkt fertig vorhanden sind, dazu kommen noch die Texturen, die aus den Fotos, die alle Spieler von sich machen können, generiert werden. Dazu dienen Fotos die man in der createGameActivity, 6.2.2 machen kann und durch den PictureHelper aus dem Speicher geladen werden. 6.5 Netzwerkkommunikation Saskia Müller Unser Paket “Network” besteht aus neun verschiedenen Klassen, wovon vier Klassen, InviteAccepted, UpdateMove, Invite und UpdateDie , die Objekte repräsentieren, die wir bei einem online Spiel versenden und vier davon sind die zu den Objekten gehörenden Provider, InviteAcceptedProvider, UpdateMoveProvider, InviteProvider und UpdateDieProvider. Die neunte Klasse in diesem Paket ist die Hauptklasse der Kommunikation, Connection. Hier wird die Kommunikation aufgebaut, Pakete die von einem anderen Mitspieler gesendet wurden empfangen und eigene Pakete versendet. Die vier Objekte werden dabei von verschiedenen Klassen erstellt und der Kommunikationsklasse Connection übergeben. Diese Klassen sind CreateGameActivity, AccInviteActivity und GameApp. 70 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG Abbildung 6.16 6.5.1 Klassendiagramm Network Paket Funktionsweise XMPP Um XMPP zu benutzen sollten einige Begriffe klar sein. Im XMPP Kontext bezeichnet man mit Packet die Objekte die von einem Benutzer an seinen Server geschickt werden. Es gibt viele verschiedene Packets, zum Beispiel zum Anzeigen des Status, ob man online, offline oder abwesend ist. Ein bestimmtes Packet, welches für die Kommunikation mit anderen Personen verwendet wird, ist die Message, diese hat einen Absender und einen Empfänger und wird nach Eintreffen beim Server an den Empfänger weiter geleitet. Außerdem kann man an Packets verschiedenes anhängen, beispielsweise Properties oder PacketExtensions. Mit Properties werden hauptsächlich primitive Datenstrukturen wie int oder boolean versendet. Eine PacketExtension kann alles sein. Darum muss, wenn man eine eigene PacketExtension benutzt, auch ein eigener Provider geschrieben werden. Ein Provider parst den Inhalt, der PacketExtension, die als XML versendet wird, nach dem Versenden in den ursprünglichen Inhalt zurück. Der Roster dient der Freundesverwaltung, z.B. ob ein Freund online ist oder um neue Freunde hinzu zu fügen. 71 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.5. NETZWERKKOMMUNIKATION 6.5.2 Klasse Connection Abbildung 6.17 Klasse Connection Die Klasse Connection ist die wichtigste Klasse, wenn online gespielt wird. Sie wird in der LoginActivity.class erstellt und der public variable “connection” der GameApp zugeordnet. Im ganzen Spielverlauf wird auf sie über diese Variable zugegriffen. In GameApp selber werden auf zwei verschiedene Methoden von Connection zugegriffen, diese sind jene zum Updaten des Spielablaufs sendUpdateMove() und send updateDie(). Die Methoden sendInvite() und sendPicture() werden von der CreateGameActivity aufgerufen, getFriends() und addFriends() wird von der XMPPActivity aufgerufen und sendInviteAccepted() wird von der AccInviteActivity aufgerufen. Auf die Connection wird also von vielen verschiedenen Klassen zugegriffen. Das Meiste in dieser Klasse geschieht allerdings im Konstruktor. Ihm werden die Einlogdaten für die XMPPverbindung übergeben. In ihm wird eine Verbindung aufgebaut, Provider und Lisener angemeldet und die Freundesliste ausgelesen. Da alles was in der Connection passiert über die XMPPConnection läuft, ist das Erste was wir machen eine XMPPConnection aufzubauen. Dieses geschieht in einem neuen Thread, da hier auch Listener laufen die allerdings wartend und nicht aktiv sind. Für den Verbindungsaufbau benötigen wir drei Befehle. Der Erste gibt an, zu welchem Server sich verbunden werden soll, mit Standardeinstellungen. Dieses könnte zum Beispiel gmail.com sein. Der Zweite baut eine Verbindung zum angegeben Server auf und mit dem Dritten loggt man sich mit seinen angegeben Daten am Server ein. Das Wichtige beim 2. Schritt, ist das hier eine XMPPException abgefangen werden muss. 72 Bachelorarbeit 1 2 3 4 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG xmpp = new XMPPConnection(server); try { xmpp.connect(); xmpp.login(name , passwort); Nachdem wir uns erfolgreich eingeloggt haben, müssen wir unsere Provider anmelden, damit wir erhaltene Pakete, die von einer anderen Instanz unseres Spieles ankommen, auch verwerten können. Dafür müssen wir für jedes unserer vier Objekte die Provider mit einer solchen Zeile anmelden. 1 roviderManager.getInstance().addExtensionProvider("updateMove", "game:update:move" , new UpdateMoveProvider()); ←- Hierbei ist der erste Parameter der ElementName, der dem Wurzelelement unseres Objektes entspricht, der zweite Parameter ist der Namespace, den wir dem Objekt gegeben haben und der dritte Parameter ist eine Instanz unseres, zum Objekt gehörenden, Providers. Nachdem die Provider angemeldet sind müssen wir noch Pakete empfangen können. Dazu benötigen wir einen PacketListener oder einen PacketCollector. Wir benutzen einen PacketCollector, denn wir sollen auf Pakete reagieren und nicht so wie die meisten Instantmessanger einfach jedes Packet, sobald es ankommt, auf den Bildschirm werfen. Da wir nicht jedes ankommende Paket behandeln wollen, wie beispielsweise jede Chatnachricht, sondern nur die für das Spiel relevanten Pakete, übergeben wir dem PacketCollector einen Filter. Dadurch, erhalten wir nur Pakete, die eine Message sind und eine unserer PacketExtensions enthält. Dieses sieht im Quelltext, wie folgt aus. 1 2 3 4 5 6 7 OrFilter filter = new OrFilter(new PacketTypeFilter(Message.class), new PacketExtensionFilter("game:inviteaccepted")); filter.addFilter(new PacketExtensionFilter("game:invite")); filter.addFilter(new PacketExtensionFilter("game:update:move")); filter.addFilter(new PacketExtensionFilter("game:update:die")); andFilter = new AndFilter(filter); collector = xmpp.createPacketCollector(andFilter); Wenn ein akzeptiertes Packet ankommt, wird je nachdem welche PacketExtension das Packet enthält eine andere Methode aus einer anderen Klasse aufgerufen oder der Klasse GameApp etwas hinzugefügt. Wird eine der anderen Methoden unserer Klasse aufgerufen, wird je nach Methode ein neuer Chat erstellt oder nur eine neue Nachricht gesendet. Ist es die erste Nachricht, die an einen anderen Spieler geschickt wird, muss ein neuer Chat erstellt werden, der dann für das gesamte Spiel weiter genutzt wird. Über ihn werden dann im Spielverlauf immer wieder updateMove und updateDie Pakets gesendet. Indem als erstes eine neue Message erstellt wird und ihr dann die gewünschte PacketExtension angehangen wird. 73 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.5. NETZWERKKOMMUNIKATION 6.5.3 Provider Wie schon erwähnt werden in dem Constructor dieser Klasse Provider am ProviderManager angemeldet, damit unsere vier PacketExtension sinnvoll in ein Objekt zurückgeparst werden können. Diese Providerklassen müssen PacketExtensionProvider Implementieren und eine Methode überschreiben. Diese ist die parseExtension(parser : XmlPullParser) : PacketExtension. An dem Beispiel von UpdateMoveProvider werden wir dieses einmal zeigen. Alle vier Klassen sind von der Funktionsweise her gleich und besitzen alle nur diese eine Methode. public class UpdateMoveProvider implements PacketExtensionProvider{ 1 2 3 4 5 6 7 8 9 public PacketExtension parseExtension(XmlPullParser parser) throws Exception { boolean stop = false; int evtType; String n; String tId = ""; String fOld = ""; String fNew = ""; 10 while (!stop) { evtType = parser.next(); n = parser.getName(); switch (evtType) { case XmlPullParser.START_TAG: 11 12 13 14 15 16 if ("tokenId".equals(n)){ tId = parser.nextText(); } if ("fieldIdOld".equals(n)){ fOld = parser.nextText(); } if ("fieldIdNew".equals(n)){ fNew = parser.nextText(); } 17 18 19 20 21 22 23 24 25 26 break; case XmlPullParser.END_TAG: //Stoppe parser bei Tag </updateMove> if("updateMove".equals(n)){ Log.v("end_tag" , n); stop = "updateMove".equals(n); } 27 28 29 30 31 32 33 34 break; 35 } 36 } return (new UpdateMove(tId, fOld, fNew)); 37 38 39 } } 40 In dieser Methode habe ich jeweils die Variablen der Klassen zu denen der Provider gehört, deklariert. Hier sind es tId für TockenID, fOld für die ID des alten Feldes und fNew für die ID des neuen Feldes, auf dem von nun an der Token steht. Außerdem habe ich noch drei Variablen, 74 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG die für das Parsen notwendig sind angelegt. Das Parsen läuft so lange weiter bis der End_Tag, der dem Klassennamen entspricht, hier “updateMove”, erreicht ist und die Variable “stop” auf true gesetzt wurde. Solange der End_Tag nicht erreicht ist, werden die Start_Tags überprüft, ob diese einem der Variablen der Klasse entsprechen und daraufhin der nächste Text, den der Parser zurück gibt der dazugehörigen Variable zugeordnet. Am Ende wird aus den Variablen das ehemals versendete Objekt wieder hergestellt und zurückgegeben. 6.5.4 Network Objekte Unsere Network Objekte haben wir bewusst sehr simpel gehalten, da wir diese wieder zurückparsen müssen und dieses je nach dem welche Datenstrukturen versendet werden sehr komplex werden kann. Da wir sie über XMPP als PacketExtension versenden wollen, müssen diese Klassen PacketExtension implementieren. Dieses Interface gibt uns vor, dass wir drei Methoden überschreiben müssen von denen für uns nur eine relevant ist und zwar die toXML() Methode. In dieser geben wir an, wie unser Objekt als XML aussieht und geben dieses als String zurück. Wir haben hierfür das Framework Simple benutzt, das uns einen Stream zurückgibt, welchen wir in einen String umändern mussten, deshalb haben wir uns für einen ByteArrayOutputStream entschieden, da bei diesem die toString() Methode uns das Ergebnis zurückliefert, das wir haben wollen. Ein Codebeispiel hierfür wollen wir zeigen, indem wir die UpdateMove Klasse zeigen. Um Simple benutzen zu können haben wir hier fünf Zeilen eingefügt, für unsere drei Variablen haben wir jeweils die Zeile @Element eingefügt. Außerdem mussten wir einen Namespace einfügen, da über diesen der dazugehörige Provider geöffnet wird. Um einen einstieg für unseren Parser zu haben, ab wann unser Objekt anfängt, haben wir noch @Root am Klassenanfang eingefügt durch das unser XML String mit den Start_Tags updateMove beginnt und mit diesem End_Tag auch wieder aufhört. 1 2 3 4 5 6 7 8 9 @Root @Namespace(reference="game:update:move") public class UpdateMove implements PacketExtension{ @Element public String tokenId; @Element public String fieldIdOld; @Element public String fieldIdNew; 10 11 public UpdateMove(){ 12 13 } 14 15 16 17 18 19 public UpdateMove(String tId, String fOld, String fNew){ tokenId = tId; fieldIdOld = fOld; fieldIdNew = fNew; } 75 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.6. INTERNE ABLÄUFE 20 21 22 23 24 @Override public String getElementName() { return ("updateMove"); } 25 26 27 28 29 @Override public String getNamespace() { return ("game:update:move"); } 30 31 32 33 34 35 36 37 @Override public String toXML() { Serializer serializer = new Persister(); ByteArrayOutputStream os = new ByteArrayOutputStream(); String xml = ""; try { serializer.write(this , os); 38 39 } catch (Exception e) { System.out.println("fehler to xml"); } xml = os.toString(); return xml; 40 41 42 43 44 45 46 } } Alle vier unserer Network Objekte haben die gleichen Methoden und sind sehr ähnlich aufgebaut. Für Simpel haben wir uns entscheiden, da hierdurch auf sehr einfachem Wege aus einem Objekt ein XML entsteht. Wir mussten so nur in jedem Objekt einmal @Root, @Namespace mit den dazugehörigen Namespace angeben und für jede Variable einmal @Element angeben. Dadurch können wir bei allen vier Klassen die gleiche toXML Methode benutzen und mussten so nicht aufwendig die XML selber erstellen. Würden wir beispielsweise eine Liste oder andere Objekte in unserem Objekt haben, könnte dieses aufwendig werden und ist Dank Simple immer die gleiche einfach Methode. 6.6 Interne Abläufe Im diesem Abschnitt, wollen wir die wichtigsten Klassen beschrieben und sind auf ihre Verbindungen zu anderen Klassen eingegangen. Wir wollen genauer darauf eingehen, was im Hintergrund von ANABEL geschieht, wenn ein Spiel erstellt oder einem beigetreten wird und was geschieht während gespielt wird. Zu diesem Zweck haben wir Sequenzdiagramme erstellt. 76 Bachelorarbeit 6.6.1 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG Spiel Erstellen Abbildung 6.18 Interner Spielablauf beim Spiel erstellen Bevor ein Spiel erstellt werden kann muss zunächst einmal die App gestartet werden. Nachdem die App gestartet ist, wird als erstes die LoginActivity aufgerufen, dieses wird im Android Manifest festgelegt. Nachdem der Benutzer seine Eingaben gemacht und auf Einloggen gedrückt hat, wird die connection in GameApp gesetzt und die CreateGameActivity gestartet. Nun ist wieder eine Interaktion vom Benutzer gefordert, auf die hin die XMPPActivity gestartet wird. Diese muss zum Darstellen der Freundesliste zuerst die connection aus GameApp abfragen und anschließend den roster aus Connection abfragen. Nachdem die XMPPActivity diese erhalten hat kann die Oberfläche dargestellt werden. Nun ist erneut eine Aktion des Benutzers gefordert, nach der die XMPPActivity die Variable to in der GameApp setzt und zurück zur CreateGameActivity kehrt. Diese fragt die eben gesetzte Variable to wieder ab und sendet eine Einladung an diese XMPPAdresse, indem die Connection aufgerufen wird. Die connection sendet die Einladung über 77 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.6. INTERNE ABLÄUFE das Internet zum zweiten Benutzer. Nun wird gewartet, bis der zweite Benutzer die Einladung annimmt und die akzeptierte Einladung in der Connection eingeht. Die Connection leitet die eingegangene Einladung an die CreateGameActivity weiter, welche die Daten aus dieser extrahiert und der GameApp übergibt, in der das Spiel initiiert wird und die GameView aufgerufen wird. Diese wird laufend aktualisiert und läuft bis zum Spielende weiter, und wird durch den offenen Balken dargestellt. Der Übersicht halber haben wir im Diagramm einen Schritt weggelassen. Nach der LoginAtivity wird die ChoiseActivity aufgerufen, nach der wieder eine Aktion des Benutzers gefordert ist, auf die hin sich die CreateGameActivity öffnet. 78 Bachelorarbeit 6.6.2 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG Spiel Beitreten Abbildung 6.19 Interner Spielablauf beim Spiel beitreten Beim Spiel beitreten sind die ersten Schritte genau wie beim Erstellen, der erste Unterschied ist erst, dass die LoginActivity und nicht die CreateGameActivity gestartet wird. Auch hier wurde die ChoiceActivity als Zwischenschritt auf Grund der Übersichtlichkeit weggelassen. Um einem Spiel beizutreten, muss man zuerst eine Einladung erhalten, diese wird vom anderem Benutzer gesendet, und kommt nach dem Senden in der Connection an. Die Connection fügt die erhaltene Einladung, den Einladungen, die in der GameApp gespeichert werden hinzu. Diese Einladungen 79 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.6. INTERNE ABLÄUFE werden von der LoginAtivity abgefragt und daraus die Oberfläche generiert. Der Benutzer 2 wählt nun eine dieser Einladungen aus. Diese wird von der LoginAtivity als Ausgewählte in die GameApp eingetragen und anschließend die AccInviteActivity gestartet. Damit diese die Daten in der Oberfläche eintragen kann, die in der Einladung gespeichert sind muss die ausgewählte Einladung aus Gameapp abgefragt werden. Die nun noch offenen Felder müssen vom Benutzer 2 ausgefüllt werden und die Einladung angenommen werden. Hat der Benutzer auf Annehmen geklickt, wird die connection aus GameApp abgefragt und die angenommene Einladung an diese übermittelt. Die Connection sendet diese angenommene Einladung über das Internet an den anderen Benutzer zurück. Nun wird von der AccInviteActivity die GameApp initiiert und die GameView gestartet. Nun ist auf beiden Seiten die Spieldarstellung gestartet und der Benutzer löst, durch Wisch-, Schiebe- oder Anhebebewegungen Aktionen in unserer App aus. 80 Bachelorarbeit 6.6.3 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG Spielzüge Jeffrey Wolfe Abbildung 6.20 Interner Spielablauf beim Spielzug Bei einem Spielzug werden zwei verschiedene Aktionen vom Spieler durchgeführt, entweder er bewegt eine Figur oder er wischt über den Bildschirm zum würfeln. In beiden Fällen wird ein Event ausgelöst, dass an die GameView gesendet und von dort an den GestrueListener weitergereicht wird. Dort wird das Event ausgewertet. Wurde gewürfelt fordert der GestureListener den GameRenderer dazu auf zu Würfeln, dieser startet den Wurf im RendererDie in dem dort die Geschwindigkeiten gesetzt werden. Der GameRenderer rendert die Szene kontinuierlich und fordert den RendererDie regelmäßig auf sich zu aktualisieren. Der RendererDie rotiert daraufhin und gibt seine aktuelle Ausrichtung an den GameRenderer zurück. Die GameView zeichnet die Szene dann in der Androidoberfläche. Ist der Würfel ausgerollt wird das Ergebnis an die GameApp mitgeteilt. Wenn der Spieler eine Figur bewegt hat, gibt der GestureListener der GameApp das berührte Feld bekannt und es erfolgen Änderungen in Board. 81 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren 6.7. AUSBLICK IMPLEMENTIERUNG Wie bereits erwähnt wird ununterbrochen gerendert, dabei wird jedes mal der Aktuelle Zustand des Spielbrettes abgefragt und dann dargestellt. 6.7 Ausblick Implementierung Jeffrey Wolfe Die aktuelle Implementierung deckt zwar bereits die von uns gesetzten Mindestanforderungen ab, jedoch nur für Mensch ärgere dich nicht und nicht für die von uns definierten klassischen Brettspiele. Wir wollen in diesem Abschnitt ansatzweise darauf eingehen, wie wir bisher gedenken verschiedene Spiele zu ermöglichen. Ein Spielbrett ist bereits allgemein umgesetzt, bedarf aber wahrscheinlich noch Anpassungen. Ein allgemeines Regelsystem fehlt aber bisher noch gänzlich. Abbildung 6.21 82 Klassendiagramm Verallgemeinerung von Regeln Bachelorarbeit 6.7.1 Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren KAPITEL 6. IMPLEMENTIERUNG Rule Die Klasse Rule wird zu einem Oberinterface für MoveRule und StateRule, die ebenfalls Interfaces sind. Das Attribut active gibt an ob diese Regel beachtet werden soll oder nicht, dadurch soll die geplante variable Spielunterstützung möglich sein. watchedObjects Stellt eine Liste der Objekte dar, die zum Testen der Regel relevant sind. test() überprüft die Regel und liefert zurück, ob sie erfüllt wurde oder nicht. Wie und was getestet wird muss entsprechend in test() einprogrammiert werden. 6.7.1.1 StateRule StateRule stellt eine Abstraktion von Situationsregeln dar, zusätzlich zu den watchedObjects existiert eine Liste von beeinflussbaren Objekten, affectedObjects. Diese Objekte können verändert werden wenn apply aufgerufen wird, was genau dann geschieht hängt von den zu implementierenden konkreten Situationsregeln ab. 6.7.1.2 MoveRule MoveRule steht repräsentativ für eine Übergangsrelation und gehört daher zu dem Kanten Objekt Edge. 6.7.2 Edge Statt einer Liste von Folgefeldern sollen in einem Feld eine Reihe von Kanten stehen die in Edge umgesetzt werden. Jede Kante führt eine Liste von Übergangsrelationen. 83 Kapitel 7 Fazit und Ausblick 7.1 Was implementiert wurde Jeffrey Wolfe Wir fassen noch einmal kurz zusammen was bisher alles erreicht wurde: • Ein komplett spielbares Mensch ärgere Dich nicht Spiel auf dem Tablet • Erkennen von metallischen Spielfiguren • Virtueller Würfel, der auf Wischen auf dem Bildschirm reagiert • Spielen mit vier Personen • Spielen über das Internet • Netzwerkkommunikation mittels XMPP • Minimales, unflexibles Regelsystem das entferntes Spielen möglich macht • Aufnehmen von Benutzerfotos und Anzeigen dieser für lokale Spieler Somit haben wir die Anforderungen, die wir uns selber gesetzt haben erfüllt, und ein nettes extra Feature, die Spielerbilder. Jedoch sind noch Funktionen offen, die wir noch gerne umsetzen würden. 7.2 Ausblick Jeffrey Wolfe Da uns das Entwickeln von ANABEL viel Spaß bereitet hat und wir dabei auch ziemlich erfolgreich waren, besteht sehr viel Motivation die Arbeit fortzuführen und aus diesem Prototypen ein vollwertiges Produkt zu machen. Um dieses Ziel zu erreichen haben wir bereits sehr genaue Vorstellungen was wir umsetzen wollen. Regelsystem In der aktuellen Version sind die vorhandenen Regeln fest einprogrammiert und es werden auch nur, die für die Spielsynchronisation zwingend notwendigen, umgesetzt. Dies soll auf 85 Bachelorarbeit Spielfiguren 7.2. AUSBLICK Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen jeden Fall geändert werden. Das Regelsystem soll komplett verallgemeinert werden, so dass Regeln beliebig zugefügt, entfernt, an- bzw. ausgeschaltet oder ausgetauscht werden können und es somit möglich ist die Regeln mehrere Brettspiele zu unterstützen, also auch zu variieren wie sehr das Spiel automatisiert werden soll. Unterschiedliche Spiele Das Umsetzen des gerade erwähnten Regelsystems und das bereits allgemein gehaltene Spielbrett, wobei sicher noch Anpassungen erfolgen müssen, sollten es uns ermöglichen unterschiedliche Brettspiele zu realiseren, die nur einen Würfel und Spielfiguren erfordern. Import-Export Damit es möglichst simpel ist neue Spiele zuzufügen muss eine Option zum Importieren bzw. zum Exportieren von Brettspielen in einem eigenen Format implementiert werden. Umstieg auf eine OpenGL Engine Da es sich zwar als interessant und lehrreich, jedoch auch mühselig herausgestellt hat das Spiel ohne Hilfe einer Engine umzusetzen, soll die grafische Darstellung zukünftig mit einer OpenGL ES 2.0 Engine realisiert werden. Austausch der Spielerportraits Die Fotos der Spieler werden zwar erfolgreich gemacht und auch dargestellt, jedoch nur die von lokalen Spielern. Die Fotos sollen aber auf allen Tablets angezeigt werden, daher muss man sie übertragen. Sprachchat Eine sehr wichtige Funktion um den Sozialfaktor zu steigern stellt die Möglichkeit dar, dass man mit allen Spielern reden kann, auch mit denen die sich an einem anderen Ort befinden. Neben diesen für uns sehr wichtigen Features kommt noch das übliche Aufräumen und Optimieren des bereits vorhandenen Quelltextes. 86 Anhang A Appendix A.1 Literatur [1] Song Ho Ahn. OpenGL Transformation. 2012. url: http://www.songho.ca/opengl/gl_ transform.html. [2] Open Handset Alliance. [Online; Stand 18. Oktober 2012]. 2012. url: http : / / www . openhandsetalliance.com/oha_faq.html. [3] AppMATes. url: http://www.appmatestoys.com/. [4] Marcus Pant Arno Becker. Android 2 Grundlagen und Programmierung. dpunkt.verlag, 2010. [5] Julien Mercay Dadvid Phillip Oster. Multi-Touch Screen Recognition of Interactive Objects, and Application Thereof. 2012. url: http://www.freepatentsonline.com/y2012/0249430. html. [6] DICE+. url: http://dicepl.us/. [7] Annegret Liebers D. Wagner. Grundlagen: Begriffe zu Graphen. Sep. 1998. [8] ePawn. url: http://www.epawn.fr/. [9] XMPP Standards Foundation. url: http://xmpp.org/. [10] Khronos Group. About The Khronos Group. 2012. url: http://www.khronos.org/about. [11] [12] [13] Google Inc. url: http://developer.android.com/guide/topics/graphics/opengl.html. Google Inc. 2012. url: http://developer.android.com/. Google Inc. The AndroidManifest.xml File. 2012. url: http : / / developer . android . com / [14] guide/topics/manifest/manifest-intro.html. ipawn. url: http://jumbo-ipawn.nl/. [15] [16] [17] Learn OpenGL ES. 2012. url: http://www.learnopengles.com/. Simple. url: http://simple.sourceforge.net/. technologeeks. From Linux to Android: Android Internals for Linux Developers. url: http: //technologeeks.com/Courses/Android-Excerpt.pdf. 87 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren A.1. LITERATUR [18] et al. Uwe Laufs Micha Block. Multi-Touch Technologie, Hard-/Softwareund deren Anwendungsszenarien. Techn. Ber. Fraunhofer-Institut für Arbeitswirtschaft und Organisation [19] (IAO), Apr. 2010. Chris Velazco. Disney’s Appmates Turn The iPad Into An Interactive Playmat. url: http: [20] //techcrunch.com/2011/09/27/disneys- appmates- turn- the- ipad- into- an- interactiveplaymat/. volumique. url: http://volumique.com/v2/?lang=en. [21] [22] Wikipedia. Android (Betriebssystem) — Wikipedia, Die freie Enzyklopädie. [Online; Stand 17. Oktober 2012]. 2012. url: http : / / de . wikipedia . org / w / index . php ? title = Android _ (Betriebssystem)&oldid=109159458. Wikipedia. Dalvik (software) — Wikipedia, The Free Encyclopedia. [Online; accessed 22October-2012]. 2012. url: http://en.wikipedia.org/w/index.php?title=Dalvik_(software) [23] &oldid=518643789. Wikipedia. Extensible Markup Language — Wikipedia, Die freie Enzyklopädie. [Online; [24] Stand 20. Oktober 2012]. 2012. url: http : / / de . wikipedia . org / w / index . php ? title = Extensible_Markup_Language&oldid=109222777. Wikipedia. Extensible Messaging and Presence Protocol — Wikipedia, Die freie Enzyklopädie. [Online; Stand 20. Oktober 2012]. 2012. url: http://de.wikipedia.org/w/index.php? title=Extensible_Messaging_and_Presence_Protocol&oldid=109145282. [25] Wikipedia. Go (Spiel) — Wikipedia, Die freie Enzyklopädie. [Online; Stand 20. Oktober 2012]. 2012. url: http : / / de . wikipedia . org / w / index . php ? title = Go _ (Spiel ) &oldid = 107957445. [26] Wikipedia. Graph (Graphentheorie) — Wikipedia, Die freie Enzyklopädie. [Online; Stand 20. Oktober 2012]. 2012. url: http : / / de . wikipedia . org / w / index . php ? title = Graph _ [27] (Graphentheorie)&oldid=109308774. Wikipedia. Jingle (protocol) — Wikipedia, The Free Encyclopedia. [Online; accessed 20October-2012]. 2012. url: http://en.wikipedia.org/w/index.php?title=Jingle_(protocol) [28] &oldid=517746484. Wikipedia. Mensch ärgere Dich nicht — Wikipedia, Die freie Enzyklopädie. [Online; Stand [29] 20. Oktober 2012]. 2012. url: http://de.wikipedia.org/w/index.php?title=Mensch_%C3% A4rgere_Dich_nicht&oldid=108782402. Wikipedia. OpenGL — Wikipedia, Die freie Enzyklopädie. [Online; Stand 16. Oktober [30] 2012]. 2012. url: http://de.wikipedia.org/w/index.php?title=OpenGL&oldid=109134238. Wikipedia. Pachisi — Wikipedia, Die freie Enzyklopädie. [Online; Stand 20. Oktober 2012]. [31] 2012. url: http://de.wikipedia.org/w/index.php?title=Pachisi&oldid=106964297. Wikipedia. Shader (realtime, logical) — Wikipedia, The Free Encyclopedia. [Online; accessed 16-October-2012]. 2012. url: http://en.wikipedia.org/w/index.php?title=Shader_ (realtime,_logical)&oldid=489443928. 88 Bachelorarbeit [32] Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren Glossar Wikipedia. Touchscreen — Wikipedia, Die freie Enzyklopädie. [Online; Stand 20. Oktober 2012]. 2012. url: http : / / de . wikipedia . org / w / index . php ? title = Touchscreen & oldid = 109427759. A.2 Glossar Activities Komponente einer Android App die genau eine bestimmte Aufgabe erledigen soll S. 22 Android Betriebssystem und Software-Plattform S. 1 App Kurzform von Applikation, üblicherweise für Smartphones oder Tablets S. 1 Augmented Reality Erweiterte Realität, computergestützte Erweiterung der Realitätswahrnehmung S. 4 Dice+ Würfel dessen Wurfergebnis mittels Bluetooth ausgelesen werden kann S. 7 ePawn Augmented Reality Technologie für verschiedenartige Spiele S. 5 Layout Ein Layout in Android definiert, wie Komponenten in einer Android App angeordnet werden S. 22 Play Store Platform auf der man Apps, Musik, Bücher und Filme für Android Geräte kostenlos oder kostenpflichtig beziehen kann S. 22 Renderer Software die aus Objektinformationen eine Visuelle Darstellung berechnet S. 51 89 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren A.3. INSTALLATION Smartphone Ein Mobiltelefon mit Computer ähnlicher Funktionalität auf das man meist Apps installieren kann S. 5 Tablet Ein Flacher Computer mit Touchscreen S. 1 Touchscreen Berührungsempfindlicher Bildschirm S. 4 XML eine Sprache zur Darstellung von Daten in einer hirachi- schen Struktur S. 22 XMPP Extensible Messaging and Presence Protocol, ein auf XML aufbauendes Protokoll zum Echtzeit-Streaming S. 2 A.3 Installation Jeffrey Wolfe Abbildung A.1 QR Code 90 Bachelorarbeit Entwicklung einer netzwerkfähigen Brettspiele-App für Android Tablets mit realen Spielfiguren Glossar Um die App zu installieren muss man zunächst in den Einstellungen unter Sicherheit die Installation von unbekannter Herkunft erlauben. Einfach den QR-Code1 einscannen oder auf die Seite http://goo.gl/bDmXP gehen, runterladen und installieren. A.4 Arbeitsanteil an ANABEL Aufgabe Umsetzung Planung Saskia Müller und Jeffrey Wolfe Kommunikation Saskia Müller Verarbeitung von Gesten Jeffrey Wolfe Spiel Menus Saskia Müller Darstellung Spielansicht Jeffrey Wolfe Texturen Jeffrey Wolfe Fotos aufnehmen / bearbeiten Jeffrey Wolfe Spiel Logik Saskia Müller und Jeffrey Wolfe Tabelle A.1 1 Erstellt Aufgabenverteilung bei der Entwicklung von ANABEL auf http://goqr.me/de/ 91