敵クラスの作成2
実際に敵を表示してみましょう。
メイン画面(F_Main)のコードを表示してください。
ここでは敵クラスを配列に格納し、複数の敵を作成します。
そこで敵を格納する配列の定義と、その他変数を定義します。
メイン画面(F_Main)の先頭に定義します。
Private _rnd As New System.Random ' ランダム変数
Private _enemies As New ArrayList() ' 複数の敵を格納する変数
メイン画面(F_Main)のスタートボタン(B_Start)のクリックイベントを定義します。
クリックイベントに以下をコーディングしましょう。
配列に敵クラスを格納する理由は、次以降でランダムに動かしたりするために使いやすいようにです。
' スタートボタンクリック
Private Sub B_Start_Click(sender As Object, e As EventArgs) Handles B_Start.Click
' スタートボタンを使えなくする
B_Start.Enabled = False
' 敵の作成
Dim i As Integer
' 敵を10体生成します
For i = 0 To 9
' 配列に敵クラスを生成します。その際にオーナーのパネルとランダム変数を渡します。
_enemies.Add(New CEnemy(Me.P_Enemy, _rnd))
' ループの中でDoEventsを呼んでおく
System.Windows.Forms.Application.DoEvents()
Next
End Sub
ここで以下のプロジェクトのフォルダに敵画像を配置します。(exeファイルと同じ階層におきます)
プロジェクトがC:\ClickBusterであれば以下の場所に画像を配置します。
C:\ClickBuster\ClickBuster\bin\Debug
敵画像は以下です。右クリックで画像を保存してください。
敵画像1
画像2
画像3
敵クラスの「_RandPlace」の実装で画像を指定しました。
得点はそれぞれ3000、1000、500と設定しましたので、大きい画像・中くらいの画像・小さい画像にしました。
それではアプリケーションを実行してみましょう。
初級ボタンをクリックし、スタートボタンをクリックすると敵が10体、ランダムな画像で、
ランダムな場所に出現したと思います。(画像が10体ない場合は大きい画像の後ろに隠れています)
一度メイン画面を閉じて、再度、初級ボタン→スタートボタンでまた違う場所に表示されると思います。
やっと半分くらい実装できました。
次に敵をランダムに動かす処理を実装していきます。
敵クラスの実装2
敵クラスをもう少し実装しましょう。CEnemyクラス(Class1.vb)を開きます。
敵をランダムに動かすメソッドを実装します。
メイン画面側では、ある一定間隔で次のメソッドを実行し、敵を動かします。
つまり呼ばれる度に、今いる位置より一歩移動します。
まず骨組みを作りましょう。
Case 1, 2, 3 はそれぞれenemy1、enemy2、enemy3の動きになります。
' 動きを見せる(オーナーの中での動き)
Public Sub MvEnm()
Select Case _intMovePattern
Case 1
Case 2
Case 3
End Select
End Sub
動きのプログラミングは少し難しいかもしれませんが、一つずつ確認しましょう。
enemy1
まずはenemy1の動きを実装してみましょう。Case 1の中に記述します。
'--------------------
' enemy1
' 完全ランダムな動き
'--------------------
' 移動先をランダムに決めます
Dim intMv As Integer = _rnd.Next(1, 5)
' 一歩移動(オーナーの範囲をはみ出しそうになったら現状維持)
Select Case intMv
Case 1 '下
If (_pbImgEnemy.Top + _pbImgEnemy.Height + _intMvwd) < (_enemyOwner.height) Then
_pbImgEnemy.Top += _intMvwd
End If
Case 2 '上
If (_pbImgEnemy.Top - _intMvwd) > 0 Then
_pbImgEnemy.Top -= _intMvwd
End If
Case 3 '右
If (_pbImgEnemy.Left + _pbImgEnemy.Width + _intMvwd) < (_enemyOwner.Width) Then
_pbImgEnemy.Left += _intMvwd
End If
Case 4 '左
If (_pbImgEnemy.Left - _intMvwd) > 0 Then
_pbImgEnemy.Left -= _intMvwd
End If
End Select
enemy2
次にenemy2の動きを実装してみましょう。Case 2の中に記述します。
'--------------------------
' enemy2
' 上下左右にぶつかるまで動く
'--------------------------
If _intMvud = 0 Then
' 初回時だけは上下左右どちらに進むか決める
_intMvud = _rnd.Next(1, 5)
End If
' 上下左右にぶつかるまで移動する。
' ぶつかったらまた上下左右にランダムに移動する。
Select Case _intMvud
Case 1 '下
If (_pbImgEnemy.Top + _pbImgEnemy.Height + _intMvwd) < (_enemyOwner.height) Then
_pbImgEnemy.Top += _intMvwd
Else
_intMvud = _rnd.Next(1, 5)
End If
Case 2 '上
If (_pbImgEnemy.Top - _intMvwd) > 0 Then
_pbImgEnemy.Top -= _intMvwd
Else
_intMvud = _rnd.Next(1, 5)
End If
Case 3 '右
If (_pbImgEnemy.Left + _pbImgEnemy.Width + _intMvwd) < (_enemyOwner.Width) Then
_pbImgEnemy.Left += _intMvwd
Else
_intMvud = _rnd.Next(1, 5)
End If
Case 4 '左
If (_pbImgEnemy.Left - _intMvwd) > 0 Then
_pbImgEnemy.Left -= _intMvwd
Else
_intMvud = _rnd.Next(1, 5)
End If
End Select
enemy3
さて最後の敵の動きです。Case 3の中に記述します。
少し条件分岐が多くなります。
'--------------------
' enemy3
' ななめに動く
'--------------------
If _intMvud = 0 Then
' 初回時だけは上下左右のななめに進むか決める
_intMvud = _rnd.Next(1, 5)
End If
' ななめにぶつかるまで移動する。
' ぶつかったら跳ね返されるように移動する。
Select Case _intMvud
Case 1 '斜め右下
If (((_pbImgEnemy.Top + _pbImgEnemy.Height + _intMvwd) < (_enemyOwner.height)) And
((_pbImgEnemy.Left + _pbImgEnemy.Width + _intMvwd) < (_enemyOwner.Width))) Then
_pbImgEnemy.Top += _intMvwd
_pbImgEnemy.Left += _intMvwd
Else
'次は跳ね返った位置
If ((_pbImgEnemy.Top + _pbImgEnemy.Height + _intMvwd) >= (_enemyOwner.height)) Then
_intMvud = 2 ' 斜め右上
ElseIf ((_pbImgEnemy.Left + _pbImgEnemy.Width + _intMvwd) >= (_enemyOwner.Width)) Then
_intMvud = 3 ' 斜め左下
End If
End If
Case 2 '斜め右上
If (((_pbImgEnemy.Top - _intMvwd) > 0) And
(_pbImgEnemy.Left + _pbImgEnemy.Width + _intMvwd) < (_enemyOwner.Width)) Then
_pbImgEnemy.Top -= _intMvwd
_pbImgEnemy.Left += _intMvwd
Else
'次は跳ね返った位置
If ((_pbImgEnemy.Top - _intMvwd) <= 0) Then
_intMvud = 1 ' 斜め右下
ElseIf (_pbImgEnemy.Left + _pbImgEnemy.Width + _intMvwd) >= (_enemyOwner.Width) Then
_intMvud = 4 ' 斜め左上
End If
End If
Case 3 '斜め左下
If ((_pbImgEnemy.Left - _intMvwd) > 0) And
((_pbImgEnemy.Top + _pbImgEnemy.Height + _intMvwd) < (_enemyOwner.height)) Then
_pbImgEnemy.Top += _intMvwd
_pbImgEnemy.Left -= _intMvwd
Else
'次は跳ね返った位置
If (_pbImgEnemy.Left - _intMvwd) <= 0 Then
_intMvud = 1 ' 斜め右下
ElseIf ((_pbImgEnemy.Top + _pbImgEnemy.Height + _intMvwd) >= (_enemyOwner.height)) Then
_intMvud = 4 ' 斜め左上
End If
End If
Case 4 '斜め左上
If ((_pbImgEnemy.Left - _intMvwd) > 0) And
((_pbImgEnemy.Top - _intMvwd) > 0) Then
_pbImgEnemy.Top -= _intMvwd
_pbImgEnemy.Left -= _intMvwd
Else
'次は跳ね返った位置
If (_pbImgEnemy.Left - _intMvwd) <= 0 Then
_intMvud = 2 ' 斜め右上
ElseIf (_pbImgEnemy.Top - _intMvwd) <= 0 Then
_intMvud = 3 ' 斜め左下
End If
End If
End Select
敵の動きは実装できました。
少し難しいかも知れませんが、一行ずつ解読してみてください。
あと敵クラスで実装しておくべき処理は以下だけです。
敵が倒されたイベントです。倒された場合、また違う場所に出現します。
クラス内の下の方に関数を定義してください。
' 敵が倒されたイベント
Public Sub EnemyDown()
' 違う場所に出現する
_RandPlace()
End Sub
また敵の得点のゲットです。
' 敵の得点のゲット
Public Function GetTokuten() As Integer
GetTokuten = _intTokuten
End Function
以上でやっと敵クラスの実装が完了しました。
次はメイン画面を実装していきます。
コメント