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

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

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



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


スポンサーサイト

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






Chapter.42 [ シューティングゲーム2:メインプロセス ]

■軸となる処理

前回から始まったシューティングゲーム作成講座。
第1回目から、なにかとやることが多くて大変でしたね。中には、自分には無理だと、諦めてしまった人もいるかもしれません。

しかし、おどすわけではないのですが、前回の内容はまだ、比較的簡単なことしかやってません。というより、ゆっくりやれば決して難しくはない、という程度のことしかやっていないのです。
焦る必要はありません。なぜなら、一度で全てを理解しなくたっていいんですから。仕事で追い込まれながらプログラミングしてるわけじゃあるまいし、気長に、わかるところからやっていけばいいんです。

諦めてしまったら全てが終わりです。少なくとも、私のほうではキチンと動作確認をして、大丈夫だったコードだけを掲載していますから、うまくいかないときは見比べれば必ず何か原因が見つかるはずです。


さて、今回の内容は『メインプロセス』と題しました。
以前の講座で、メインループについて解説しましたが、要するにそれと同じようなものです。
今回はキチンとシューティングゲームを作るために、その軸となる、メインのコードを考えます。ここがコードの全体像を設計する上で、一番大切な部分といっても過言ではありません。

しかし、メインプロセスとは一体どういうことなのか、いきなり想像するのは難しいと思います。まずはメインプロセスとは何なのか、そこから解説していきましょう。


■コードの部品化

今までの講座では、いちいち説明こそしませんでしたが、基本的に『プロシージャの部品化』という手法でコードを書いてきました。

例えば、以前解説したキャラクターの移動処理や、アニメーション処理などは、全て『コマンドボタンから別のプロシージャを呼び出す』という手順で行っていましたね。
コマンドボタンをクリックすると、そこから別のプロシージャが呼び出される、というヤツです。
しかし、実際には、このような回りくどい方法を使わなくても、コマンドボタンのクリックイベントそのもので、移動処理やアニメーション処理を行うこともできたのです。コマンドボタンのクリックイベントに、全ての処理をまとめて記述しておけば、それでキチンと同じことが実現できてしまいます。

それならば、なぜ、わざわざ別のプロシージャを用意して、それを呼び出すなんて面倒なことをしたのか。これは、今回のメインプロセスという考え方に、スムーズに移行できるようにしたかったからです。


ゲームのプログラミングというのは、ほとんどの場合、きわめて複雑な処理を求められます。しかもそのときどきの状況によって、いろいろなことを想定しながら処理していかなくてはいけません(ゲームに限ったことではないですけどね)。
例えばロールプレイングゲームなら、今現在はタイトル画面なのか、それともマップ画面なのか、はたまた戦闘中の画面なのか。もしかしたらアイテムを使おうとしているのか、魔法を唱えようとしているのか、武器の装備を変更しようとしているのか……。ゲーム中の状況なんて、挙げていったらキリがありませんね。

こういった、状況によって様々に変化する処理を、全て同じプロシージャとして記述していくのは、絶対的に技術面で難しいのが想像できますよ。しかもコードが膨大な量になるため見づらい、読みづらい、わかりづらい。まぁ要するにいいことがないわけです。

しかし、状況によって異なる処理を、それぞれ個別のプロシージャに分けておいたらどうでしょうか。

タイトル画面を表示する専用のプロシージャがあるなら、それだけ呼び出していればタイトル画面はOKですね。同様に、マップ画面専用の処理だけを記述したプロシージャを用意しておけば、それだけでマップ画面は問題なし。
アイテムを使用するときのためのプロシージャが用意してあれば、ゲームの進行がどのような状態であっても、それだけ呼び出せばいつでもアイテムの使用ができるはずですね。

これが『コードの部品化』つまりは『プロシージャの部品化』です。
複雑な処理が求められる場合でも、それぞれが個別に管理されていれば、プログラムはそれを呼び出すかどうかの判断だけで、キチンと動くようになります。プログラミングをする我々から見ても、これなら非常にわかりやすいですね。
バグが出てしまった場合にも、特定の状況ごとに分けて管理しているので、どこでバグが発生しているのか一目瞭然です。修正する場所はどこなのか、すぐに察しがつきます。
アイテムを使おうとして不具合が発生したなら、アイテムの処理を担当しているプロシージャが怪しいのがすぐにわかるというわけです。

今回のテーマであるメインプロセスとは、これらの部品化されたプロシージャを、いつ、どうやって呼び出すかを管理するプロシージャを指します。人間で言えば、脳にあたる部分ですね。

人間がテーブルの上にあるりんごを取りたいと思ったら、脳が指令をだして手を動かすでしょう。これと同じように、ゲーム中でなにかをしたいと思ったら、このメインプロセスから目的の処理を呼び出すようにするのです。


■シューティングゲームの構造化

シューティングゲームを作成する場合でも、メインプロセスから部品化されたコードを呼び出す、という設計は非常に有利です。なぜなら、シューティングゲームにも、実に様々な状況があるからです。

とりあえず、簡単なところだけ列挙して一覧にしてみましょう。

ゲーム設定の初期化処理
ゲームが終了されようとしているかどうか判断する処理
タイトル画面の処理
プレイヤーの操作する機体の処理
敵ザコキャラクターの処理
プレイヤーの撃った弾の処理
敵キャラクターの撃った弾の処理
ボスキャラクターの処理
敵が出現するかどうか判断する処理
爆発などのエフェクトの処理
スコアの更新などその他の処理
ゲームオーバーやクリアなどの判断処理
想定外の状況、つまりエラーが出た場合の処理

ほとんど最低限のことだけですが、それでもこれぐらいはあります。なんとまぁ……。

もっとこった演出をしようと思ったら、その分だけ処理の種類が増えます。例えばパワーアップアイテムとかを設けるなら、アイテムの処理も必要です。スコアランキング画面を取り入れたいなら、それも用意しなくてはいけないでしょう。単なるショットでの攻撃だけでなくボムも使いたいと思ったら、それも用意しなくちゃいけませんね。

とにかく、先ほど挙げたのは、ほとんど最低限度の処理だけです。それでもこれだけあるんですね。ちょっと気が遠くなってしまいますか? 大丈夫でしょうか……。心配です。

でも、ここで諦めないでください。
これから先、講座を進めていく中で、上であげた処理をひとつひとつ解説していくつもりです。1回の講座で、できる限り焦点を絞って解説していきます。今までもそうでしたが、焦らずひとつずつこなしていけば、最後には必ず作品が仕上がります。最終的には絶対できるんです。ですからここで簡単に諦めたりせず、がんばってついてきてほしいと思います。


■メインプロセスの実体

それでは、具体的なメインプロセスをコードにしてみましょう。

大切なことは、以前解説したメインループの構造をよく理解していることです。それさえわかっていれば、たいしたことはありません。
それでは早速下のコードを見てください。

Sub Main() 'メインループとなるプロシージャ
    Dim Flg As Boolean
    Dim Stm As Long
    ゲーム設定の初期化処理
    Flg = False
    Do Until Flg
        Stm = GetTickCount
        Select Case 現在のモード
            Case タイトル画面モード
                タイトル画面の処理
            Case ゲームのプレイ中モード
                敵出現判断処理
                プレイヤーの処理
                敵ザコキャラの処理
                敵ボスキャラの処理
                プレイヤーのショット処理
                敵キャラのショット処理
                エフェクトなどの処理
                スコアの更新処理
            Case プレイヤー死亡時モード
                ゲームオーバー処理
            Case ゲームクリア時モード
                ゲームクリア処理
        End Select
        DoEvents
        Do
            Call Sleep(1)
        Loop Until GetTickCount - Stm > 30
        ゲームが終了されようとしているかどうかの判断処理
        エラー時の処理
    Loop
End Sub

うおおぉっ! なんだこれはー!!

という心の叫びは置いといて、とりあえずこのような感じにやっていきますよ、というところだけ理解してください。見た目の複雑さにビビッてはいけません。

上に挙げたコードが、メインプロセスとなるプロシージャです。このプロシージャの名前はそのものズバリ『Main』となっています。

まず、コードが実行されると、始めに変数などのリセットを行う初期化処理があります。ここで、ゲームの設定を一度全て白紙に戻して、繰り返しゲームをプレイしても環境が変化しないように配慮します。
前回のスコアなどが残っていると、おかしなことになりますもんね。そのための初期化処理です。

次に、Do文を使ったメインループが始まります。
その中で、現在のモードとなっている部分がありますね。これは現在のゲームの進行状況を表しています。進行状況に応じて、Select Case文で処理を分岐するようにしているわけです。

もし、現在のモードがタイトル画面なら、その下のタイトル処理に進みますし、ゲームのプレイ中だったらそれに応じた処理に移ります。
もし状況が変化したときは、この現在のモードだけを変更すれば、あとは勝手に分岐していくという寸法です。

最後のほうでは、ゲームの終了処理が出てきていますね。
プレイヤーがどんな状態の時にゲームを終了するかはわかりません。終了したいときに、キチンと処理が終了するようにするために、これはしっかりやっておかなくてはいけません。

さらに一番最後にはエラーの処理を設けています。エラーが発生したときに、思わぬ事態を招かぬように、ここでしっかり設定をしておきます。


まずコードの全体像を把握できていれば、今の段階では問題ありません。メインプロセスとなる今回のコードから、状況に応じて、それぞれの処理を呼び出している、という仕組みが重要です。
このような構造のプログラムは、思わぬ不具合が発生したときに、その原因が探しやすいうえに、修正も簡単です。エラーが起きているプロシージャだけを修正すれば、ほかに影響が出にくいからですね。

さらに、機能の拡張という面でも優れています。
先ほども書いたように、もしアイテムが出現するように修正したいと思ったときには、あとからそれだけを管理するプロシージャを用意して、メインプロセスから呼び出されるように追加するだけでいいのです。


見た目はともかく、構造は比較的単純です。
時間がかかってもいいので、しっかり理解しておいてください。

次回からは、これらの『部品化されたコード』をひとつひとつ用意していきます。最終的には、上のメインプロセスからそれらが適宜呼び出され、ゲームとして完成します。
道のりは確かに長いですが、最後には必ず出来上がるはずです。がんばりましょう。私もがんばります。


■格言

メインプロセスは人間でいう脳
部品化されたプロシージャを適宜呼び出す


説明するのが難しい内容でした。大丈夫かなぁ……。
関連記事






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