Mittwoch, 24. Februar 2010

OinkiDoinki - Fang das Ziel durch Kippen und Neigen!


Kommen wir im dritten Teil der Serie über meine J2ME-Anwendungen zu meinem absoluten Liebling: OinkiDoinki ist ein Handyspiel, bei dem es darum geht, durch Kippen und Neigen das kleine Quadrat mit der Kugel zu treffen. Ist das gelungen, so taucht es an einer anderen Stelle wieder auf.
Features:
  • Durch Kippen und Neigen des Handys wird die Kugel bewegt!
  • Durch Drücken der Stern-Taste (*) können beliebig viele Kugeln hinzugefügt werden und auf der Raute-Taste (#) wieder stückweise gelöscht werden. Die Kugeln stoßen sich (näherungsweise) physikalisch korrekt ab.
  • Das Ziel-Kästchen kann auf 5 ausgeblendet werden.
  • Auf 0 werden die Vibration, die bei vielen Kugeln recht störend seien können, ansonsten aber wirklich klasse sind, deaktiviert werden.
  • Durch Schütteln ändert sich die Hintergrundfarbe, wobei das Quadrat die Komplementärfarbe des Hintergrunds annimmt.
  • Geheimtipp: Im Dunklen sieht eine oft wiederholte auf-und-ab-Bewegung ziemlich cool aus - fast wie ein Regenbogen ;-)

Obwohl mich das Spiel viel Zeit und Nerven gekostet hat (vor allem die Stöße von mehreren Kugeln), bin ich im Nachhinein froh diese investiert zu haben und bin richtig stolz darauf :-).


Da auch bei diesem Spiel wieder auf den Beschleunigungssensor des Handys zugegriffen wird, ist ein solcher zwingend erforderlich. Ebenfalls obligatorisch ist die Java-Platform 8 und speziell die Unterstützung des JSR 256 (Mobile Sensor API). Getestet wurde es mit einem der ersten Sony Ericsson Handys, das diese Bedingungen erfüllt, dem K850i. Außerdem getestet auf dem W980 und C902, mit neueren Geräten sollte es keine Probleme geben.
Wenn euer Handy diese Anforderungen erfüllt, könnt ihr euch die Spiel hier herunterladen und über Bluetooth oder USB auf das Gerät laden. Viel Spaß damit!

Bei Interesse veröffentliche ich auch gerne Ausschnitte des Java-Quellcodes.

Kleine Anmerkung noch zum Schluss: Um eines klarzustellen - ich habe das Spiel vor ca. 2 Jahren geschrieben, also noch bevor das Bedienkonzept Schütteln, Neigen, Kippen auf dem iPhone umgesetzt wurde... ich hätte es früher veröffentlichen sollen :-(
:D

Kommentare:

  1. Hiho. Bin zufällig auf deine Seite(n) aufmerksam geworden, weil ich ein K850i geschenkt bekommen habe, und als Programmierer natürlich den Anspruch habe, mit dem Teil mehr anzufangen als nur telefonieren und Fotos machen. :) Eigentlich war ich auf der Suche nach Tutorials oder Demoproggies für 3D-Programmierung (Im Lieferumfang ist ja dieses Rollercoaster Spielchen...), bin aber froh hier bei Dir gelandet zu sein. Ich wusste zwar, dass "moderne" Handys einen Beschleunigungssensor haben, hätte aber ehrlich gesagt nicht gedacht, dass dieser so genau ist, daß eine gaming-taugliche Steuerung implementiert werden kann, wie Du sie hier vorstellst.

    Ich möchte Dir hiermit mal ein dickes Lob aussprechen, vor allem weil ich nachvollziehen kann wie viel Arbeit in einem scheinbar so kleinen Spielchen wie OinkiDoinki steckt, erst recht wenn es zu Deinen ersten J2ME Anwendungen gehört!

    Es würde mich sehr freuen wenn Du Zeit findest, den angekündigten Blogartikel zu schreiben, und dort vielleicht etwas näher auf Details der Implementation eingehst.

    AntwortenLöschen
  2. Nach einigen Stunden Auseinandersetzung mit J2ME hat meine Begeisterung stark nachgelassen. In den Demos gibt es ein Projekt zur Benutzung des JSR265, mit einer Anwendung die Deiner recht stark ähnelt. Sensors heisst das Teil, macht fast genau das gleiche wie dein Proggi. Mit wenigen Ausnahmen, die innerhalb kürzester Zeit implementiert werden können. Zugegeben, das Projekt läuft nicht ohne Anpassungen auf dem k850i, aber das sind Kleinigkeiten. Geschätzter Zeitaufwand, um aus dem Demoprogramm Dein OinkiDoinki zu basteln: n paar Stunden oder weniger, je nach Vorkenntnissen.

    Wenn Du ohne Kenntnis der Tatsache, dass es lange schon gleichartiges gibt, dieses Projekt aus dem Boden gestampft hast: Respekt, hoffe Du hast nicht allzulange gebraucht um das Rad neu zu erfinden.

    Wenn Du das SDK Projekt bissel abgewandelt hast, und nun versuchst uns Deine Schöpfung als super tolle neue Idee zu verkaufen: Pfui.

    AntwortenLöschen
  3. Hallo Rob,
    erstmal Danke für dein Interesse und schön, dass du auf meinen Blog gestoßen bist - darf ich bei der Gelegenheit mal fragen wie?
    Ich kenne dieses Demoprogramm 'Sensors' und es ist sogar besser als mein OinkiDoinki, da sich die Kugeln nicht überschneiden. Zwar kann ich es nicht beweisen, da ich meine Programme erst jetzt und nicht schon vor ca. zwei Jahren veröffentlicht habe, aber OinkiDoinki ist ungefähr ein halbes Jahr - wenn nicht sogar mehr - älter als 'Sensors'. Vielleicht lässt du ja aber genau die Tatsache, dass OinkiDoinki schlechter ist und ich wohl kaum so dumm bin einen Programmcode zu kopieren, zu verschlechtern und als meinen eigenen zu veröffentlichen, zählen und glaubst mir, dass ich kein Heuchler bin.
    Wenn du mir noch nicht glaubst, schicke ich dir gerne den ganzen Code per Email. Dann kannst du dich selber davon überzeugen, dass SUN doch noch die besseren Programmierer hat als ich einer bin ;-)
    Hast du eigentlich 'Sensors' zum laufen gebracht? Ich erinnere mich, dass es damals Probleme auf dem K850i gab, im Emulator lief es allerdings. Ich glaube das lag an den Sensordaten, die im Emulator als double, auf dem Handy aber als integer zurückgegeben werden bzw. man danach fragen muss (getDoubleValues() vs. getIntValues()). Hab den korrigierten Code da, weiß aber nichtmehr was ich genau verändert habe. Bei Interesse schicke ich ihn dir auch gerne mal schnell rüber. Meine Implementierung für den Beschleunigungssensor entscheidet übrigens automatisch über den Datentyp und kann mit den verschiedenen Einheiten umgehen bzw. skalieren und bei Bedarf Mittelwerte mehrerer Messungen bestimmen. Diese kam allerdings bei OinkiDoinki noch nicht zum Einsatz, soweit ich weiß nur bei Gravitation und Mäxle. Über diese wollte ich eigentlich auch noch den Blogpost verfassen, wenn ich dafür Zeit finde (hoffentlich). Ansonsten schick ich dir auch so den Code.
    Was ist das eigentlich für ein Rollercoaster-Programm, das du erwähnt hast? Das war auf meinem nicht drauf.

    AntwortenLöschen
  4. Hi Dominique, also:

    - hab Deinen Blog über Google gefunden, als ich generell nach Programmierbeispielen für J2ME und speziell fürs K850i war, da ich selber so n Ding besitze. Mit den Suchbegriffen "j2me sony ericsson k850i programmierung" landet Dein Blog auf der ersten Seite, sogar auf Platz #9.

    - Wenn Du sagst, Dein Programm ist komplett selbst geschrieben, und sogar älter als "Sensors" habe ich keinen Grund das anzuzweifeln, und auf jeden Fall Respekt vor Deiner Leistung. Ausserdem finde ich es eigentlich deutlich cooler als Sensors, weil es mehr Features hat. Zum Beispiel, dass Du Vibration benutzt, wenn eine der Kugeln vom Rand abprallt. Und das Quadrat, das man treffen kann, macht das ganze sogar zu einem kleinen Spielchen, und nicht nur zu einer reinen Technikdemo. Ausserdem flexibler programmiert, weil man die Anzahl der Kugeln zur Laufzeit ändern kann. Bei Sensors sind die 5 an mehreren Stellen hart reincodiert, und nichtmal unter Verwendung einer Konstante, was meiner Ansicht nach schlechter Stil ist. Daß sich Deine Kugeln ab und zu überschneiden hab ich gar nicht gemerkt, aber ein kleiner Fehler in der Physiksimulation ist recht vernachlässigbar und wäre sicher nicht allzuschwer zu korrigieren.

    - Ja, ich hab Sensors zum Laufen gebracht. Es gab mehrere kleine Problemchen: Zum einen, wie Du richig bemerkt hast, die Sensordaten werden als int statt double zurückgegeben, das muss man an ein paar Stellen dann umschreiben. Auch die Erkennung des Accelerometers selber funktioniert mit dem Original Sourcecode komischerweise nicht. Ausserdem scheinen die Sensordaten das falsche Vorzeichen zu haben, musste erst alle mit -1 multiplizieren, damit die Kugeln auch in die erwartete Richtung rollen. Und nach all diesen Änderungen läuft Sensors zwar halbwegs wie erwartet, aber man muss das Handy recht stark kippen, damit die Kugeln gut ins Rollen kommen, und ich hab den Eindruck dass auch die Reibung bzw das Abbremsen der Kugeln nicht korrekt berechnet wird. In dieser Hinsicht funktioniert dein OinkiDoinki doch deutlich besser. Bin recht verwundert darüber, dass sich das K850i so komisch verhält, vielleicht ein Fehler in der Firmware.

    - Mein k850i ist Vodafone Brand, und statt des beliebten Marble Madness habe ich "Rollercoaster Rush 3d" drauf. Ist ne Achterbahn Simulation. Eigentlich Crap, aber hat recht flüssige 3D Grafik, daher trotzdem cool. :) Marble Madness ist zwar auch nett, vor allem weil es den Sensor benutzt. Aber dadurch, dass man viel zu wenig vom Spielfeld sieht, und durch gelegentliche Hänger bei der Kollision mit Wänden nicht gut spielbar.

    - Würde mich freuen wenn Du Zeit findest einen Artikel über die Entstehung Deiner Demoprogramme zu schreiben, mit Source Code Auszügen der wichtigen Stellen. Der wäre sicher auch für viele andere Programmierer interessant.

    AntwortenLöschen
  5. Ach, kleine Frage noch: Bei Gravitationsproggi ist mir aufgefallen, dass je nach Kipprichtung nicht der erwartete Wert von 9.81 m/s² rauskommt. Wenn ich es aufrecht hinstelle, bekomme ich annähernd den richtigen Wert, wenn ich es auf den Kopf stelle einen Wert >10 etc. Verhält sich das bei Dir auch so? Oder hast Du die Werte soweit skaliert, dass bei DEINEM Handy die Maximalwerte jeweils auf 9.81 skaliert werden?

    AntwortenLöschen
  6. Über Sourcecode zum Studieren und Experimentieren würde ich mich natürlich gewaltig freuen, da ich von J2ME bisher nur wenig Plan hab. Bin C++ Programmierer, und hab mich das letzte mal vor vielen Jahren ein wenig mit Java beschäftigt. Meine aktuelle email ist rheinrich73@googlemail.com

    Alternativ könntest Du die auch in deinem Blog zum Download anbieten, aber dann solltest du deutliche Copyright Hinweise beifügen, und Dir überlegen wie Du mit potentieller kommerzieller Verwendung deines "geistigen Eigentums" umgehen willst. :)

    AntwortenLöschen