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

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

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



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


スポンサーサイト

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






Chapter.59 [ シューティングゲーム19:最後の仕上げへ ]

■コードの修正と追加

前回に引き続き、ボスキャラクターの処理に関してやっていきます。
修正する箇所が多くなりますので、ちょっと大変ですが頑張っていってみましょう。

まずは、敵キャラクターの出現を管理しているプロシージャ、Stage_Countの修正からです。

今の状態では、ゲームを止めるまで、永遠に敵キャラクターが出現し続ける仕様になっています。これを、ボスキャラクターが登場する仕様に修正して変更します。

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

上から順番に説明します。

まず①の部分。ゲームが開始されてから、1回ループするごとに変数Total_Countはプラス1ずつ増えていきます。そして、この変数の値を元にMod演算した結果が、変数TCMODに入ります。

ここでは、『TCMOD = Total_Count Mod 1000』という代入を行っていますので、変数TCMODに入る値は常に0~999の範囲に制限されます。ここまでは大丈夫ですか?
Mod演算子を使った計算では、『除算の余り』を得ることができます。つまり、ループのたびに無制限に増え続ける変数Total_Countを1000で割ると、その余りは『割り切れた場合の0』から『割り切れなかった場合の余り999』までの間におさまるというわけですね。
この余りをうまく利用して、Select Caseでの分岐を行いながら処理を行っているのです。

その次は変数Total_Countの値に応じて処理が分かれます。
もしも、変数Total_Countが2000よりも小さい数だった場合には、ザコ敵キャラクターの出現処理に移ります。ここでは、先ほど登場した変数TCMODの値を元にザコ敵キャラクターを出現させています。

そして、もし変数Total_Countが2000以上の数値になった場合、ここからがボスキャラクターの出現処理です。これが②の部分ですね。
ここでは、変数Total_Countが2000ちょうどだった場合にだけ、ボスキャラクターの出現処理を行っています。構造体の各要素に、値を設定します。

そして最後に③の部分で、変数Boss_BeginTrueにしています。これ以降は、この変数を参照することによって、ボスが出現しているということを判断することができるようになりました。


■ボスキャラクターの管理

さて、次はボスキャラクターを管理するプロシージャの作成です。こちらは結構長いプロシージャですが、今までやってきたことを応用したものに過ぎません。よく見てひとつずつ理解していってください。

Sub Boss_Action()

    Dim L As Long
    Dim LL As Long
    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

さて、①から見ていきましょう。
①の部分から、次の②までの間の部分では、ボスキャラクターの移動処理を行っています。今回のコードでは、単純に左右に往復するだけの動きになっています。

画面の外からボスキャラクターが登場し、縦位置が30を超えると左右往復の動きへと移行します。そして左右往復の動作に移ったあとは、構造体の要素Parの状態によって、今現在、左に向かって動いているのか、それとも右に向かって動いているのかを決めています。

構造体の要素Parの値が、0より大きい(つまり1以上)のときは、ボスキャラクターが右に向かって移動します。逆に、0以下の数値が設定されているときは左に向かって移動します。

②の部分では、敵キャラクターの出現管理と同じ手法を使って、ボスキャラクターの攻撃パターンを作っています。
Mod演算をうまく活用しているのがわかりますね。
変数TCMODの値によって、全部で5種類のショットを発射するようになっています。ちなみに、今はまだショットの種類が3種類しか定義されていません。4番目と5番目のショットについては、次の項でやります。

ショットについてはちょっと置いといて、次の③を見てみましょう。③以降の部分では、ボスキャラクターが破壊された場合の処理を行っています。これは、プレイヤーキャラクターの爆発エフェクトのときに、詳しく仕組みを解説しましたね。(Chapter55を参照)あれと同様の手法です。
ここでは、ループが100回まわるまで、10ループごとに爆発エフェクトを発生させています。ボスキャラクターなので、たくさん爆発が起こったほうが、それっぽい感じがするでしょ? 多分……。

そして最後に④の部分。ここでは、ボスキャラクターが完全に消えたところで、ゲームの進行状況を『ゲームのクリア』を表す状態に変更しています。『Game_Mode = 3』の部分ですね。

これをやっておかないと、ボスキャラクターを破壊したのに、ゲームがクリアできないという状態になってしまいます。忘れずに設定しておきましょう。


さて、これで残すはショット関連の処理だけです。
ボスキャラクターを含めた敵キャラクターが放つショットの修正、そしてプレイヤーキャラクターが放つショットの修正。このふたつを行えば、晴れてシューティングゲームが完成します。

内容的にかなり縦長になってしまいますので、これは次回です。ちょっとまどろっこしい気もしますが、今回の内容をまずはしっかり理解してください。

目新しい技術は特にありません。全てが今までの応用になっています。一見するとわかりにくい部分でも、ゆっくり順番に条件分岐などを踏まえて考えていけば、おのずと何をやろうとしているのかわかるはずです。ここまで地道に進めてきてくださっていれば尚更です。

いきなりこのページから見始めている方にとっては、ちょっと難しい内容になっているかもしれません。わからないことがあれば、必要に応じて過去の講座に戻ってやってみるといいでしょう。なんにしても焦りは禁物です。自分のレベルに合わせて、わかるところからじっくり取り組みましょう。


次回はいよいよシューティングゲーム講座の最終回。あと少しだけ、頑張ってほしいと思います。


■格言

Mod演算子を活用する
わかることからコツコツと


次回はいよいよ完成させます。
自分で言うのもなんですが、長かったなぁ……。

関連記事






Comment

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)

メールフォーム

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

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

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

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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。