インベーダーゲームを作ってみる(1)どんなゲームだったのか

picovaders.png

先日MFT2016で購入したArduboyですが、作ったゲームがブロック崩しの移植だけでは寂しいので、Arduboyをターゲットにしたインベーダーゲームを作ってみました。

もう一応完成していて、コードは以下のGitHubで公開しています。

boochow/picovaders

HTML5用のシミュレータはこちらです。(移動はカーソルキー←→、弾発射はCTRLキー)

picovaders.html

ここでは備忘録を兼ねて、中身の解説を書いておこうと思います。

まず「インベーダーゲームの分析」について情報収集しました。
ゲームそのものについては、Wikipediaや、作者の西角友宏氏のインタビュー記事が詳しいです。

スペースインベーダー・今明かす開発秘話――開発者・西角友宏氏、タイトー・和田洋一社長対談 – 日経トレンディネット

インベーダーゲーム開発秘話! – 週刊アスキー

スペースインベーダー – Wikipedia

Space Invaders – Wikipedia, the free encyclopedia

インベーダー発案

上の記事にもあるように、インベーダーゲームがブロック崩しから発想を得て作られた、というのは有名な話です。

しかし、実際には当時のハードウェアでたくさんのキャラクタを動かすのは大変です。
そのために行われたプログラミング上の工夫が、結果的にインベーダーゲームの独特の画面や、数々の裏技を作り出しているようです。

そのような、インベーダーゲームの実装が垣間見える情報は「2ちゃんねる」が参考になります。

■ 「インベーダー」をトコトン追及したい ■

ここにいろいろ書かれていることの中から、当時のプログラムを知るうえで参考になる情報を引用してみます。

・インベーダは、左下のヤツから1int(1/60秒)に1匹ずつ移動する。
 ゆえに、インベーダーが少なくなると移動が速まる。
・インベーダーの弾は3種類ある。画面上同時に存在するのはこの3つ。
 A.左右非対称にトゲが付いているもの
 B.左右対称にトゲが付いているもの
 C.波形のもの
 弾Aは、砲台に一番近い列から発射される。
 弾B・Cは、あらかじめ決まった列から順次発射される
・UFOは25秒おきに出現する。左右どちらから出るかは、自機のショット
 回数(奇数偶数)で決まる。インベーダーが7匹以下だと出ない。
・UFOの得点は、自機のショット回数で決まる。
 50 50 100 150 100 100 50 300 100 100 100 50 150 100 100 (以降ループ)
・UFOの出現中は、弾Cは発射されない。つまり、この時は同時に2発しか出ない。
・面クリアするごとにインベーダーの初期位置が下がるが、9面をクリア
 すると2面の配置に戻る。
・インベーダの消滅音は毎回微妙に異なる。これは基板上の発振回路のタイミング
 に依存しいるため。(希に2回鳴ることがあるのもこのせい)

インベーダーは、最初に出現したら、まず右方向に動きます。
これを間違えると、名古屋のときに、方向がおかしくなります。

最下段のインベーダーの最初の出現位置は、ビーム砲台から、

 1面 : -10段目
 2面 : -8段目
 3面 : -6段目
 4・5・6面 : -5段目
 7・8・9面 : -4段目

となります。

そうすれば、名古屋の際、4・5・6面は、
方向が逆になるのも再現されます。

敵の弾、相殺できるのとできないのがあるけど何か法則はあるの?

 当たり判定の順番の問題だったような。
 自弾移動ー>当たり判定ー>消滅  が先か
 敵弾移動ー>当たり判定ー>消滅  が先かという。

因みに、当たり判定は描画データをグラフィック画面とANDする事で
判定していますので、1ドット単位で正確です。

インベーダーは、下から上に向かって波打つように動きますが、一回の描画処理が1/60秒で終わるように、一度に1匹ずつ動かしていたのですね。
スタート時のインベーダーは全部で55匹ですから、1秒近くかけて全体を動かしていることになります。

1/60秒という制約があるのは、昔のブラウン管は電子線が画面を毎秒60回、左から右、上から下へスキャンすることによって描画しており、表示内容の変更は下まで行った電子線を上まで戻す間に行っていたからです。
今では、あまり実態のない制約だと思いますが、ゲームでは今でも1/60秒という周期を便利に使っているようです。
Arduboyも、画面更新速度(フレームレート)は最速で1/60秒ごととなっています。

コメント