2011年8月1日月曜日

とりあえずゲーム作り(4)

やられた!小学生の息子にプレイさせてみたら、すぐに必勝パターンを作られてしまいましたw


右方向への速度が3,000を超えているのに注目。開始と同時に右に加速させ、速度が画面解像度以上になったら無敵モード発動。あとは操作しなくても、どんどんスコアが上昇していくだけなのでした。

とりあえずonTouchEvent()にコードを足し、最大速度を50に抑えることで対応。いやぁ、テストプレイは重要ですなぁ…

d_dx = d_dx < -50 ? -50 : d_dx > 50 ? 50 : d_dx;
d_dy = d_dy < -50 ? -50 : d_dy > 50 ? 50 : d_dy;

さて気をとりなおして、パッケージやクラス分けをすこしまともに修正します。

そしてそろそろ気にしなくてはいけないのが、Activityの状態遷移のあたり。アクションゲームなので比較的ルーズで良いとは思うのですが、今後のこともあるので理解は必要かな、と。

ざっと見ていて、やはり判りやすかったのは英語ですが ReferenceのActivityページ ですね。適当訳をメモしておきます。

まず大きな括りとして、onCreate(Bundle)からonDestroy()までの entire lifetime がある。Global stateはここで設定される。例えばバックグラウンドで動作するThreadはonCreate()で生成され、onDestroy()で停止されなければならない。

より小さな括りとして、onStart()からonStop()までの visible lifetime がある。この期間の間、ユーザーはActivityを画面で見ることができる。たとえ画面の前面に出てきておらず、ユーザーが直接操作できる状態でなくても、この状態に含まれる。

この期間の間、ユーザーにActivityを見せるのに必要なリソースは保持されていなければならない。例えばUIへの影響をモニターするためのBroadcastReceiverはonStart()で登録され、onStop()で解除されるべきである。onStart()とonStop()メソッドは、Activityが表示されたり隠されたりするたび、何度も繰り返し呼ばれることがある。

そして最も小さな括りとして、onResume()からonPause()までの foreground lifetime がある。この期間の間、Acticityは前面に出てきており操作可能である。例えばActivityはデバイスがスリープに入るなど、resumedとpausedのステータスは頻繁に入れ替わるため、これらに重い処理を記述するのはお勧めできない。

とまあ、こんな感じ?

個人的にはvisible lifetimeとforeground lifetimeの区別がいまいち判り難いんですが、これは対象デバイスによって大きく変わりそうなので、あえて曖昧な定義にしているのかも。

onStop()とonDestory()がKill可能とあるので、まぁ、onStop()は呼ばれることは保証されている?デバイスがフリーズしたなどの問題がなければonStop()でデータを永続化できれば良いのかな?

他の資料でもonStop()でisFinishing()見てデータ保存しなさい、とかあった気がします。

って訳で、とりあえずonCreate(),onDestroy(),onStop()の3つをおさえておけば、とりあえずは大丈夫なのかなぁ、って感じ?ただし今回はアクションゲームなので場合はonResume()/onPause()でゲーム(スレッド)を止めてあげる必要はあるかも。

さーて、お勉強は終わり。手を動かしちゃいましょう~

と言いつつ、夏休み期間ということもあり、最近は土日の体力消費が激しくて作業が進んでおりません。太陽の下でプールなど入ると、どうしてあんなに疲れるのでしょうね…

なので今回は、隕石用の仮画像でも作成して、お茶を濁してみます。息子の机に転がっていた謎の石をデジカメで撮影してみました。こんな感じ。


さて次回は、コードごっそり書き換えたものをご紹介します。

0 件のコメント:

コメントを投稿