Androidでアクトレーザー:其ノ壱

=前置き=

 Androidでも色々なゲームを作りたいので、まずはすでにFlashで作ったことがあり構造自体は簡単な「アクトレーザー」をAndroidで作ってみることにした。ということで、そのログをとることにする。

 ドット絵エディタも再開したいんだけど、夏期休暇が終わってしまったのですぐには使わなそうだから後半に回すことにした。

=想定=

 「十字キーで移動」「SPACEキーでレーザー化」という操作そのままだとAndroidで作るのは面倒だしAndroidっぽくもないので、「斜めボタンにタッチしてる間はその方向にレーザー化して反射する」という挙動にすることにした。「ボタンすら廃止して、タッチした方に移動・反射する」というのも考えたものの、プログラム側が面倒になるわりにあまりゲーム的に面白くなりそうにはなかったので、斜めボタンだけの単純なインターフェースにすることにした。


 ただし、元のアクトレーザーをやってもらえばわかるとおり、地上に居る時は「右下」への移動はすぐに反射されて「右上」と同じ軌跡になってしまう。そこで、通常時は本体に厚みを持たせる(1ドットではなく球体にする)ことで「右下」と「右上」の軌跡を変えることにした。レーザー中は1ドットになるため、レーザーから戻ると本体が地形にめり込む場合があるが、地形にめり込む場合はレーザーの解除を遅延することで解決してみる。

=セッティング=

 だいぶ久々なのでセッティングから思い出してみる。ということで、再び以下の本を読みながら進める。


 まずはEclipseを起動してアクトレーザー用のプロジェクトを作る。「File→New→Project」から「AndroidAndroid Project」を選択。Project nameは「ActLaser」にしてBuild Targetは「Android 2.1 -update1」にした。Package nameは"自分>ゲーム>ActLaser"ということで「showohealer.game.actlaser」に設定。Create ActivityはActicityがメイン一つだけになりそうなので「Main」とした。あとはBuild Targetに合わせてMin SDK Versionを「7」にしてプロジェクト作成完了。
 Build Targetに関してはわりと何でも良かったものの、「できるだけ低くしてどのAndroidケータイでも遊べるようにしたい」というのと「2.1以降ではあマルチタッチが使える」という点で2.1にしてみた。アクトレーザー自体はマルチタッチはほぼ使わないと思うけど。


 あとはAndroidケータイをUSBでPCにつなぎ、Android側を適当に外部メモリとして接続し、Eclipseのプロジェクトを「Run as → Android Application」で実行しいてちゃんと画面が表示されるのを確認した。
 電源を完全オフにしたりしてたものの、ちゃんと設定の「USBデバッグ」は有効になったままだった。


 ここまでで基本的なセッティングは完了。あとはコードを書いて実際にゲームを作っていく。その前に少し休憩しよう。

=ゲーム:基礎の基礎部分=

 まずは表示部分の準備。これはドット絵エディタのドット絵表示部分のコードをコピペして用意し、あとはレイアウトをいじって実際に表示するだけで完了。
 ただ、Bitmapにはサイズの制限があるのか、あるいはメモリが足りないのかは不明なものの、とにかく大きいBitmapを作ると起動直後にエラーで落ちてしまう。1ブロックを32x32で描き、それを100x100で敷き詰めるとFlashの時は十分な大きさだったものの、Bitmapのサイズは10MBになってしまう。アクトレーザーはレーザー用に同じ大きさのBitmapをもう一つ用意するので、合計すると20MB。これだとAndroidでやるには大きすぎるらしい。
 ということで、ブロックの大きさは32x32のままでステージの大きさを50x50にした。ドット絵の感じを強調してブロックの大きさを16x16にすることもできるかもしれないが、それは実際にステージやグラフィックの対応をする時に考えたい。


 次に、横持ちで遊ぶため、最初から表示を横にしつつ本体の回転で「縦持ち用<=>横持ち用」の切り替えが実行されないようにする。また、タイトルバーなどが邪魔なので消したい。これはhttp://labs.techfirm.co.jp/android/m_yamada/566を参考にAndroidManifest.xmlを書き換えるだけ。

=ゲーム:アクション部分=

 AS3(Flash)の時と同様、配列でステージの構成を指定するように対応。これはAS3の場合とほとんど変わらず。 ただ、Javaだとenumが使えるので、データの設定が少しだけ楽になった。enumでWやOなどと宣言し、その二重配列でステージ構成を指定できる。ただし、そのままだと「Hoge.W」という風に宣言しなければならずHogeの部分が邪魔なので、import staticでそれを省けるようにした。詳しくはJava列挙型メモ(Hishidama's Java enum Memo)あたりを参照。自分自身をimportしているかのように見えるので、これが正しい使い方なのかは不安だけど、ひとまず動いてるのでこれで良し。


 「毎フレーム実行する処理」をどう扱うかはまだ悩み中。今のところ「描画のところでついでに行う」という方向で進め中。そのままだとonDrawは一回しか呼ばれないので、onDrawの終わりにinvalidateを呼ぶことで次のフレームも再描画を行うようにしている。