[アクション]敵を出現させよう


へっくしゅ!
はぁー,最近夜寒くなってきた・・・

・・・で,今回考えてみたのはアクションゲームでの敵の出現方法.
前に考えたのは,シューティングでの敵の出現でした.

それでどこが違うかっていうと,シューティングでは完全に時間(フレーム数)で管理してました.
「この面が始まってから,何フレーム後にこの敵が出現する!」って感じで・・・
でも,アクションだとそうはいかないっすね.
やっぱりアクションでは,「時間」ではなく「出現位置」で定義しとかないとだめそうです.
ふ〜む.


画面がスクロールするってのは ワールドに対して,(ウインドウに)表示される部分が移動するってことで, この表示される部分の左上座標を(ViewX,ViewY)としています. とりあえず,こんな敵出現テーブルを考えてみました.
struct EnemyTable
{
    int x ;         // 敵の出現X座標
    int y ;         // 敵の出現Y座標
    int type ;      // 敵の種類
};

EnemyTable  table[ 200 ];   // 敵の最大出現数は200匹?
そして,毎フレーム(あるいは数フレーム置き)に table[].x,table[].y を調べて, 画面内に出現する敵だったら table[].type で指定された種類の敵を発生させる,
という感じ.

うわー,ふつー.
何にも工夫されてねぇ・・・

それに,EnemyTable には「出現済み」見たいなフラグも必要ね.
これが無いと,敵が出まくります.

もうちょっと詳しく言うと敵が出現する条件は,
・「出現済み」でない
・table[].x が ViewX 〜(ViewX+ウインドウ幅)内の値である
・table[].y が ViewY 〜 (ViewY+ウインドウ高) 内の値である
を満たすヤツってことになりますな.

うーん,やっぱりtableの頭から検索していくのは無駄っぽい.
もし,横スクロールがメインのゲームだったら,敵のデータを X方向 だけでもソーティングしてあったら, 次回の検索もその近くからはじめればいいんじゃないかなー.(ワープとかしなければね)

例えば,こんな感じでXが昇順にソーティングされた敵のデータがあったとすると
X       Y      TYPE
-------------------
1       1       0
1       8       0
1       16      0
1       24      0    
8       1       0
8       8       0
8       16      0   
8       24      0
12      1       0   ←今回の検索開始位置
16      8       0
16      16      0
16      24      0
24      1       0
24      8       0
次のフレームも「今回の検索開始位置」の前後から開始すればいいはず.

さーて,これをプログラムにしてみようかな.

あっ! 教授様が来た! やばい!研究してるフリしないと!!

というわけで,次回に続きます・・・



< Back to Diary.