85DATA HOMEへ
MYCAR情報掲示板BLOGプロフィール

HOME → ソフトウェア → ゼビウスを作る!

「ゼビウスを作る!」 その1 マップデータ&マップチップの整備

当然の事ながら、マップの整備が必要です。
これが、無いと始まりません。

調べてみると、ゼビウスは横1024×縦2048ドットのマップの一部分をスクロールさせている模様です。
マップチップは8×8ドットですから、横128桁×縦256行 (桁・行の表現はおかしい?)
1エリア毎では、横28桁×256行です。画面表示は横28桁×36行になります。

さて、この広大なマップをどうやって作成するのか!
(広大な・・と言っても、たかが200万画素にすぎませんね)

これを一から作る(しかも寸分違わずとなると)何年かけても作れる自信がありません。
横1024×縦2048ドットのマップの画像データは入手できますので、これを利用します。


利用するとしても、この画像データからマップデータとマップチップを生成する必要があります。
※現代のPCならば、この画像を全てメモリに読み込み、その一部を画面表示させる手法を使えば実現可能かもしれませんが、マップデータ&マップチップの対応にします。
(する必要があります。理由は後程書きます)


なので「画像ファイルからマップチップ作成をする為の変換プログラム」を作りました。

@このマップ画像を、32768個の画像データに分割します
    (32768個=横128桁×縦256行)
A左上の画像ファイルをNo1画像とし、以降32767個と一致する画像があるかを探索します。
B一致した箇所はNo1と記録していきます。
C次の画像No2とし(AB)同様に一致する画像があるかを探索します
    (3個目〜32768個目の32766個の画像)
D今までに一致した画像はスキップします。
これを繰り返します。

この画像比較回数は(スキップも含めると) 32768 + 32767 + 32766 + 32765 + ・・・・・ + 1
(1 + 2 + 3 + ・・・ + 10 = 55 の計算と同じですね)

すると、(32768÷2)×(32768+1) = 536,854,528回の画像比較 (5億3千万回!!)

No1の画像比較(Aの処理)を行うだけで、約53秒程度かかりました。1秒につき約618個の画像比較を処理した事になります

5億3千万÷618/秒 = 868696秒 = 14478分 = 241時間 = 10日1時間
「何と!!  10日!!」

しかし、この計算は全く一致する(スキップする)画像が無かった場合です。
画像一致が無いはずはありませんので、探索すればする程(一致する箇所が増えるので)スキップする機会が増えます。

そんな訳で、どの程度の時間で処理が完了するのかは、全く想像出来ません。

「でも、1時間もかければ終わるかな」なんて思っていました。
(※探索する順番は大きく影響すると思います。多く存在しそうな画像を最初の方に並び替えました)

・・・で、実際にやってみました。どの程度の時間で処理が完了するのでしょうか?


1個目の画像とそれ以降の32768個の画像を比較して同じだったら、No1画像として記録します。  (前述Aの処理中です)
(画面は一致した場所に色を付けていくようにします・・・・どこまで処理したのかが見て分かるようにです
1個目の終了は約53秒でした。

 

2個目の画像比較になりました。2個目の終了は開始から約1分35秒でした。
2個目の処理時間は、42秒(1分35秒 - 53秒)で終わった事になります。
処理スキップの効果が少し出てますね。
(同様に一致した場所に色を付けますが、前の色とは異なる色を付けていきます。あくまでも目視確認の為です)

 

5個目の画像比較が終了しました。開始から3分14秒が経過
3〜5個目の3個の処理で、99秒ですから1処理平均33秒

 

開始から4分経過
まだ、22個目の画像比較を処理中
しかし、1処理平均2.4秒になっています。大分処理が早くなっています。
・・・でも、まだ22個目です。32767個にはまだまだです。

 

開始から5分経過
一気に1025個まで処理が進みました。右側の白色は処理が済んだ個数を示しています。
この白色が一番下までくれば、全ての処理が完了です。
1処理平均は、0.059秒にまで向上しています。

 

開始から6分経過
処理数は1763個 1処理平均は0.029秒。処理速度がバンバン加速していきます。
(処理速度が加速と言うか、単にスキップ処理が増えているだけですが・・・・)

 

開始から7分経過
処理数は8491個 1処理平均は0.0093秒。

 

開始から8分経過
処理数は11282個 1処理平均は0.0124秒。少しだけ遅くなりました。

 

開始から8分30秒経過
処理数は16642個 1処理平均は0.0025秒。

 

開始から8分41秒で処理終了しました。
32767個全てが完了!
なんとラスト11秒で、20927個の処理を終えました。
(処理を終えたと言うよりも殆どがスキップされたのでしょう)
1処理平均は0.000525秒。

最初の数個の画像を探索するのは時間が掛かりますが、どんどん処理速度が加速していきました。

結果的には9分弱で完了しました。
これで、一番の懸案事項であったマップデータの準備は完了です。

以下が生成されたマップチップです。8×8ドットのチップが696個にもなりました。
ちなみに、自作シューティングのマップチップは、以下のモノでたったの46個しかありません・・・・・

クリックすると別ウィンドウで拡大


↓恥ずかしながら自作シューティングExplosion2のマップチップ・・・・うーん貧弱です。

クリックすると別ウィンドウで拡大

マップチップとマップデータは出来ましたので、少なくともスクロール背景はホンモノそっくりにはなりそうです。