17.09.2012
Heute will ich auf die Spiele selbst eingehen, die über das Client-Server-Modell gespielt werden können.
Im ersten Artikel hatte ich erwähnt, dass ich vermeiden will, jedes mal die App zu updaten, wenn es ein neues Einzelspiel gibt.
Dazu wollte ich einen OpenGL-Parser programmieren. Dies habe ich auch lange Zeit gemacht, was sehr aufwändig ist. Eine wirkliche Freiheit hat man dadurch aber nicht, da man stark eingeschränkt ist, was die Funktionen angeht (welche für den Parser implementiert wurden). Daher bin ich von diesem Gedanken weg gegangen und habe einen viel schöneren Weg gefunden.
In der Klasse, die als Game-Handler fungiert, erzeuge ich ein Objekt vom Typ Game.
Die Klasse Game ist eine abstrakte Klasse, die die Grundstruktur jedes Games festlegt und nützliche Funktionen dafür definiert (Farben umrechnen, Pseudozufallszahlen abrufen etc.).
Dieses Objekt vom Typ Game wird nun auf eine Instanz der jeweiligen abgeleiteten Spezial-Game-Klasse gesetzt.
Soweit sollte das alles im Rahmen der Vererbung nicht kompliziert sein.
Das wichtige ist nun aber, dass diese von Game abgeleiteten Klassen nicht in der .apk-Datei sein sollen, sondern einzeln auf der SD-Card abgelegt werden, sodass die App selbst nie geupdatet werden muss.
So habe ich es umgesetzt:
Beim App-Start werden alle verfügbaren Spiele abgerufen, wenn es neue Versionen von ihnen gibt, werden sie auf die SD-Card geladen.
Für das Schreiben auf die SD-Card muss in der Android-Manifest folgende Berechtigung definiert werden:
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
An den Pfad der SD-Card gelangt man wie folgt:
1 | Environment.getExternalStorageDirectory() |
Die Unterordner sind außerdem anzulegen:
1 2 | File sdDirectory = new File(path); sdDirectory.mkdirs(); |
Soweit zum Download-Prozess. Zum dynamischen Einbinden der Dateien habe ich mich für den DexClassLoader entschieden.
Ich will nun auf die Erzeugung der jar-Dateien und anschließend auf die Einbindung selbiger eingehen.
In Eclipse können die einzelnen Klassen (Ableitungen der Game-Klasse) per Rechtsklick als „JAR file“ exportiert werden, das ist nichts neues. Sie müssen nun aber noch für den DexClassLoader umgewandelt werden:
Im Android-Installationsverzeichnis findet man den Ordner „platform-tools“, in dem sich die Datei „dx.bat“ befindet.
Diese ist wie folgt aufzurufen:
1 | dx --dex --output=AUSGABE.jar EINGABE.jar |
Somit können die Dateien für den DexClassLoader erzeugt werden.
Diese können nun in der App selbst folgender Maßen geladen werden:
1 2 3 4 | DexClassLoader classLoader = new DexClassLoader(jarFile, outputTmpPath, null, getClass().getClassLoader()); Class gameClass = classLoader.loadClass(className); game = (Game) gameClass.newInstance(); |
Somit ist das Objekt der externen Klasse erzeugt und es kann ganz normal damit weiter gearbeitet werden.
Hier geht es weiter zu Teil 5, den Zufallsberechnungen
Kategorie: News, Programmierung |
Schlagwörter: android, client-server, java, opengl, spiel