2013年3月6日水曜日

Android Parcelable の実装でつまづいたときのメモ

Android の Parcelable の実装でつまづいたので、メモ。

画面が回転したときに表示していた内容が消えてしまわないよう、独自オブジェクトで Parcelable インタフェースを実装し、
  • Activity#onSaveInstanceState(Bundle) で Bundle#putParcelable で書き出す
  • Activity#onRestoreInstanceState(Bundle) で Bundle#getParcelable で読み込む
という処理を行っていました。

つまづいたのは以下の2箇所です。
  1. Parcelable を実装したクラスに CREATOR フィールドを持たせていなかった。
  2. Parcel からのString配列読み込みに Parcel#readStringArray(String[]) を使っていた。

1つ目は、単に、決まりごとを守れていなかったっていうだけでした。
例外はこんな感じです。
android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class ...

http://developer.android.com/reference/android/os/Parcelable.html
には Parcelable を実装したクラスには CREATOR フィールドを持たせろと書いてありましたが、知らなかったので書いていませんでした。書かなくてもコンパイルは通るし、画面回転では問題が起きず、特定の機種でのみ他のアプリ呼出し後に問題が起きる(メモリの状態によって Activity#onRestoreInstanceState が呼ばれたり呼ばれなかったりするためか?)といった感じだったので、問題に気付くのに遅れました。

2つ目は、Parcelable を実装したオブジェクトで空の配列を扱う可能性がある場合は気をつけなければいけないところみたいですね。 例外は、Parcel#readStringArray(String[]) を実行したときの NullPointerException です。ここのページを見て知りましたが、readStringArray では配列が空の場合に例外がスローされてしまうようです。そのため、代わりに createStringArray というのを使うことで解決。String 以外の配列も同様だと思います。

でも
http://developer.android.com/reference/android/os/Parcel.html
を見ても、そんなことは書かれていないような…。

2013年2月26日火曜日

Androidゲームにネットランキング機能を実装したい

Androidゲームを作っていくにあたって、少し考えないといけないなーと思ったのがネットランキング機能です。「あなたの順位は世界中のプレイヤーの中で○○番です」みたいな。やっぱ無いよりはあったほうが張り合いも出るしいいですよね。

ということで、まずは無料で使えるサービスとかないかなーとか思って探したところ、Swarm とかいうのがけっこう使われているようです。ただ、単なるランキング機能だけでなく achievement 機能とかもあったりと小物ゲームにはちょっと大掛かりかなーというのと、遊ぶ側としてもログインとかあるとめんどいなーと個人的には思ってしまいます。

じゃあランキング機能は自分で用意しよう、と思って、何をどうしようか検討中です。
何か進んだらここに書いてみたいと思います。


さて、機能を載せるためのアプリだけ、先に作ってみました。

「ずっとピヨピヨ」。
画面にさわっている間、ひよこが鳴き続けるというだけのアプリです。
鳴いた回数をランキングとして実装してみたいと思います。


↓ダウンロードはこちら。(一応・・・)
Android app on Google Play

2013年2月16日土曜日

Androidゲーム「超鋭角」を公開しました。

2本目のAndroidゲームを公開しました。
「超鋭角」といいます。
短時間でできるシンプルなゲームです。

画面に表示されている線に対し、超鋭角になるように線を引きます。
交差する点までの距離が長い程、高得点になります。

タイトル画面。

2013年2月10日日曜日