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

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

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



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


スポンサーサイト

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






Chapter.109 [ ブロック崩しゲーム4:変数や定数の宣言 ]

■いよいよ作成開始

前回は、ベクトルの簡単な概念の解説をしました。ベクトルというとなんとなく難しいイメージがありますが、プログラミングではベクトルの意味よりも使い方が重要です。概念的な部分は、まずは曖昧でも構いません。実際に使いながら、徐々に理解していけばいいでしょう。

さて、今回からは実際にプログラミングを開始します。焦らず落ち着いて、ひとつひとつこなしていきましょう。

今回もいつものように、まずは初期化処理から実装していきます。
ブロック崩しの初期化処理では、ボールやバーの位置を整えたり、ブロックを配置したりといった処理を行います。また、一連の初期化処理がしやすいようにするために、定数なども活用しながら処理していきます。今回の講座では、主に変数などの宣言部分を中心に解説します。


■変数と定数の定義

それでは今回のブロック崩しに登場する、変数や定数を見てみましょう。
ポイントとなるのは、ボールやバーなどの大きさを、定数であらかじめ定義しておくという部分です。大きさをあらかじめ定数で管理するようにしておくことで、あとあと様々な恩恵が受けられます。どんな恩恵を受けられるのかは、あとで詳しく説明します。まずは標準モジュールをひとつ挿入し、次のように記述しましょう。

'■APIの宣言
Declare Function GetTickCount Lib "kernel32" () As Long
Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Long
Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMillsecounds As Long)

'■構造体の定義
Type Balls 'ボール管理構造体
    aX As Single
    aY As Single
    bX As Single
    bY As Single
    vX As Single
    vY As Single
    Sp As Single
    Vis As Boolean
End Type

Type Blocks 'ブロック管理構造体
    X As Single
    Y As Single
    Vis As Boolean
End Type

Type Vector 'ベクトル構造体
    X As Single
    Y As Single
End Type

'■変数の宣言
Public Ball As Balls 'ボール
Public Block(1 To 25) As Blocks 'ブロック(配列)
Public Bar As Vector 'バー

'■定数の宣言
Const W_Field As Single = 250 'フィールド横幅
Const H_Field As Single = 300 'フィールド縦幅
Const W_Ball As Single = 10 'ボールの大きさ
Const W_Block As Single = 50 'ブロック横幅
Const H_Block As Single = 20 'ブロック縦幅
Const T_Block As Single = 20 '最上段ブロックの位置
Const W_Bar As Single = 48 'バーの横幅
Const H_Bar As Single = 12 'バーの縦幅
Const T_Bar As Single = 280 'バーの位置(Top)

Const PI As Single = 3.14159 '円周率

いきなり盛りだくさんですね。
ですが、特に難しいことはありません。順番に見ていきましょう。

始めに登場するのが API の宣言です。

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

今回は、みっつの API を使います。
GetTickCount は、パソコンが起動してから現在までの時間を、ミリ秒単位で返してくれる API です。同期処理を行うためにある程度精度の高いタイマーが必要になりますので、この API を使います。GetAsyncKeyState はキーの入力を検知するために使います。講座内でなんども使っているのでお馴染みですね。そしてもうひとつの API が Sleep です。こちらもなんども登場しているので大丈夫でしょう。Sleep はミリ秒単位でスレッドを停止させる API で、ゲームの処理が高負荷になりすぎないようにするために欠かせません。

次に登場するのが、構造体の定義ですね。

Type Balls 'ボール管理構造体
    aX As Single
    aY As Single
    bX As Single
    bY As Single
    vX As Single
    vY As Single
    Sp As Single
    Vis As Boolean
End Type

Type Blocks 'ブロック管理構造体
    X As Single
    Y As Single
    Vis As Boolean
End Type

Type Vector 'ベクトル構造体
    X As Single
    Y As Single
End Type

ここでは前回解説したベクトルの定義のほか、ボールやブロックなどを扱いやすくするために、それぞれ構造体として定義しています。

わかりにくいのは、ボール管理構造体だと思います。ボールひとつ管理するために、なんでこんなにも多くの項目が必要なのか、不思議ですよね。よく見てみると、X と Y というアルファベットがたくさん出てきています。これはおいおい説明しますが、ブロックなどとの衝突判定をする際に、これらの変数が非常に重要な役割を果たします。まだ意味はわからないでしょうが、まずは同じように構造体を定義しておいてください。

さらに変数の宣言が続きます。
先ほど定義した構造体を用いて、ボールなどを扱う変数を宣言します。

Public Ball As Balls 'ボール
Public Block(1 To 25) As Blocks 'ブロック(配列)
Public Bar As Vector 'バー

ここは簡単ですね。先に定義しておいた構造体をそのまま変数の宣言に使っているだけです。

さて、ちょっと長いですが、最後に定数の宣言です。

Const W_Field As Single = 250 'フィールド横幅
Const H_Field As Single = 300 'フィールド縦幅
Const W_Ball As Single = 10 'ボールの大きさ
Const W_Block As Single = 50 'ブロック横幅
Const H_Block As Single = 20 'ブロック縦幅
Const T_Block As Single = 20 '最上段ブロックの位置
Const W_Bar As Single = 48 'バーの横幅
Const H_Bar As Single = 12 'バーの縦幅
Const T_Bar As Single = 280 'バーの位置(Top)

Const PI As Single = 3.14159 '円周率

ここでは、フィールド・ボール・ブロック・バー、それぞれの位置や大きさを定義するための定数を宣言しています。なぜ定数をこれほど大量に宣言するのか、その理由がみなさんはわかるでしょうか。

先ほどちらっと書きましたが、こうしておくことで様々な恩恵が受けられます。
定数を使うことの恩恵の第一は、わかりやすさが向上するということです。例えば、ブロックの大きさなどを数字で管理していると、うっかり大きさがわからなくなってしまうことがあるかもしれません。10 だったか、それとも 20 だったか、どっちだったっけ、なんてことになるかもしれませんよね。これが定数として管理されていれば、こまかい数値まで覚えておく必要はありません。コードを記述する際には、定数を使えばいいのですからね。

さらに、定数を利用している場合にはあとあとプログラムを修正する際に非常に便利です。衝突判定などを行う際には、頻繁にブロックやボールの大きさを使った計算が出てきます。もし、あとからボールを少し大きくしたいとか、ブロックを少し小さくしたいなどと思ったときに、全ての計算箇所を手で修正していくのはとても大変です。定数を使ってあらかじめコードを記述しておけば、修正するのは定数の宣言部分だけで済みますから、手間が大幅にカットできます。

最初だけちょっと手間ですが、しっかり定数を宣言しておくことで、あとあと必ず役に立ちますので、面倒ですががんばってコードを記述しておきましょう。


■ボール構造体の秘密

さて、先ほど定義したボール用の構造体について、もう少しだけ突っ込んだ解説をしましょう。もう一度、ボール用の構造体を見てください。

Type Balls 'ボール管理構造体
    aX As Single
    aY As Single
    bX As Single
    bY As Single
    vX As Single
    vY As Single
    Sp As Single
    Vis As Boolean
End Type

これを見ると、X や Y が名前についている要素がたくさんあるのがわかりますね。そして、色分けしてみるとわかりやすいですが、それぞれ X と Y が対になっているのがわかると思います。

小文字の a から始まるもの、同様に、b から始まるものと、v から始まるものがありますね。

実は、ボールを処理する際、移動処理を考えるだけでよいのなら、こんなにたくさんの要素は必要ありません。前回までで説明したように、ベクトルを使って処理するために必要なのはせいぜい X と Y 、ふたつの要素だけです。
にもかかわらず、これほどたくさんの要素を定義しているのには、キチンと理由があります。その理由とは『 衝突判定を行うために必要だから 』なんです。

今回のブロック崩しゲームでは、衝突判定に『 線と線 』での判定を使います。ブロックの辺にあたる直線と、ボールが進む軌道の直線、このふたつの直線が交差しているかどうかを調べ、それによって衝突判定を行うのです。

610.gif

そして、この方法を実現するためには、ボールの軌道がデータとして存在しなくてはいけませんよね。そのために、これだけたくさんの要素が必要になるのです。

小文字の a から始まる X と Y は、after 、つまりボールが移動したあとの座標を表します。
そして、小文字の b から始まる X と Y は、before 、つまりボールが移動する前の座標を表します。

これを図にすると次のようになりますね。

611.gif

A と B 、ふたつの座標を線で結ぶと、ボールがどのように移動したのかその軌跡がわかります。ここでできあがる直線と、ブロックの辺との交差判定を行うことによって、ボールがブロックと衝突しているのかどうかを判定できるわけです。

ブロック崩しでは、衝突判定が最大の難関になります。線と線の交差を判定するなんて、考えただけでもかなり複雑になりそうな気がしてしまいますね。ですが、この方法が恐らく精度的には一番高いです。難しいのは確かですが、そこはきちんと十分な解説を行いながら進めていきますので、がんばってついてきてほしいと思います。


■まとめ

変数と定数を宣言しただけなのに、かなりボリュームのある内容になってしまいましたね。途中、衝突判定の話なども出ましたので、かなりイメージするのが大変だったのではないかと思います。

今後、ブロック崩しを作成していくなかで、比較的難しい概念や処理がたくさん出てきます。ですが、落ち着いて、焦らず理解していくことが大事です。今回はまだ変数などをひととおり用意しただけに過ぎません。それぞれの変数の役割などは、講座を進めていくうちに徐々に明らかになっていきます。まずは今回の内容をしっかりと理解し、次回以降につまずかないようにしておいてくださいね。



■格言

定数を使ってわかりやすく
衝突判定を踏まえて構造体を定義


あまり難しく考えすぎないようにしましょうね。
落ち着いてやれば、大丈夫です。

関連記事






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