クリップボード履歴ソフトCliborを公開中!

VBでゲームを作ろう6

Visual Basicでゲームを作ろう6

動作確認

ここまでできましたので、実際に敵を表示して見ましょう。
メイン画面(F_Main)のコードを表示してください。
ここでは敵クラスを配列に格納し、複数の敵を作成します。

そこで敵を格納する配列の定義と、その他変数を定義します。
メイン画面(F_Main)の先頭に定義します。

    Dim G_Rnd As New System.Random  ' ランダム変数
    Dim Enemies As New ArrayList()  ' 複数の敵を格納する変数

メイン画面(F_Main)のスタートボタン(B_Start)のクリックイベントに以下を記述しましょう。
配列に敵クラスを定義する理由は、次以降でランダムに動かしたりするために使いやすいように配列に格納します。

    ' スタートボタンクリック
    Private Sub B_Start_Click(ByVal sender As System.Object, ByVal e As System.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, G_Rnd))
            ' ループの中でDoEventsを呼んでおく
            System.Windows.Forms.Application.DoEvents()
        Next
    End Sub

ここで以下のプロジェクトのフォルダに敵画像を配置します。(exeファイルと同じ階層におきます)
プロジェクトがC:\ClickBusterであれば以下の場所に画像を配置します。
C:\ClickBuster\ClickBuster\bin\Debug

敵画像は以下です。右クリックで画像を保存してください。

敵画像1 敵画像2 敵画像3

敵クラスの「_RandPlace」の実装で画像を指定しました。
得点はそれぞれ500、1000、3000と設定しましたので、大きい画像・中くらいの画像・小さい画像にしました。

それではアプリケーションを実行してみましょう。
初級ボタンをクリックし、スタートボタンをクリックすると敵が10体、ランダムな画像で、
ランダムな場所に出現したと思います。(画像が10体ない場合は大きい画像の後ろに隠れています)
一度メイン画面を閉じて、再度、初級ボタン→スタートボタンでまた違う場所に表示されると思います。

やっと半分くらい実装できました。
次に敵をランダムに動かす処理を実装していきます。

敵クラスの実装2

敵クラスをもう少し実装しましょう。
敵をランダムに動かすメソッドを実装します。
メイン画面側では、ある一定間隔で次のメソッドを実行し、敵を動かします。
つまり呼ばれる度に、今いる位置より一歩移動します。

まず骨組みを作りましょう。
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はメイン画面のパネルの上を完全にランダムに移動します。
上下左右にランダムに移動します。
コンストラクタで初期化したintMvwdは移動する幅です。この幅が大きいと移動する幅が増えます。
画像がパネルからはみ出さない場合、画像の場所(Top, Left)を移動しているところがポイントです。

                '--------------------
                ' enemy1
                ' 完全ランダムな動き
                '--------------------
                ' 移動先をランダムに決めます
                Dim intMv As Integer = R_Rnd.Next(1, 5)
                ' 一歩移動(オーナーの範囲をはみ出しそうになったら現状維持)
                Select Case intMv
                    Case 1 '下
                        If (PB_ImgEnemy.Top + PB_ImgEnemy.Height + intMvwd) < (O_Owner.height) Then
                            PB_ImgEnemy.Top = PB_ImgEnemy.Top + intMvwd
                        End If
                    Case 2 '上
                        If (PB_ImgEnemy.Top - intMvwd) > 0 Then
                            PB_ImgEnemy.Top = PB_ImgEnemy.Top - intMvwd
                        End If
                    Case 3 '右
                        If (PB_ImgEnemy.Left + PB_ImgEnemy.Width + intMvwd) < (O_Owner.Width) Then
                            PB_ImgEnemy.Left = PB_ImgEnemy.Left + intMvwd
                        End If
                    Case 4 '左
                        If (PB_ImgEnemy.Left - intMvwd) > 0 Then
                            PB_ImgEnemy.Left = PB_ImgEnemy.Left - intMvwd
                        End If
                End Select

次にenemy2の動きを実装してみましょう。
enemy2は上下左右に動きますが、上に移動したらぶつかるまで上に移動します。
ぶつかった時点で、今度はまた上下左右ランダムに動き、またぶつかるまで移動します。

               '--------------------------
                ' enemy2
                ' 上下左右にぶつかるまで動く
                '--------------------------
                If intMvud = 0 Then
                    ' 初回時だけは上下左右どちらに進むか決める
                    intMvud = R_Rnd.Next(1, 5)
                End If

                ' 上下左右にぶつかるまで移動する。
                ' ぶつかったらまた上下左右にランダムに移動する。
                Select Case intMvud
                    Case 1 '下 
                        If (PB_ImgEnemy.Top + PB_ImgEnemy.Height + intMvwd) < (O_Owner.height) Then
                            PB_ImgEnemy.Top = PB_ImgEnemy.Top + intMvwd
                        Else
                            intMvud = R_Rnd.Next(1, 5)
                        End If
                    Case 2 '上
                        If (PB_ImgEnemy.Top - intMvwd) > 0 Then
                            PB_ImgEnemy.Top = PB_ImgEnemy.Top - intMvwd
                        Else
                            intMvud = R_Rnd.Next(1, 5)
                        End If
                    Case 3 '右
                        If (PB_ImgEnemy.Left + PB_ImgEnemy.Width + intMvwd) < (O_Owner.Width) Then
                            PB_ImgEnemy.Left = PB_ImgEnemy.Left + intMvwd
                        Else
                            intMvud = R_Rnd.Next(1, 5)
                        End If
                    Case 4 '左
                        If (PB_ImgEnemy.Left - intMvwd) > 0 Then
                            PB_ImgEnemy.Left = PB_ImgEnemy.Left - intMvwd
                        Else
                            intMvud = R_Rnd.Next(1, 5)
                        End If
                End Select

さて最後の敵の動きです。
enemy3は斜めにぶつかるまで移動します。
ぶつかったらそれに跳ね返るような動きをします。
少し条件分岐が多くなります。

                '--------------------
                ' enemy3
                ' ななめに動く
                '--------------------
                If intMvud = 0 Then
                    ' 初回時だけは上下左右のななめに進むか決める
                    intMvud = R_Rnd.Next(1, 5)
                End If

                ' ななめにぶつかるまで移動する。
                ' ぶつかったら跳ね返されるように移動する。
                Select Case intMvud
                    Case 1 '斜め右下 
                        If (((PB_ImgEnemy.Top + PB_ImgEnemy.Height + intMvwd) < (O_Owner.height)) And _
                            ((PB_ImgEnemy.Left + PB_ImgEnemy.Width + intMvwd) < (O_Owner.Width))) Then
                            PB_ImgEnemy.Top = PB_ImgEnemy.Top + intMvwd
                            PB_ImgEnemy.Left = PB_ImgEnemy.Left + intMvwd
                        Else
                            '次は跳ね返った位置
                            If ((PB_ImgEnemy.Top + PB_ImgEnemy.Height + intMvwd) >= (O_Owner.height)) Then
                                intMvud = 2 ' 斜め右上
                            ElseIf ((PB_ImgEnemy.Left + PB_ImgEnemy.Width + intMvwd) >= (O_Owner.Width)) Then
                                intMvud = 3 ' 斜め左下
                            End If
                        End If
                    Case 2 '斜め右上
                        If (((PB_ImgEnemy.Top - intMvwd) > 0) And _
                            (PB_ImgEnemy.Left + PB_ImgEnemy.Width + intMvwd) < (O_Owner.Width)) Then
                            PB_ImgEnemy.Top = PB_ImgEnemy.Top - intMvwd
                            PB_ImgEnemy.Left = PB_ImgEnemy.Left + intMvwd
                        Else
                            '次は跳ね返った位置
                            If ((PB_ImgEnemy.Top - intMvwd) <= 0) Then
                                intMvud = 1 ' 斜め右下
                            ElseIf (PB_ImgEnemy.Left + PB_ImgEnemy.Width + intMvwd) >= (O_Owner.Width) Then
                                intMvud = 4 ' 斜め左上
                            End If
                        End If
                    Case 3 '斜め左下
                        If ((PB_ImgEnemy.Left - intMvwd) > 0) And _
                            ((PB_ImgEnemy.Top + PB_ImgEnemy.Height + intMvwd) < (O_Owner.height)) Then
                            PB_ImgEnemy.Top = PB_ImgEnemy.Top + intMvwd
                            PB_ImgEnemy.Left = PB_ImgEnemy.Left - intMvwd
                        Else
                            '次は跳ね返った位置
                            If (PB_ImgEnemy.Left - intMvwd) <= 0 Then
                                intMvud = 1 ' 斜め右下
                            ElseIf ((PB_ImgEnemy.Top + PB_ImgEnemy.Height + intMvwd) >= (O_Owner.height)) Then
                                intMvud = 4 ' 斜め左上
                            End If
                        End If
                    Case 4 '斜め左上
                        If ((PB_ImgEnemy.Left - intMvwd) > 0) And _
                            ((PB_ImgEnemy.Top - intMvwd) > 0) Then
                            PB_ImgEnemy.Top = PB_ImgEnemy.Top - intMvwd
                            PB_ImgEnemy.Left = PB_ImgEnemy.Left - intMvwd
                        Else
                            '次は跳ね返った位置
                            If (PB_ImgEnemy.Left - intMvwd) <= 0 Then
                                intMvud = 2 ' 斜め右上
                            ElseIf (PB_ImgEnemy.Top - intMvwd) <= 0 Then
                                intMvud = 3 ' 斜め左下
                            End If
                        End If
                End Select

敵の動きは実装できました。
少し難しいかも知れませんが、一行ずつ解読してみてください。

あと敵クラスで実装しておくべき処理は以下だけです。
敵が倒されたイベントです。倒された場合、また違う場所に出現します。

    ' 敵が倒されたイベント
    Public Sub EnemyDown()
        ' 違う場所に出現する
        _RandPlace(O_Owner, PB_ImgEnemy)
    End Sub

また敵の得点のゲットです。

    ' 敵の得点のゲット
    Public Function GetTokuten() As Integer
        GetTokuten = intTokuten
    End Function

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

  • Facebook
  • Hatena
  • twitter
  • Google+

サイトについて

Cliborに関する匿名のアンケートやご要望はこちらからCliborアンケート


Amunsへ直接のお問い合わせはこちらからContact

寄付のお願い

Cliborはフリーソフトですが寄付歓迎です。 →寄付のお願い
PAGETOP
Copyright © amuns:code All Rights Reserved.
Powered by WordPress & BizVektor Theme by Vektor,Inc. technology.