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

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

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



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


スポンサーサイト

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






Chapter.40 [ ゲームの初期化 ]

■ゲームの初期化

ユーザーフォームでゲームを作成する場合に限らず、ゲームの初期化というのはとても重要です。

例えば、以前、キャラクターをアニメーションさせて表示させる方法を解説しましたね。その方法とは、あらかじめ用意しておいたイメージコントロールの画像を、キャラクターとなるイメージコントロールに転送する、というものでした(Chapter38を参照)。

この方法を使う場合、アニメーションの原画となるイメージコントロールが必要です。そしてそれは、あらかじめユーザーフォーム内に配置しておく必要がありましたね。

以前の講座の場合、わかりやすくするために、プログラムの実行中にも原画となるイメージコントロールが表示されたままになっていました。しかし実際にゲームとして仕上げる段階になったら、この原画となるイメージコントロールは、画面に表示されないようにしておかないと不自然です。
ゲームをプレイする際に必要なのは、あくまでもキャラクター本体だけであり、原画となるイメージコントロールが表示されているのはなんだか変です。

原画となるイメージコントロールは、こういった理由からゲームの最中には表示されないようにしておく必要がありますね。ですから、ゲームの開始と同時に行う『初期化処理』というものを設け、そこで表示しないようにしてしまえばいいわけです。


このように、ゲームを作成する場合には、初期化処理が非常に重要です。
毎回必ず同じように動作させるためにも、ゲームの開始と同時に、必要な項目をキチンと設定するべきなのです。
今回はそんな観点から、ゲームの初期化について見ていくことにしましょう。


■ユーザーフォームの表示プロセス

今まで、何度もユーザーフォームを扱っていますが、ユーザーフォームの起動に関する細かいプロセスについては解説してきませんでした。
この理由としては、とりあえず知らなくてもなんとかなる、というのが第一です。あまりプログラミングに親しくないときに、いきなりフォームの起動プロセスがなんたらかんたら……と言われても、なかなか理解できないのではないかと、私自身が考えたからでした。

しかし、ゲームの初期化を考える場合、特に、ユーザーフォームを使ったゲームの初期化を考える場合には、これを解説しなくてはなりません。

それほど難しい問題ではないので、ここまで順に進めてきてくれた方なら、特に問題なく理解できるはずです。焦らずゆっくり、今回の内容を進めてみてください。

ユーザーフォームが表示されてから、閉じられるまでの一連の処理は、おおよそ次のような感じで処理されています。

メモリ上にユーザーフォームがロードされる
    ▼
ユーザーフォームの表示前処理
ここでInitializeイベントが発生する
    ▼
ユーザーフォームが表示されアクティブになる
ここでActivateイベントが発生する
    ▼
何らかの方法でユーザーフォームが閉じられようとすると……
    ▼
ユーザーフォームが閉じる前の処理
ここでQueryCloseイベントが発生する
    ▼
ユーザーフォームが非表示になる
    ▼
ユーザーフォームの各種インスタンスがメモリから開放される
    ▼
ユーザーフォームのTerminateイベントが発生する

かなりわかりにくいことになっていますね。

ユーザーフォームはまず、メモリ上にロードされます。これから先、プログラム上で様々な処理を行うときには、このメモリを参照しながら処理が進みます。
メモリ上にフォームがロードされると、次にInitializeというイベントが発生します。そしてそのあと問題がなければユーザーフォームが実際に画面上に表示されます。表示された時点で、Activateイベントというイベントが発生します。

これで表示処理が完了。結構長いですね。

そして、フォームが閉じられようとすると、今度は閉じるときの処理が始まります。

まずは、閉じられようとした瞬間に、QueryCloseイベントが発生します。以前の講座で、このイベントに、全ての処理が止まるようにプログラミングをしましたよね。
これが終わると、フォームが非表示になり、同時にメモリ上にあったフォームのデータに関するインスタンスが開放されます。ただし、この時点ではまだ完全に処理が終了したわけではありません。最後にTerminateというイベントが発生します。このイベントが終わった段階で、ユーザーフォームを閉じる処理が完了します。う~ん、わけわかりません。
私自身がよくわかっていない部分もあるので、ちょっと言い回しや考えがおかしいところがあるかもしれません。気がついた人、教えてください。


■発生するイベントに注目する

なんだか先ほどのプロセスを見ると、ちょっとビビッてしまいますが、焦ってはいけません。大事なことはそれほど多くありませんので、ゆっくり見ていきましょう。

ここで大切なのはメモリ云々の話ではなく、発生するイベントのタイミングです。
ユーザーフォームが表示されて、閉じられるまでの間に、イベントが4つ発生していますね。これが今回の肝です。

イベントだけ抜き出して並べると、次のようになります。

①UserForm1.Initialize
    ▼
②UserForm1.Activate
    ▼
③UserForm1.QueryClose
    ▼
④UserForm1.Terminate

①から順番に見てみましょう。

Initializeイベントは、ユーザーフォームが表示される直前に発生するイベントです。
実は今回のテーマである『初期化』に大きく関わるイベントです。ユーザーフォームが表示される直前に発生するので、表示する前に何かやっておきたい場合には、このイベントを利用して処理を行います。

②ユーザーフォームがアクティブになったときに発生します。まぁイメージとしては表示された瞬間ですね。

③は、以前にも登場していますね。ユーザーフォームが閉じられる直前に発生するイベントです。もしも、閉じてしまう前に何かやっておきたいときなどは、このイベントを利用します。
以前、このイベントを使ってコードが全て止まるようにプログラミングしましたね。

④、Terminateはちょっと特殊です。ユーザーフォームを閉じる処理が一通り終わってから発生します。
ですからこのイベントが発生した時点では、すでにフォームは表示されていません。


今回のテーマ初期化処理は、先ほども書いたようにInitializeイベントに記述します。ゲーム画面となるユーザーフォームが表示される前に、初期化するべきところを全て処理してしまうように、コードを書きます。

それでは、具体的に初期化処理とはどのようなことを指すのでしょうか。


■ゲームの初期化するべき項目

ユーザーフォームでゲームを作成する場合には、見せたくないものを隠すのに、よくInitializeイベントを使います。

例えば以前アニメーション処理の解説をしたとき、このようなデザインのユーザーフォームを使いました。画像は以前の解説に使ったものをそのまま引用しています。

191.gif

しかし、このままでは、原画として使うイメージコントロール(Image1~3)も表示されたままになっています。ですからInitializeイベントが発生したときに、隠してしまうようにしてみましょう。

今回はアニメーションのときに解説したコードをそのまま流用します。もし、細かいところがわからないよ、という人は、以前の講座を先にご覧ください。そちらで詳しく解説しています(Chapter38を参照)。

前々回のコードでは、フォームモジュールに『コマンドボタンのClickイベント』と、『ユーザーフォームのQueryCloseイベント』の2つが記述されているはずです。
ここに、もうひとつのイベントプロシージャを追加します。それが『フォームのInitializeイベント』です。

'コマンドボタンのClickイベント
Private Sub CommandButton1_Click()
    Call Anim_Test
End Sub

'ユーザーフォームのQueryCloseイベント
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    End
End Sub

'ユーザーフォームのInitializeイベント
Private Sub UserForm_Initialize()
    CommandButton1.Left = Ima_Chara.Left '①
    UserForm1.Width = 150 '②
End Sub

上の2つのイベントプロシージャは前々回のときと全く同じです。一切、変更はしていません。
今回大事なのは、最後に追加された『ユーザーフォームのInitializeイベント』です。これが、初期化処理を行っている部分ですね。

具体的には何をしているかというと、『コマンドボタンの位置の変更』と、『ユーザーフォームの横幅の変更』です。
まず①の部分で、コマンドボタンの表示位置を変更しています。これは画像で表すとわかりやすいのではないでしょうか。

200.gif



201.gif

コマンドボタンの横位置(つまりLeftプロパティ)に、Ima_Charaというイメージコントロールの横位置を設定しています。つまり、この2つのコントロールの左端の部分が全く同じ横位置になったわけです。

次に②の部分で、ユーザーフォーム自体の横幅を変更して、少し狭くしています。
こうすることで、結果として、原画となる3つのイメージコントロールが見えなくなるという寸法です。

202.gif

あくまでも、ユーザーフォームのInitializeイベントでこの処理を行っていますので、もともとのレイアウトを変更する必要はありません。
このInitializeイベントを追加した状態で、ユーザーフォームを表示してみてください。キチンと表示される前に処理が行われ、コマンドボタンの位置変更と、ユーザーフォームの横幅変更が行われているはずです。

203.gif



■その他の初期化処理

先ほどのようにInitializeイベントをうまく活用すると、フォームのレイアウトをゲームの開始と同時に初期化することができます。

しかし、初期化しておいたほうがいい項目は、ユーザーフォームのレイアウトだけではありません。

例えば、Publicを使って宣言した変数の初期化などがそうです。
Publicで宣言した変数は、そのスコープがアプリケーション全体に及びます。これは言い換えると、Excel自体が終了するまでは、自動的に初期化されることはない、ということでもあるのです。

ですからPublic宣言された変数は、いったんコードの実行が止まってしまっても、コード内で設定したデータの内容が残ったままになっています。
もし、もう一度コードが実行されたときに、以前のデータが残っていてしまったら、これによって不具合が発生しないとも限りません。ですからこのようなケースでは、必ず最初に変数の状態も初期状態に戻すようにしておいたほうがいいでしょう。
つまり、Publicで宣言した変数など、以前のデータが残っている可能性があるものに関しては、Initializeイベントを使って、本来の初期値に戻すようにしておけばいいわけです。
ゲームの途中経過を、ワークシート上のセルに出力して残している処理などでも、最初にその範囲をクリアするようにしておけば、ゲーム起動後に不具合が出ることはないでしょう。

自分がどのような設計をしているのかをよく把握して、初期化するべきところは、フラットな元の状態に戻しておく癖をつけましょうね。


■格言

初期化にはInitializeイベントを活用する
Public宣言の変数なども最初に初期化しておく


繰り返し起動しても、不具合の出ないプログラムを設計しましょう。
関連記事






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