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

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

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



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


スポンサーサイト

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






Chapter.44 [ シューティングゲーム4:定数 ]

■プレイヤーキャラクターの処理……の前に

前回、プレイヤーキャラクターの処理を見てみるとか言っておきながら、結局、構造体の説明だけで終わってしまいました。意外と構造体の説明が長くなってしまって、途中から軌道修正してしまったからです。
今回はちゃんとプレイヤーキャラクターの処理を見ていきたいと思ったわけですが、準備をしなければならない部分が、実はまだ残っています。
それは、ゲームの根本的な部分の準備です。

実は、今回は実際のキャラクター処理を解説するつもりでした。ですが、このテキストを書いている時点で、いつもの2倍以上のドキュメントになりつつあります。これは一度に解説するべき量ではないな、と思ってしまいました。ちょっとボリュームがありすぎるのです。

そこで今回は、ちょっと私的にも残念なんですが、プレイヤーキャラクターの処理にスムーズに移行するために、最低限必要な根本的な処理をしっかり解説することにしました。
メインプロセスや、初期化処理など、あらかじめしっかり定義しておかないと後で困る部分が、シューティングゲームを作成するうえでどうしても出てきます。
逆に考えてみると、ここが適当では、全体が適当になってしまいまので、いい加減ではいけないと思ったのです。

そんなわけで、今回はシューティングゲームの根本部分を、しっかり固めていきたいと思います。ここで手抜きをすると、後でろくなことにならないので、焦る気持ちを抑えてがんばってください。

今回の内容は、前回解説した構造体の仕組みが理解できていないと、ちょっときつい部分が多いです。
もし、構造体ってなんじゃ? と思う方がいらっしゃったら、面倒でも、前回の講座をしっかり理解したうえで、チャレンジしてくださいね。


■ユーザーフォームへの追加項目

それでは早速とりかかりましょう。
今回作成するシューティングゲームは、プレイヤーキャラクターとして、次の画像を用意しました。以前の使いまわしでちょっと恐縮ですが、実はちょっとだけグラデーションなどが細かくなっているとかいないとか……。

Red_20080208121115.gif

この画像をフォーム上に用意したイメージコントロールにロードします。ここでポイントとなるのは、イメージコントロールを新たに追加する『場所』です。

以前の講座で今回のゲーム用の、ユーザーフォームの雛形を作りましたね。そこにはフレームコントロールが配置されていたはずです。そのフレームコントロールを、ゲームの画面として扱うと解説したのですが覚えているでしょうか。
今回追加するイメージコントロールは、キャラクターそのものとして使います。ですから、フレームコントロールの中に収まるように、あたらしくイメージコントロールを追加します。
それが次の画像。

230.gif

先ほどのキャラクター用画像の大きさは24×24ピクセルです。つまり、イメージコントロールの幅を定義する『WidthHeight』の2つのプロパティは『18』となります。これはピクセルとポイントという、単位の相違から生まれる変更点でしたね。
そのほかにも、透過処理設定や、枠線の非表示設定など、やるべきことをしっかりやっておきましょう。(詳しくは以前の解説を参照→Chapter24Chapter25)

ここまでうまくいったら、このプレイヤーキャラクター用のイメージコントロールの、名前を変更しておきます。今回は『Player』という名前にすることにします。
こうしておくことで、あとでプロシージャからこのコントロールを参照するときにわかりやすくなります。

231.gif


■コーディング

さて、早速実際のコーディングに入ります。いよいよ本格的にゲームを作成し始める段階に突入です。


まず、標準モジュールを挿入します。
そして、モジュールの先頭部分で宣言しなければならない『API宣言』や『構造体宣言』を準備しましょう。

モジュールの先頭に記述
'◆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

'●キャラクター 変数宣言
Public Player_Data As Chara


今回のゲームで使用する3つのAPIを宣言し、キャラクターを表す構造体を定義します。そして、定義した構造体を変数の型として、プレイヤーを管理する変数を宣言します。ここまでは大丈夫でしょうか。

ポイントは、プレイヤーを管理する『変数Player_Data』の扱いです。ここでは、モジュールの先頭でDimではなく、Publicを使って宣言しています。
こうすることで、この変数Player_Dataは、どのプロシージャからでも参照できるようになります。つまりスコープがVBA内部の全ての範囲に広がるわけですね。これは以前にも解説しました。

今回のゲームでは、プレイヤー処理以外の部分でも、この変数を参照する可能性があります。例えば、敵キャラクターが放った弾との当たり判定を行う場合など、絶対にプレイヤーキャラクターの情報が必要になりますよね。こんなときに、通常のプロシージャ内Dim宣言の変数は、外部のプロシージャから参照できないので使えません。
そのため、Publicを使って変数を宣言しておき、プロジェクト内のどのプロシージャからでも、この変数を参照できるようにしておくわけです。


次に、このモジュールの先頭部分で、『定数』というものも宣言しておきます。
定数は初めて登場した概念なので、簡単に解説しておきましょう。


■定数とは

定数は、あらかじめ内容の決まっている変数みたいなもの、と考えることができます。『定数』という名前からもわかるように、その中身の内容は常に一定していて、あとから変更することはできません
変数とは違って、あとから自由に中身を変えたりできないのです。これが何の役に立つのでしょうか? ちょっと疑問に思いますよね。

例えば皆さんが、唐突に『キャラクターを表すコントロールって幅いくつだっけ?』と聞かれて、即答できるでしょうか。よ~く読みながらここまで進めてきていれば、『18ポイントだよ!』とすんなり答えられるかもしれませんが、普通はなかなか即答できないと思います。いちいち覚えてられないですし、時間が経つとだんだん忘れていってしまうのが普通でしょう。
こんなとき、あらかじめ定数として『Player_Size』という定数を宣言しておけば、幅が何ポイントだったかなんて覚えておく必要はありません。

Const Player_Size As Long = 18

このように定数を宣言しておくと、コード内で、変数と同じようにPlayer_Sizeという定数を使うことができます。Long型で宣言されているので、整数データを扱うということが想像できると思います。

Constというキーワードに続けて、定数名、データ型を指定します。これは変数の宣言がDimからConstに変わっただけと思えば簡単ですね。
変数と異なる点は、最後にあらかじめ値を代入しておくという点です。先ほども書いたように、定数は後から内容を変更したりすることはできません。あくまでも、宣言の段階でデータを格納しておかなくてはいけません。

キチンと定数の宣言ができていれば、あとは変数と同じように、中身のデータを使ってコードを記述できます。例えば次のように記述した場合には、『9』というメッセージが出ます。

Const Player_Size As Long = 18

Sub Const_Test()
    Dim L As Long
    L = Player_Size / 2
    MsgBox L
End Sub

定数は、あくまでもプログラマーが開発を行いやすくするための仕組みです。絶対に使わなくてはならない、という類のものではありません。
しかし、私は定数をある程度積極的に使っていくことをオススメします。なぜなら、発展したゲームプログラミングを行うときには、定数が避けて通れない概念のひとつとなるからです。

例えば、一通りコードが書きあがってから、諸事情によりプレイヤーキャラクターの大きさを変更したくなったとしたらどうでしょうか。
色々な場所で、キャラクターの大きさを計算に使っていたとしたら、その全てを探し出して、ひとつひとつコードを修正しなくてはいけなくなります。
そんなとき、全てが定数で管理されていたとしたら、定数の中身を変えるだけで、全部の処理がスムーズに変更できます。あとからキャラクターを倍の大きさに変えたくなったとしたら、定数に代入している数値を『18』から『36』に変更するだけで、修正が済んでしまうわけです。

先々を見越して、修正しやすいコードを記述するためには、定数の概念が重要なのですね。ですから今回も、プレイヤーキャラクターの大きさは、定数で管理することにしてみましょう。
それと、キーの入力判定に使う定数も、併せて宣言しておきます。GetAsyncKeyState関数に渡すキーコードですね。
これもいちいち覚えていられないし、数字のままだとわかりづらいので、面倒だから定数化します。

それを踏まえた、現段階でのモジュール先頭部分が次のコードです。

'◆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

'●キャラクター 変数宣言
Public Player_Data As Chara

'▲定数宣言
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 Player_Size As Single = 9
'プレイヤーキャラクターを表す、イメージコントロールの実際の幅(大きさ)
'ただし、あとで使いやすいように2分の1にしておく
'実際は18ポイントなので9を設定、半分にする理由は次回以降

これで、現段階のモジュール先頭部分はOKです。


■忘れちゃいけない初期化処理

次にやらなくてはならないのが以前にも解説した『初期化処理』です。
ここであらかじめキャラクターの初期表示位置や、変数の状態などを設定しておきます。

ここはいきなりコードを載せてしまって解説します。

初期化処理を行うプロシージャ
Sub Init()
    With Player_Data
        .X = 100 '横位置を画面の中央
        .Y = 180 '縦位置を画面の下あたり
        .W = 0 'まだ使用しないので0
        .H = 0 'まだ使用しないので0
        .Lif = 1 '存在しているのでライフは0より大きい
        .Typ = 0 'プレイヤーはタイプ0
        .Par = 0 'まだ使用しないので0
    End With
End Sub

これが初期化処理を担当するプロシージャです。名前は『Init』としました。英語で『データなどを初期値にセットする・初期化する』という意味の『Initialize』から取っています。モジュールの先頭部分がキチンと準備できたら、その下にこのプロシージャを記述しておきましょう。

ここで実際にやっていることは、プレイヤーキャラクターを管理する変数Player_Dataの初期化だけです。これはあくまでも現段階での仕様です。
将来的には、ありとあらゆるゲーム内部のデータを、このプロシージャで初期化することになりますが、今はまだプレイヤーキャラクターだけなので、結構短いですね。

プレイヤーキャラクターは、横位置を表す『 X 』が初期値で100です。
ゲーム画面の役割を果たすフレームコントロールが、横幅200ポイント(Width = 200)に設定されていましたよね。ですから、ちょうどその半分となる100という数値は、フレームのちょうど中央になります。

そして同様に、縦の位置『 Y 』は180に設定しておき、画面の下のほうに表示されるようにしておきます。

232.gif

あとはほとんど現段階で使用しないので、とりあえず0(ゼロ)にしておきます。ライフだけは、死んでいるか生きているかを判断するのに使うので、とりあえず1にしておきます。
これで今回の初期化処理はOKです。

ただし、ここで注意して欲しいのは、今設定しているのは『あくまでもデータ上のキャラクターの位置』だということです。ここにデータを設定しただけでは、画面上には反映されません。
画面上に反映させるためには、別途、ユーザーフォーム上の処理を行う際の設定が必要です。と言われても、ちょっとわかりにくいですね。

感覚的には、絵を描こうと思ったが、頭に思い描いただけで実際に紙に描いたわけではない、という感じでしょうか。
この講座で解説する今回のシューティングゲームでは、先にデータを加工して、後からこのデータを使って画面を更新します。表示される位置の計算や、敵の撃った弾との当たり判定など、処理の大半は『Player_Data』などの変数で一気に行ってしまいます。これは今後登場する敵キャラクターなどの処理でも同様です。
変数などの内部的なデータで計算をして、全ての計算が完了した時点で、それらのデータをもとに、イメージコントロールなどを配置していくわけです。

画面上に実際に位置情報を反映させるのは、プレイヤーキャラクターを処理するプロシージャの中で行います。これは次回こそ、ほんとに解説できるはずです。

キャラクターの処理を行うプロシージャを作成し、キャラクターを正しく動作させるためには、今回の内容が絶対不可欠です。前置きが非常に長くなってしまって申し訳ないですが、焦らず、しっかり準備をしておいてください。


■格言

定数はあとから中身を変更できない
定数を使うと後から修正するのが容易
根本部分をしっかり設計


次回の内容を理解するためにも、今回の内容は重要です。
関連記事






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