ブロック崩しを行うプログラム。
このプログラムのビルドにはOMakeとArm向けのGCCが必要です。 OMakeなどをインストールした環境で次のようにします。
$ git clone https://github.com/coins11/gba.git
$ cd gba
$ omake md.mb
まず、プログラムを読み込むと"Press START"と表示されスタート待ちの状態になる。 この状態から
START
ボタンを押すSTART
+SELECT
ボタンを押す
ことでゲームが開始される。 このどちらで開始してもラケットの使い方は次のようになる。
- 十字キーの右
- ラケットを右へ動かす(等速運動)
- 十字キーの左
- ラケットを左へ動かす(等速運動)
R
ボタン- ラケットを右へ動かす(等加速度運動)
L
ボタン- ラケットを左へ動かす(等加速度運動)
A
+B
ボタン- ゲームをリセットする
START
ボタンのみでゲームを始めた場合、単純なブロック崩しとなる。
ボールが地面に接触したら失敗、全てのブロックを殲滅したらクリアとなる。
START
+ SELECT
でゲームを始めた場合、ブロックが等速運動をするようになる。
移動するブロックにラケットが接触してもブロックは消滅するが、代償としてラケットの長さが短くなる。
また、ラケットが何回かブロックに接触してラケットの長さが0になると失敗となる。
失敗した場合や成功した場合、START
ボタンを押すことでリスタート出来る。
このプログラムは多くの物体との接触判定をしているので、総当たりを行なうとあまりにも時間がかかってしまう。 そこで、空間を16×16への小空間へ分割して、同じ空間に所属する物体をリストにまとめてから接触判定を行っている。
講義資料で紹介されているタイマ間隔は1024クロックであったが、これではオーバーフローするまでに4秒もかかってしまう。
これであると、例えば時間T
で終って欲しいものがT
で終わらなかった時に、一旦オーバーフローするまでプログラムが停止してしまって、
処理落ち時間が長くなる。
なので、64クロック間隔にして最悪処理落ちしても0.25秒程度で済むようにした。
物体オブジェクトは、
- 他の物体と接触した時
- 移動した時
- 移動に失敗した時
に発火するコールバック関数を登録出来るようにしておいた。 これによって、例えば
- ボールが地面に落ちるとゲームが終了する
- ラケットにブロックが接触するとラケットが縮む
といった処理が容易に追加出来るようになった。