17 |
インベーダーゲームのソースの研究 |
インベーダーゲームのソースの研究を読んで理解したことを記します。
敵弾速度
参考にしたcellvaderにおいて、敵弾の移動速度は1pixcel/tickでした(tick=1/60sec)。それで特に違和感がなかったのですが、上記資料を見ると、33%も速い4pixcel/3tickとのこと。そのため、3tick毎に4pixcel動かすように修正しますが、注意として衝突判定は1pixcel毎に行う必要があります。そうでないとすり抜けが起きる可能性があります。従って、
タイムフレーム0: 何もしない
タイムフレーム1: 何もしない
タイムフレーム2:
y-1の位置で衝突判定、衝突の場合は衝突処理し中断、非衝突の場合は下へ
y-2の位置で衝突判定、衝突の場合は衝突処理し中断、非衝突の場合は下へ
y-3の位置で衝突判定、衝突の場合は衝突処理し中断、非衝突の場合は下へ
y-4の位置で衝突判定、衝突の場合は衝突処理し中断、非衝突の場合は下へ
y-4の位置に敵弾移動
この3フレームを繰り返すことになります。さらに、インベーダ―数が8未満の場合は敵弾速度が高速化するとのことです。具体的には5pixcel/3tickとなります。従って以下のようになります。
タイムフレーム0: 何もしない
タイムフレーム1: 何もしない
タイムフレーム2:
y-1の位置で衝突判定、衝突の場合は衝突処理し中断、非衝突の場合は下へ
y-2の位置で衝突判定、衝突の場合は衝突処理し中断、非衝突の場合は下へ
y-3の位置で衝突判定、衝突の場合は衝突処理し中断、非衝突の場合は下へ
y-4の位置で衝突判定、衝突の場合は衝突処理し中断、非衝突の場合は下へ
y-5の位置で衝突判定、衝突の場合は衝突処理し中断、非衝突の場合は下へ
y-5の位置に敵弾移動
歩行音
フリートトーン(fleet tone)、もしくはステップサウンド(step sounds)と書かれていますが、インベーダーの歩行音のことです。同じく参考にしたcellvaderでは、歩行音の発生間隔は1tone/1fleetでした。つまり隊の動作と歩行音が同期しています。ただし、歩行音の発生毎に4種類の歩行音を切り替えます。
ところが、インベーダーゲームのソースの研究では、隊の移動と歩行音は同期しておらず、歩行音間隔の最小は5だとのことです。具体的な表を示せば、オリジナルのアルゴリズムは以下の表318.1のようになります。確かに、現状の実装ではインベーダー数が1になる場合は歩行音が速すぎる気がします。原文には5未満になると不愉快な音になると書かれています。
インベーダー数[匹] | 歩行音間隔[tick] |
---|---|
55 | 52 |
54 | 52 |
53 | 52 |
52 | 52 |
51 | 52 |
50 | 52 |
49 | 46 |
48 | 46 |
47 | 46 |
46 | 46 |
45 | 46 |
44 | 46 |
43 | 46 |
42 | 39 |
41 | 39 |
40 | 39 |
39 | 39 |
38 | 39 |
37 | 39 |
36 | 39 |
35 | 34 |
34 | 34 |
33 | 34 |
32 | 34 |
31 | 34 |
30 | 34 |
29 | 34 |
28 | 34 |
27 | 28 |
26 | 28 |
25 | 28 |
24 | 28 |
23 | 28 |
22 | 28 |
21 | 24 |
20 | 24 |
19 | 24 |
18 | 24 |
17 | 24 |
16 | 21 |
15 | 21 |
14 | 21 |
13 | 21 |
12 | 19 |
11 | 19 |
10 | 19 |
9 | 16 |
8 | 16 |
7 | 14 |
6 | 13 |
5 | 12 |
4 | 11 |
3 | 9 |
2 | 7 |
1 | 5 |
そのため、現状での隊(rack)の先頭での歩行音処理を廃止し、次の処理を追加予定です。
- 歩行音間隔タイマーを設置します。
- インベーダー1匹の処理につき、歩行音間隔タイマーを1だけデクリメントし、タイマーがゼロになったら歩行音を鳴らします。
- タイマーがゼロになったら、その時点のインベーダー数で上表を引き、歩行音間隔値をロードします。
インベーダーが減るたびに上表を引いて歩行音間隔値を変更するのではありません。それだとタイマーがゼロになる寸前でインベーダーが死ぬと新たなタイマー値がロードされ、歩行音間隔が約2倍の長さとなる不具合が起きる可能性があります。
歩行音が隊と同期はしていても不快な音にならないように、最小を5にするだけで良いような気もしますが。
⇒ブログ記事で実装完了しました。