自分だけのクイズ作成 - Quipha公開中

【#6】VBでゲームを作ろう【敵クラスの作成2】

VB
スポンサーリンク

敵クラスの作成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はメイン画面のパネルの上を完全にランダムに移動します。
  • 上下左右にランダムに移動します。

コンストラクタで初期化したintMvwdは移動する幅です。この幅が大きいと移動する幅が増えます。
画像がパネルからはみ出さない場合、画像の場所(Top, Left)を移動しているところがポイントです。

               '--------------------
                ' 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は上下左右に動きますが、上に移動したらぶつかるまで上に移動します。
  • ぶつかった時点で、今度はまた上下左右ランダムに動き、またぶつかるまで移動します。
               '--------------------------
                ' 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は斜めにぶつかるまで移動します。
  • ぶつかったらそれに跳ね返るような動きをします。

少し条件分岐が多くなります。

               '--------------------
                ' 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

以上でやっと敵クラスの実装が完了しました。
次はメイン画面を実装していきます。

コメント

タイトルとURLをコピーしました