前回までのあらすじ:ついに残像を断ち切り、白くこざっぱりした画面で動けるようになった主人公。そんな我々の前には嵐の前の異様な静けさが広がっていた。
8.敵キャラ登場
さて、敵キャラを作る段階になったわけですが、ある意味マイキャラより厄介だったりします。
今回作る敵キャラの設定は大まかに次のようになっています。
- マイキャラを追いかける。
- 最初は1匹だけいる。
- 10秒ごとに1匹増える。
- 最大50匹出る。
- とげとげ。
最初のマイキャラを追いかけるというのは、マイキャラが右にいたら右に向かうというプログラムでいけそうですが、2~4の、敵キャラの数が1~50の範囲で変化するというのはいかにも厄介そうです。
こういうときは、敵の数は最大の50匹に固定しておいて、動くのを1匹から順に増やしていくことにします。
例えば、最初の1匹のときは、とげとげ1号だけを動かして、2~50号までは画面外で待機させておきます。
とりあえずとげとげを50匹用意しましょう。
'敵キャラ約50匹 Type EnemyData X As Long Y As Long End Type Const ENEMYMAX = 50 Dim Enemy[ENEMYMAX] As EnemyData Dim EnemyNumber As Long
また後で数を50匹から増やすかもしれないし、例によって別の用途の50という数字が出てくるかもしれないので敵の最大数も定数として設定しておきます。
ちなみに、本当はこれで用意したのは1~50号の50匹ではなく、0~50号の51匹なのですが、今回は0号は無視するので気にしないことにします。
今度は敵キャラの移動。
For文を使って1号からEnemyNumber号までを動かします。
Function EnemyMove() '敵キャラ動かす Dim n As Long '1号からEnemyNumber号までを動かすのだ! For n = 1 To EnemyNumber 'とげとげn号を動かすのだ! If Enemy[n].X < MyCharaX Then 'マイキャラが右にいたら Enemy[n].X = Enemy[n].X + 1 '右に1ドット移動 End If '以上 If Enemy[n].X > MyCharaX Then 'マイキャラが左にいたら Enemy[n].X = Enemy[n].X - 1 '左に1ドット移動 End If '以上 If Enemy[n].Y > MyCharaY Then 'マイキャラが上にいたら Enemy[n].Y = Enemy[n].Y - 1 '上に1ドット移動 End If '以上 If Enemy[n].Y < MyCharaY Then 'マイキャラが下にいたら Enemy[n].Y = Enemy[n].Y + 1 '下に1ドット移動 End If '以上 Next End Function
あー今度は描画。四角でいいでしょ。なんかもう、ここまでくると勢いだけで進んでる感じ。
Function PaintEnemy() '敵キャラ描画 Dim n As Long Dim hDC As DWord hDC = GetDC(hMainWnd) '1号からEnemyNumber号までを描くのだ! For n = 1 To EnemyNumber 'とげとげn号を描くのだ! Rectangle(hDC, Enemy[n].X-16, Enemy[n].Y-16, Enemy[n].X+16, Enemy[n].Y+16) Next ReleaseDC(hMainWnd, hDC) End Function
最初にいる場所が決まってない!決めるのだ!APIのrandとsrandを組み合わせるのだ!GameInitで決めるのだ!
Function GameInit() '初期化 '平たく言えばゲームを始める準備だ srand(GetTickCount()) '乱数を使う準備 Dim n As Long Dim r As Long '敵キャラのことをいろいろ決めるのだ! For n = 1 To ENEMYMAX r = rand() Mod 4 '0~3の乱数がもらえるらしい If r = 0 Then '0だったら上から出てくる Enemy[n].X = rand() Mod GAMEWIDTH Enemy[n].Y = -16 End If If r = 1 Then '1だったら上から出てくる Enemy[n].X = rand() Mod GAMEWIDTH Enemy[n].Y = GAMEHEIGHT+16 End If If r = 2 Then '2だったら左から出てくる Enemy[n].X = -16 Enemy[n].Y = rand() Mod GAMEHEIGHT End If If r = 3 Then '3だったら右から出てくる Enemy[n].X = GAMEWIDTH+16 Enemy[n].Y = rand() Mod GAMEHEIGHT End If Next EnemyNumber = 1 End Function
ついでに敵の数もちゃんと1にしておいた。俺ってActiveBasicに比べて気が利k(ry
そろそろゲームに見えないこともないわけではなくなってきました。・・・・あれ?どっちだ?