ExcelVBAゲームプログラミング?

初心者でもきっとできる!
Excelさえ持っていれば特別なソフトは不要!
すぐにでも始められる簡単ゲームプログラミング!
今すぐ始めよう!

サンプルやゲームのダウンロードができる別館も好評運営中です。
ご意見やご質問、ゲームの感想等は掲示板までお気軽に。是非、皆さんの声を聞かせてください。運営、開発の励みになります。



各種ダウンロードはコチラ ↓ 意見・感想・質問はコチラ ↓
影倉庫 Shadow warehouse サポート掲示板
ブログの全体像はコチラ ↓ リンクのページはコチラ ↓
サイトマップ 自分本位なリンク


スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。






Chapter.60 [ シューティングゲーム20:いよいよ完成STG ]

■ショット関連の処理

さぁ、いよいよ今回の講座で、長かったシューティングゲームの講座も最後です。気合を入れて頑張りましょう。

それでは、前回宣言したとおり、今回はショット関連の処理を一気にやってしまいます。まずはプレイヤーキャラクターが放ったショットの処理から見ていきましょう。

Sub P_Shot_Action()

    Dim L As Long
    Dim LL As Long

    For L = 0 To 4
        With P_Shot_Data(L)
            If .Vis Then
                .Y = .Y - 6
                If .Y < -5 Then .Vis = False
                For LL = 0 To 9
                    If Enemy_Data(LL).Lif > 0 Then
                        If .X - 2 < Enemy_Data(LL).X + Enemy_Data(LL).W Then
                            If .X + 2 > Enemy_Data(LL).X - Enemy_Data(LL).W Then
                                If .Y - 2 < Enemy_Data(LL).Y + Enemy_Data(LL).H Then
                                    If .Y + 2 > Enemy_Data(LL).Y - Enemy_Data(LL).H Then
                                        .Vis = False
                                        With Enemy_Data(LL)
                                            Call Burst_Begin(.X, .Y)
                                            .Lif = 0
                                        End With
                                        Score = Score + 100
                                        Exit For
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
                If Boss_Data.Lif > 0 Then
                    If .X - 2 < Boss_Data.X + Boss_Data.W Then
                        If .X + 2 > Boss_Data.X - Boss_Data.W Then
                            If .Y - 2 < Boss_Data.Y + Boss_Data.H Then
                                If .Y + 2 > Boss_Data.Y - Boss_Data.H Then
                                    .Vis = False
                                    With Boss_Data
                                        Call Burst_Begin(.X, .Y)
                                        .Lif = .Lif - 1
                                    End With
                                    Score = Score + 50
                                End If
                            End If
                        End If
                    End If
                End If

                With UserForm1.Controls("P_Shot" & L + 1)
                    If P_Shot_Data(L).Vis Then
                        .Left = P_Shot_Data(L).X - Shot_Size
                        .Top = P_Shot_Data(L).Y - Shot_Size
                    Else
                        .Visible = False
                    End If
                End With
            End If
        End With
    Next

End Sub

ボスキャラクターは、通常のザコ敵キャラクターとは違う構造体変数を使っています。ですから、ショットとの衝突判定も独自に実装する必要があります。追加されているのは緑色で表示されている部分だけです。

実際にやっていることは、通常の衝突判定と全く同じことをしているだけです。ボスキャラクターの位置と大きさ、これを元に衝突しているかどうか計算しているのですね。

ポイントは、緑色の文字の一番最初の行の部分。ここで、ボスキャラクターが存在しているかどうか調べています。存在していないときに衝突判定を行う必要は無いので、ここでそれを判断してから衝突判定の処理に移っているわけです。


■敵キャラクターのショット

さて、次に敵キャラクターのショットまわりを修正しましょう。
前回の講座で載せたコードの中に、ボスキャラクターが放つショットの処理がありました。そこでは、ボスキャラクターが5種類のショットを撃ってくるように設計されていましたが、今現在は3種類のショットしか定義されていません。

ここでは、ショットの種類に応じて処理が分かれるように、適宜、コードの修正及び追加を行いましょう。
まずは、ショットを生成するプロシージャの修正からです。

ショットの生成段階で、ショットの種類に応じて、画像が変化するようにしてみます。

Sub E_Shot_Begin(X As Single, Y As Single, Typ As Long)
    
    Dim L As Long
    
    For L = 0 To 9
        With E_Shot_Data(L)
            If Not .Vis Then
                .X = X
                .Y = Y
                .Typ = Typ
                .Vis = True
                With UserForm1.Controls("E_Shot" & L + 1)
                    .Visible = True
                    Select Case Typ
                        Case 1, 2, 3
                            .Picture = UserForm1.E_Shot_s1.Picture
                        Case Else
                            .Picture = UserForm1.E_Shot_s2.Picture
                    End Select

                End With
                Exit For
            End If
        End With
    Next
    
End Sub

さて、緑色になっている部分が今回追加された部分ですが、何をしようとしているか、なんとなくわかりますか?

ここでは、ショットのタイプによって、画像が切り替わるように処理しています。
前々回の講座で、ユーザーフォーム上にショット用の原画となるイメージコントロールを配置しました。『E_Shot_s1E_Shot_s2』がこれにあたります。

ショットのタイプが、1か2か3の場合には、青いショットのほうを使います。青いショットの画像はE_Shot_s1の画像を使います。
そして、それ以外の場合にはE_Shot_s2の画像を使います。今回は4番目と5番目のショットを追加しますので、そのふたつのショットはE_Shot_s2を原画として使用して表示するようになります。

このプロシージャで修正しているのはここだけです。簡単ですね。

さて問題は次です。
ショットの4番目と5番目、これがどのような動きをするのかを定義しておかなくてはいけません。それが次のコードになります。ちょっと長いですが、色つきの部分に絞って考えれば大丈夫だと思います。

Sub E_Shot_Action()

    Dim L As Long
    Dim LL As Long
    
    For L = 0 To 9
        With E_Shot_Data(L)
            If .Vis Then
                Select Case .Typ
                    Case 1
                        .Y = .Y + 4.5
                    Case 2
                        .X = .X + 0.5
                        .Y = .Y + 3.5
                    Case 3
                        .X = .X - 0.5
                        .Y = .Y + 3.5
                    Case 4
                        If .X < Player_Data.X Then
                            .X = .X + 1.5
                        Else
                            .X = .X - 1.5
                        End If
                        .Y = .Y + 2
                    Case 5
                        .Y = .Y + 6

                End Select
                If .X > 205 Then .Vis = 0
                If .Y > 205 Then .Vis = 0
                If .X < -5 Then .Vis = 0
                If .Y < -5 Then .Vis = 0
                If .X - 2 < Player_Data.X + Player_Data.W Then
                    If .X + 2 > Player_Data.X - Player_Data.W Then
                        If .Y - 2 < Player_Data.Y + Player_Data.H Then
                            If .Y + 2 > Player_Data.Y - Player_Data.H Then
                                .Vis = False
                                With Player_Data
                                    Call Burst_Begin(.X, .Y)
                                    .Lif = 0
                                End With
                            End If
                        End If
                    End If
                End If
                With UserForm1.Controls("E_Shot" & L + 1)
                    If E_Shot_Data(L).Vis Then
                        .Left = E_Shot_Data(L).X - Shot_Size
                        .Top = E_Shot_Data(L).Y - Shot_Size
                    Else
                        .Visible = False
                    End If
                End With
            End If
        End With
    Next
                
End Sub

ショットの4番目は、簡易的な追尾弾です。
プレイヤーキャラクターの現在の横位置を調べて、その方向へ移動していくようになっています。ショットの位置よりプレイヤーが左にいれば、ショットも左へ向かうという具合ですね。
追尾弾というのは、本物をやろうとすると結構大変なので、今回は簡易的な実装に留めています。横位置を調べてその方角へ移動させるだけなら、結構簡単ですからね。

5番目のショットは、単に下方向へまっすぐ進むだけです。ただし、1回のループで移動する距離が少々大きめに設定されています。これはつまり高速移動するショットということになります。

このプロシージャに追加するのはこれだけでOKです。
そして、これで修正のほぼ全てが完了したことになります。


■まとめ

いやぁ、長かった。本当に長かった。
ひとつの作品を作り上げるということは、本当に大変な労力を使います。手間も、根気も、並大抵ではありません。それだけに、大抵のプログラムというのは、途中で開発が止まってしまい、未完成に終わることが多いのです。

しかし、以前にも言いましたが、ゲームを作成する上でとても大切なことのひとつが、とりあえず完成させるということなのです。
御託をいくら並べても、ひとつの作品が出来上がらなかったら意味がありません。えらそうなことを言って、知識ばっかりたくさん持っていても、作品を仕上げられないうちは一人前とは言えません。

多少簡素なものであっても、それが完成品であるならば、それはあなたにとってとても意味のあるもののはずです。簡単なコードしか書けなくても、難しいことはわからなくても、努力の末に作品を仕上げたときには、あなたは立派なプログラマーです。
私が全てのコードを公開しているという都合上、コピーするだけでも動くゲームは出来上がります。でも、ここにどのようなエッセンスを加えていくかはあなた次第。どのように応用して生かしていくのかもあなた次第です。

何度も言いますが、私ができるのは、皆さんのお手伝い、道案内だけです。
この講座を通して得た知識で、皆さんが独自の世界を表現していくことを切に願います。

とにかく、ここまで根気強く進めてきてくださった皆さん。本当にお疲れ様でした。


最後にコードを全て掲載しておきます。講座の最後には、サンプルのページへのリンクも貼っておきます。これらを参考に、頑張ってみてください。


シューティングゲーム講座 全コード掲載
'標準モジュール先頭部分

'◆API 宣言

Declare Function GetTickCount Lib "kernel32" () As Long
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMillsecounds As Long)

'■キャラクター 構造体宣言
Type Chara
    X As Single
    Y As Single
    W As Single
    H As Single
    Lif As Long
    Typ As Long
    Par As Long
End Type

'■ショット 構造体宣言
Type Shot
    X As Single
    Y As Single
    Vis As Boolean
    Typ As Long
End Type

'■汎用オブジェクト 構造体宣言
Type Obj
    X As Single
    Y As Single
    W As Single
    H As Single
    Par As Long
End Type

'●キャラクター 変数宣言
Public Player_Data As Chara
Public Enemy_Data(9) As Chara
Public Boss_Data As Chara

'●ショット 変数宣言
Public P_Shot_Data(4) As Shot
Public E_Shot_Data(9) As Shot

'●汎用オブジェクト 変数宣言
Public Burst_Data(2) As Obj

'◎その他 変数宣言
Public Shot_Interval As Long
Public Total_Count As Long 'ゲーム中のカウンタ
Public Player_Stock As Long 'プレイヤーの残機数
Public Score As Long 'ゲームのスコア
Public Boss_Begin As Boolean 'ボスが出現しているかどうか
Public Game_Mode As Long '現在のゲームモード
'0=タイトル
'1=ゲーム中
'2=ゲームオーバー
'3=ゲームクリア

'▲定数宣言
Public Const Left_Key As Long = 37 'カーソル左
Public Const Up_Key As Long = 38 'カーソル上
Public Const Right_Key As Long = 39 'カーソル右
Public Const Down_Key As Long = 40 'カーソル下
Public Const Esc_Key As Long = 27 'Escキー
Public Const Shot_Key As Long = 90 'Zキー
Public Const Player_Size As Single = 9
'プレイヤーキャラクターの実際の大きさ
Public Const Shot_Size As Single = 3
'弾各種の実際の大きさ
Public Const Enemy_Size As Single = 9
'敵キャラクターの実際の大きさ
Public Const Burst_Size As Single = 15
'爆発エフェクトの実際の大きさ
Public Const Boss_size As Single = 15
'ボスの実際の大きさ


'初期化を担当するプロシージャ

Sub Init()
    With Player_Data
        .X = 100
        .Y = 210
        .W = 3
        .H = 3
        .Lif = 1
        .Typ = 0
        .Par = 1
    End With
    With Boss_Data
        .X = 0
        .Y = 0
        .W = 0
        .H = 0
        .Lif = 0
        .Typ = 0
        .Par = 0
    End With

    Erase P_Shot_Data
    Erase E_Shot_Data
    Erase Enemy_Data
    Erase Burst_Data
    Shot_Interval = 0
    Total_Count = 0
    Player_Stock = 2
    Score = 0
    Game_Mode = 0
    Boss_Begin = False
    With UserForm1.Player
        .Visible = True
        .Top = 200
    End With
    UserForm1.Lab_Score.Caption = "00000000"
End Sub


'メインプロセスを担当するプロシージャ

Sub Main()

    Dim Flg As Boolean
    Dim Stm As Long
    
    Init
    
    Flg = False
    
    Do Until Flg
        Stm = GetTickCount
        Total_Count = Total_Count + 1
        Select Case Game_Mode
            Case 0
                Call Tytle_Action
            Case 1
                Call Stage_Count
                Call Player_Action
                Call Enemy_Action
                Call P_Shot_Action
                Call E_Shot_Action
                Call Burst_Action
                If Boss_Begin Then Boss_Action
                UserForm1.Lab_Score.Caption = Format(Score, "00000000")
            Case 2
                MsgBox "Game Over!!"
                Flg = True
            Case 3
                MsgBox "Clear!!"
                Flg = True
        End Select
        DoEvents
        Do
            Call Sleep(1)
        Loop Until GetTickCount - Stm > 30
        If GetAsyncKeyState(27) < 0 Then Flg = True
    Loop

End Sub


'タイトルのアクションを管理するプロシージャ

Sub Tytle_Action()

    With UserForm1
        .Lab_Cap1.Left = .Lab_Cap1.Left + 3
        .Lab_Cap2.Left = .Lab_Cap2.Left - 3
        If .Lab_Cap1.Left > 200 Then
            .Lab_Cap1.Visible = False
            .Lab_Cap2.Visible = False
            Game_Mode = 1
        End If
    End With
    
End Sub


'敵キャラクターの出現管理プロシージャ

Sub Stage_Count()

    Dim TCMOD As Long
    
    Randomize
    
    TCMOD = Total_Count Mod 1000
    
    If Total_Count < 2000 Then
        Select Case TCMOD
            Case 100, 150, 600, 650, 700, 750
                Call Enemy_Begin(Int(Rnd * 120) + 40, -10, 1)
            Case 200, 350, 450, 500, 800, 950
                Call Enemy_Begin(Int(Rnd * 120) + 40, -10, 2)
            Case 250, 300, 400, 550, 850, 900
                Call Enemy_Begin(Int(Rnd * 120) + 40, -10, 3)
        End Select
    Else
        If Total_Count = 2000 Then
            With Boss_Data
                .X = 100
                .Y = -20
                .W = 8
                .H = 8
                .Lif = 50
                .Par = 0
                .Typ = 0
            End With
            Boss_Begin = True
            UserForm1.Boss.Visible = True
        End If
    End If
    
End Sub



'プレイヤーキャラクターを担当するプロシージャ

Sub Player_Action()

    Dim S As Single
    Dim SS As Single
    
    Randomize
    
    With Player_Data
        If .Lif > 0 Then
            If .Par > 0 Then
                If .Y > 180 Then
                    .Y = .Y - 1
                Else
                    .Par = 0
                End If
            Else
                If GetAsyncKeyState(Left_Key) < 0 Then .X = .X - 3
                If GetAsyncKeyState(Up_Key) < 0 Then .Y = .Y - 3
                If GetAsyncKeyState(Right_Key) < 0 Then .X = .X + 3
                If GetAsyncKeyState(Down_Key) < 0 Then .Y = .Y + 3

                If .X - Player_Size < 0 Then .X = Player_Size
                If .X + Player_Size > 200 Then .X = 200 - Player_Size
                If .Y - Player_Size < 0 Then .Y = Player_Size
                If .Y + Player_Size > 200 Then .Y = 200 - Player_Size

                If Shot_Interval = 0 Then
                    If GetAsyncKeyState(Shot_Key) < 0 Then
                        Call P_Shot_Begin(.X, .Y, 1)
                        Shot_Interval = 1
                    End If
                Else
                    Shot_Interval = Shot_Interval + 1
                    If Shot_Interval > 7 Then Shot_Interval = 0
                End If
            End If
        Else
            .Par = .Par + 1
            If .Par > 50 Then
                .X = 100
                .Y = 210
                .Lif = 1
                .Par = 1
                Player_Stock = Player_Stock - 1
                Select Case Player_Stock
                    Case Is < 0
                        Game_Mode = 2
                    Case 0
                        UserForm1.Stock1.Visible = False
                    Case 1
                        UserForm1.Stock2.Visible = False
                End Select
            Else
                If .Par Mod 9 = 1 Then
                    S = Int(Rnd * 20) - 9
                    SS = Int(Rnd * 20) - 9
                    Call Burst_Begin(.X + S, .Y + SS)
                End If
            End If
        End If
        With UserForm1.Player
            .Left = Player_Data.X - Player_Size
            .Top = Player_Data.Y - Player_Size
        End With
    End With
    
End Sub


'ショット生成プロシージャ

Sub P_Shot_Begin(X As Single, Y As Single, Typ As Long)

    Dim L As Long

    For L = 0 To 4
        With P_Shot_Data(L)
            If Not .Vis Then
                .X = X
                .Y = Y
                .Typ = Typ
                .Vis = True
                UserForm1.Controls("P_Shot" & L + 1).Visible = True
                Exit For
            End If
        End With
    Next

End Sub


'ショット移動管理プロシージャ

Sub P_Shot_Action()

    Dim L As Long
    Dim LL As Long

    For L = 0 To 4
        With P_Shot_Data(L)
            If .Vis Then
                .Y = .Y - 6
                If .Y < -5 Then .Vis = False
                For LL = 0 To 9
                    If Enemy_Data(LL).Lif > 0 Then
                        If .X - 2 < Enemy_Data(LL).X + Enemy_Data(LL).W Then
                            If .X + 2 > Enemy_Data(LL).X - Enemy_Data(LL).W Then
                                If .Y - 2 < Enemy_Data(LL).Y + Enemy_Data(LL).H Then
                                    If .Y + 2 > Enemy_Data(LL).Y - Enemy_Data(LL).H Then
                                        .Vis = False
                                        With Enemy_Data(LL)
                                            Call Burst_Begin(.X, .Y)
                                            .Lif = 0
                                        End With
                                        Score = Score + 100
                                        Exit For
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
                If Boss_Data.Lif > 0 Then
                    If .X - 2 < Boss_Data.X + Boss_Data.W Then
                        If .X + 2 > Boss_Data.X - Boss_Data.W Then
                            If .Y - 2 < Boss_Data.Y + Boss_Data.H Then
                                If .Y + 2 > Boss_Data.Y - Boss_Data.H Then
                                    .Vis = False
                                    With Boss_Data
                                        Call Burst_Begin(.X, .Y)
                                        .Lif = .Lif - 1
                                    End With
                                    Score = Score + 50
                                End If
                            End If
                        End If
                    End If
                End If

                With UserForm1.Controls("P_Shot" & L + 1)
                    If P_Shot_Data(L).Vis Then
                        .Left = P_Shot_Data(L).X - Shot_Size
                        .Top = P_Shot_Data(L).Y - Shot_Size
                    Else
                        .Visible = False
                    End If
                End With
            End If
        End With
    Next

End Sub


'敵キャラクター生成プロシージャ

Sub Enemy_Begin(X As Single, Y As Single, Typ As Long)

    Dim L As Long
    
    For L = 0 To 9
        With Enemy_Data(L)
            If .Lif = 0 Then
                .X = X
                .Y = Y
                .W = 5
                .H = 5
                .Typ = Typ
                .Lif = 1
                .Par = 0
                With UserForm1.Controls("Enemy" & L + 1)
                    .Visible = True
                    Select Case Typ
                        Case 1
                            .Picture = UserForm1.Enemy_s1.Picture
                        Case 2, 3
                            .Picture = UserForm1.Enemy_s2.Picture
                    End Select
                End With
                Exit For
            End If
        End With
    Next
    
End Sub


'敵キャラクターを担当するプロシージャ

Sub Enemy_Action()

    Dim L As Long
    Dim TCMOD
    
    TCMOD = Total_Count Mod 30
    
    For L = 0 To 9
        With Enemy_Data(L)
            If .Lif > 0 Then
                Select Case .Typ
                    Case 1
                        .Y = .Y + 1.5
                    Case 2
                        .X = .X + 0.5
                        .Y = .Y + 1
                    Case 3
                        .X = .X - 0.5
                        .Y = .Y + 1
                End Select
                If .X > 220 Then .Lif = 0
                If .Y > 220 Then .Lif = 0
                If .X < -20 Then .Lif = 0
                If .Y < -20 Then .Lif = 0
                If TCMOD = 0 Then
                    Select Case .Typ
                        Case 2
                            .Typ = 3
                        Case 3
                            .Typ = 2
                    End Select
                    Call E_Shot_Begin(.X, .Y + 2, .Typ)
                End If
            End If
        End With
        With UserForm1.Controls("Enemy" & L + 1)
            If Enemy_Data(L).Lif > 0 Then
                .Left = Enemy_Data(L).X - Enemy_Size
                .Top = Enemy_Data(L).Y - Enemy_Size
            Else
                .Visible = False
            End If
        End With
    Next
    
End Sub


'敵キャラクターショット生成プロシージャ

Sub E_Shot_Begin(X As Single, Y As Single, Typ As Long)
    
    Dim L As Long
    
    For L = 0 To 9
        With E_Shot_Data(L)
            If Not .Vis Then
                .X = X
                .Y = Y
                .Typ = Typ
                .Vis = True
                With UserForm1.Controls("E_Shot" & L + 1)
                    .Visible = True
                    Select Case Typ
                        Case 1, 2, 3
                            .Picture = UserForm1.E_Shot_s1.Picture
                        Case Else
                            .Picture = UserForm1.E_Shot_s2.Picture
                    End Select

                End With
                Exit For
            End If
        End With
    Next
    
End Sub


'敵キャラクターショット移動管理プロシージャ

Sub E_Shot_Action()

    Dim L As Long
    Dim LL As Long
    
    For L = 0 To 9
        With E_Shot_Data(L)
            If .Vis Then
                Select Case .Typ
                    Case 1
                        .Y = .Y + 4.5
                    Case 2
                        .X = .X + 0.5
                        .Y = .Y + 3.5
                    Case 3
                        .X = .X - 0.5
                        .Y = .Y + 3.5
                    Case 4
                        If .X < Player_Data.X Then
                            .X = .X + 1.5
                        Else
                            .X = .X - 1.5
                        End If
                        .Y = .Y + 2
                    Case 5
                        .Y = .Y + 6

                End Select
                If .X > 205 Then .Vis = 0
                If .Y > 205 Then .Vis = 0
                If .X < -5 Then .Vis = 0
                If .Y < -5 Then .Vis = 0
                If .X - 2 < Player_Data.X + Player_Data.W Then
                    If .X + 2 > Player_Data.X - Player_Data.W Then
                        If .Y - 2 < Player_Data.Y + Player_Data.H Then
                            If .Y + 2 > Player_Data.Y - Player_Data.H Then
                                .Vis = False
                                With Player_Data
                                    Call Burst_Begin(.X, .Y)
                                    .Lif = 0
                                End With
                            End If
                        End If
                    End If
                End If
                With UserForm1.Controls("E_Shot" & L + 1)
                    If E_Shot_Data(L).Vis Then
                        .Left = E_Shot_Data(L).X - Shot_Size
                        .Top = E_Shot_Data(L).Y - Shot_Size
                    Else
                        .Visible = False
                    End If
                End With
            End If
        End With
    Next
                
End Sub


'ボスキャラクターの移動管理プロシージャ

Sub Boss_Action()

    Dim S As Single
    Dim SS As Single
    
    Dim TCMOD
    
    Randomize
    
    TCMOD = Total_Count Mod 500
    
    With Boss_Data
        If .Lif > 0 Then
            If .Y < 30 Then
                .Y = .Y + 1
            Else
                If .Par > 0 Then
                    .X = .X + 2
                    If .X > 160 Then
                        .X = 160
                        .Par = 0
                    End If
                Else
                    .X = .X - 2
                    If .X < 40 Then
                        .X = 40
                        .Par = 1
                    End If
                End If
            End If
            Select Case TCMOD
                Case 50, 70, 90, 110, 130, 150
                    .Typ = 1
                Case 60, 80, 100, 140
                    .Typ = 2
                Case 80, 120, 160
                    .Typ = 3
                Case 200, 230, 260, 290, 320
                    .Typ = 4
                Case 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450
                    .Typ = 5
                Case Else
                    .Typ = 0
            End Select
            If .Typ <> 0 Then Call E_Shot_Begin(.X, .Y + 5, .Typ)
        Else
            .Par = .Par + 1
            If .Par < 100 Then
                If .Par Mod 10 = 0 Then
                    S = Int(Rnd * 25) - 13
                    SS = Int(Rnd * 25) - 13
                    Call Burst_Begin(.X + S, .Y + SS)
                End If
            Else
                Game_Mode = 3
                Boss_Begin = False
            End If
        End If
    End With
    With UserForm1.Boss
        If Boss_Begin Then
            .Left = Boss_Data.X - Boss_size
            .Top = Boss_Data.Y - Boss_size
        Else
            .Visible = False
        End If
    End With

End Sub



'爆発エフェクト生成プロシージャ

Sub Burst_Begin(X As Single, Y As Single)

    Dim L As Long
    
    For L = 0 To 2
        With Burst_Data(L)
            If .Par = 0 Then
                .X = X
                .Y = Y
                .W = Burst_Size
                .H = Burst_Size
                .Par = 1
                UserForm1.Controls("Burst" & L + 1).Visible = True
                Exit For
            End If
        End With
    Next
    
End Sub


'爆発エフェクト管理プロシージャ

Sub Burst_Action()

    Dim L As Long
    Dim Pict As Long
    
    For L = 0 To 2
        With Burst_Data(L)
            If .Par > 0 Then
                Select Case .Par
                    Case 1
                        Pict = 1
                    Case 2, 3
                        Pict = 2
                    Case 4, 5
                        Pict = 3
                    Case 6, 7
                        Pict = 4
                    Case 8
                        Pict = 5
                    Case 9
                        .Par = -1
                End Select
                .Par = .Par + 1
                With UserForm1.Controls("Burst" & L + 1)
                    If Burst_Data(L).Par > 0 Then
                        .Left = Burst_Data(L).X - Burst_Size
                        .Top = Burst_Data(L).Y - Burst_Size
                        .Picture = UserForm1.Controls("Burst_s" & Pict).Picture
                    Else
                        .Visible = False
                    End If
                End With
            End If
        End With
    Next
                
End Sub


'標準モジュールはここまで
'ここから下はフォームモジュールに記述


'コマンドボタンのクリックイベント

Private Sub Com_Start_Click()
    Com_Start.Enabled = False
    Call Main
    Unload UserForm1
End Sub


'ユーザーフォームのクエリクロースイベント

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    End
End Sub


'ユーザーフォームのイニシャライズイベント
Private Sub UserForm_Initialize()
    UserForm1.Width = 220
End Sub


サンプルダウンロード ⇒ コチラよりダウンロードできます。(別館)


■格言

まずは完成させることが大切
あとは努力と工夫次第


ボスキャラクターの動きなど、サンプルと併用してみるとわかりやすいと思います。

関連記事






Comment

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)
このコメントは管理人のみ閲覧できます
  • #
  • 2008.03.25(Tue)
  • Edit
このコメントは管理者の承認待ちです
  • #
  • 2009.11.22(Sun)
  • Edit

メールフォーム

影斬に物申すという方はこちら

名前 :
メール:
件名 :
本文 :

可能な限り要望には応えますが、必ず返信や回答ができることを、保障するものではありません。
ご了承ください。

Chapters

コンテンツ一覧


■Chapter 一覧■
    全てのChapterの一覧です。
    直接アクセスしたい方はこちらをご利用下さい。

    Chapter.1 [ 知っておくべき心得 ]
    Chapter.2 [ Excelってなんだろう ]
    Chapter.3 [ Excelの基本画面 ]
    Chapter.4 [ VBAとは? ]
    Chapter.5 [ モジュールについて ]
    Chapter.6 [ 変数 ]
    Chapter.7 [ 変数の型と宣言 ]
    Chapter.8 [ プロシージャとスコープ ]
    Chapter.9 [ ゲームつくる様々な手法 ]
    Chapter.10 [ ユーザーフォーム ]
    Chapter.11 [ プロパティウィンドウ ]
    Chapter.12 [ 乱数 ]
    Chapter.13 [ 条件分岐 ]
    Chapter.14 [ ゲーム画面のデザイン ]
    Chapter.15 [ コード記述の基本作法 ]
    Chapter.16 [ じゃんけんゲーム:1 名前をつける ]
    Chapter.17 [ じゃんけんゲーム:2 フォームの起動 ]
    Chapter.18 [ じゃんけんゲーム:3 乱数の種 ]
    Chapter.19 [ じゃんけんゲーム:4 イベント ]
    Chapter.20 [ じゃんけんゲーム:5 引数 ]
    Chapter.21 [ じゃんけんゲーム:6 役判定 ]
    Chapter.22 [ じゃんけんゲーム:7 予測と制限 ]
    Chapter.23 [ Withステートメント ]
    Chapter.24 [ 画像を表示させる ]
    Chapter.25 [ 画像表示の発展形 ]
    Chapter.26 [ 繰り返し処理 For文 ]
    Chapter.27 [ 繰り返し処理 Do~Loop文 ]
    Chapter.28 [ Exitステートメント ]
    Chapter.29 [ フォーム上の位置情報 ]
    Chapter.30 [ API基礎知識 ]
    Chapter.31 [ API補足知識 ]
    Chapter.32 [ メインループを考える ]
    Chapter.33 [ 同期処理の概念 ]
    Chapter.34 [ 移動処理その1:画面設定と考え方 ]
    Chapter.35 [ 移動処理その2:DoEvents ]
    Chapter.36 [ 移動処理その3:キー入力判定API ]
    Chapter.37 [ 条件分岐のさらなる探求 Select Case ]
    Chapter.38 [ アニメーション ]
    Chapter.39 [ 配列変数 ]
    Chapter.40 [ ゲームの初期化 ]
    Chapter.41 [ シューティングゲーム1:ゲーム設計 ]
    Chapter.42 [ シューティングゲーム2:メインプロセス ]
    Chapter.43 [ シューティングゲーム3:構造体 ]
    Chapter.44 [ シューティングゲーム4:定数 ]
    Chapter.45 [ シューティングゲーム5:プレイヤーキャラクター ]
    Chapter.46 [ シューティングゲーム6:ショットを撃つ① ]
    Chapter.47 [ シューティングゲーム7:ショットを撃つ② ]
    Chapter.48 [ シューティングゲーム8:Mod演算子の活用 ]
    Chapter.49 [ シューティングゲーム9:敵キャラクター登場 ]
    Chapter.50 [ シューティングゲーム10:衝突判定 ]
    Chapter.51 [ シューティングゲーム11:衝突の実体 ]
    Chapter.52 [ シューティングゲーム12:敵の攻撃 ]
    Chapter.53 [ シューティングゲーム13:爆発エフェクト ]
    Chapter.54 [ シューティングゲーム14:残機数表示① ]
    Chapter.55 [ シューティングゲーム15:残機数表示② ]
    Chapter.56 [ シューティングゲーム16:スコアの表示 ]
    Chapter.57 [ シューティングゲーム17:タイトル画面 ]
    Chapter.58 [ シューティングゲーム18:ボスキャラクター ]
    Chapter.59 [ シューティングゲーム19:最後の仕上げへ ]
    Chapter.60 [ シューティングゲーム20:いよいよ完成STG ]
    Chapter.61 [ カードゲームで使えるめくり効果 ]
    Chapter.62 [ ラジアンと角度 ]
    Chapter.63 [ ラジアンの活用:円運動 ]
    Chapter.64 [ ラジアンの活用:任意の角度へ移動する ]
    Chapter.65 [ APIによるサウンド再生:基礎 ]
    Chapter.66 [ APIによるサウンド再生:MIDIと多重再生 ]
    Chapter.67 [ APIによるサウンド再生:MCIコマンドとループ再生 ]
    Chapter.68 [ Function プロシージャ ]
    Chapter.69 [ 値渡しと参照渡し ]
    Chapter.70 [ デバッグ1:イミディエイトウィンドウ ]
    Chapter.71 [ デバッグ2:ローカルウィンドウ ]
    Chapter.72 [ デバッグ3:コード実行の中断 ]
    Chapter.73 [ オブジェクトってなんだ ]
    Chapter.74 [ プロパティ・メソッド・イベント ]
    Chapter.75 [ オブジェクト変数 ]
    Chapter.76 [ オブジェクトとコレクション ]
    Chapter.77 [ 特殊な繰り返し:For Each ]
    Chapter.78 [ エラー処理 ]
    Chapter.79 [ On Error と GoTo文 ]
    Chapter.80 [ Resumeステートメント ]
    Chapter.81 [ バイトとビット ]
    Chapter.82 [ ウィンドウメッセージとイベント ]
    Chapter.83 [ 文字列の基礎 ]
    Chapter.84 [ 文字列操作① ]
    Chapter.85 [ 文字列操作② ]
    Chapter.86 [ タイピングゲーム1:仕様を決める ]
    Chapter.87 [ タイピングゲーム2:キー入力検知 ]
    Chapter.88 [ タイピングゲーム3:文字列照合 ]
    Chapter.89 [ タイピングゲーム4:判定関数 ]
    Chapter.90 [ タイピングゲーム5:ゲーム画面設計 ]
    Chapter.91 [ タイピングゲーム6:問題文のソート ]
    Chapter.92 [ タイピングゲーム7:動的配列 ]
    Chapter.93 [ タイピングゲーム8:キーダウンイベント ]
    Chapter.94 [ タイピングゲーム9:正打数の表示 ]
    Chapter.95 [ タイピングゲーム10:タイムの表示 ]
    Chapter.96 [ クリックゲーム1:イベントの種類 ]
    Chapter.97 [ クリックゲーム2:画面設計 ]
    Chapter.98 [ クリックゲーム3:クリック座標検知 ]
    Chapter.99 [ クリックゲーム4:キャラクター準備 ]
    Chapter.100 [ クリックゲーム5:キャラクターの配置 ]
    Chapter.101 [ クリックゲーム6:キャラクター移動とNot演算子 ]
    Chapter.102 [ クリックゲーム7:クリックのヒット判定 ]
    Chapter.103 [ クリックゲーム8:ヒットマークエフェクト ]
    Chapter.104 [ クリックゲーム9:サウンド処理の実装 ]
    Chapter.105 [ クリックゲーム10:マウスカーソルの変更 ]
    Chapter.106 [ ブロック崩しゲーム1:仕様と概要を決める ]
    Chapter.107 [ ブロック崩しゲーム2:基本概念の確認 ]
    Chapter.108 [ ブロック崩しゲーム3:ベクトルとは ]
    Chapter.109 [ ブロック崩しゲーム4:変数や定数の宣言 ]
    Chapter.110 [ ブロック崩しゲーム5:初期化処理の実装 ]
    Chapter.111 [ ブロック崩しゲーム6:ブロックの配置 ]
    Chapter.112 [ ブロック崩しゲーム7:根幹処理とバーの処理 ]
    Chapter.113 [ ブロック崩しゲーム8:線分と線分の交差を判定 ]
    Chapter.114 [ ブロック崩しゲーム9:線分同士の交点 ]
    Chapter.115 [ ブロック崩しゲーム10:ボールの処理 ]
    Chapter.116 [ ブロック崩しゲーム11:最終調整して完成へ ]
    Chapter.117 [ テキストファイル操作基礎 ]
    Chapter.118 [ テキストファイル操作:読み込み編 ]
    Chapter.119 [ テキストファイル操作:CSV読み込み編 ]
    Chapter.120 [ テキストファイル操作:様々な読込編 ]
    Chapter.121 [ テキストファイル操作:バイナリ編 ]
    Chapter.122 [ テキストファイル操作:暗号化編 ]
    Chapter.123 [ テキストファイル操作:復号化編 ]
    Chapter.124 [ クラスモジュールとは ]
    Chapter.125 [ クラスモジュール:メソッド編 ]
    Chapter.126 [ クラスモジュール:プロパティ編 ]
    Chapter.127 [ クラスモジュール:イベント拡張編 ]
    Chapter.128 [ クラスモジュール:イベント自作編 ]
    Chapter.129 [ APIによる描画処理1:ハンドル ]
    Chapter.130 [ APIによる描画処理2:デバイスコンテキスト ]
    Chapter.131 [ APIによる描画処理3:ペン オブジェクト ]
    Chapter.132 [ APIによる描画処理4:ブラシ オブジェクト ]
    Chapter.133 [ APIによる描画処理5:図形描画準備編 ]
    Chapter.134 [ APIによる描画処理6:図形描画実践編 ]
    Chapter.135 [ APIによる描画処理7:画像描画の仕組み編 ]
    Chapter.136 [ APIによる描画処理8:ビットブロック転送編 ]
    Chapter.137 [ APIによる描画処理9:ラスタオペレーション ]
    Chapter.138 [ APIによる描画処理10:マスク描画 概念編 ]
    Chapter.139 [ APIによる描画処理11:マスク描画 実践編 ]


    コードやVBAに関する質問などはサポート掲示板(別館)までお気軽にどうぞ。




fc2 seotool Excel VBA ゲーム プログラミング 講座

Counter

twitter


Shadow BBS - 影掲示板

VBA 関連書籍



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。