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

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

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



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


スポンサーサイト

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






Chapter.111 [ ブロック崩しゲーム6:ブロックの配置 ]

■ブロックの初期配置

前回はボールやバーなどの初期化について解説しました。
定数をうまく活用することによって、メンテナンスのしやすいプログラムを作ることができるということも、実感できたのではないかと思います。

今回は、もうひとつの初期化処理、ブロックの初期化を行います。
ブロックの初期化処理では、Excel のワークシートを活用して処理します。こうすることによって、セルに入力されている情報を変更するだけで、簡単にブロックの配置が変更できるようになります。

今回作成するブロック崩しは、最低限の機能だけを搭載したものになる予定です。ですから、複数のステージを順番にクリアしていくようなつくりにはしません。
ただ、ブロックの配置を行うプロシージャは、複数ステージに対応できるように設計します。それをどう活用するのかは、これをご覧になっている皆さんの自由です。普通にステージクリア型のブロック崩しを作ってもいいでしょうし、もっと違ったアプローチで活用するのもいいでしょう。

ゲームのデザインや特徴は、開発する側が試行錯誤して決めるものです。これは、今回作成しているブロック崩しに限ったことではありません。私は講座を通してノウハウやテクニックを公開していますが、それはあくまでも入り口までの案内をしているだけに過ぎません。そこから先、どのように道筋を立てて進んでいくのかは、皆さん次第です。


■ブロックの図面を作る

さて、それでは早速ブロックの初期化処理を考えていきましょう。

先にも書いたように、今回はワークシートをうまく活用しながら処理していきます。

ブロック崩しを作成しているブックの、ワークシートのどれかひとつをブロックの配置図専用のシートとして使います。そこからデータを読み込んでブロックが配置されるようにするわけです。

通常、Excel の基本設定をいじっていなければ、ブックに含まれるワークシートの数は自動的にみっつになります。今回はそのうちのひとつを『 map 』という名前に変更して、そこにブロックの配置図を作ります。

630+.gif

ブロックの配置図は、5 × 5 の合計 25 個のセルを使って表します。セルの A1 から E5 までを使って、ひとつ分のステージが表現できることになりますね。
そして、ブロックが存在するかどうかは、セルに入力されている数字で判断します。今回は数字が 0 より大きければ、そこにブロックがあるという判断で処理してみることにします。

ワークシートのほうは、罫線を引くなどして、ブロックの配置をデザインしやすいようにしておきます。ここで条件付き書式などを併用すると、デザインのしやすさが格段に向上しますので、オススメです。

631.gif

条件付き書式を以下のように設定することで、ワークシート上でブロックの配置をデザインする際に、非常にわかりやすくなります。

633.gif

    ▼

632.gif


■ブロックデータ読み込み

さて、ワークシートの準備が完了したら、そこからデータを読み込みながらブロックの初期化処理を行っていきます。

ポイントとなるのは、計算方法。
かなり複雑になりますが、落ち着いて考えましょう。

Sub Init_Block(Stage As Long)

    Dim L As Long
    Dim LL As Long
    Dim Cell_Row As Long
    Dim Cell_Col As Long
    
    For L = 0 To 24
        With ThisWorkbook.Worksheets("map")
            Cell_Row = (Stage * 5 - 4) + (L \ 5)
            Cell_Col = (L Mod 5) + 1
            If .Cells(Cell_Row, Cell_Col).Value > 0 Then
                With Block(L + 1)
                    LL = L Mod 5
                    .X = (W_Block / 2) + (LL * W_Block)
                    LL = L \ 5
                    .Y = T_Block + (H_Block / 2) + (LL * H_Block)
                    .Vis = True
                    UserForm1.Controls("Label" & L + 1).Visible = True
                End With
            Else
                With Block(L + 1)
                    .Vis = False
                    UserForm1.Controls("Label" & L + 1).Visible = False
                End With
            End If
        End With
    Next

End Sub

ちょっと長いプロシージャですが、焦らず見ていきましょう。
まず最初にプロシージャ名のところを見てください。このプロシージャの名前は Init_Block となっています。ブロックの初期化処理ですので、このようなネーミングになっています。そして、そこに続く括弧の中に『 Stage As Long 』とあります。これは、このプロシージャが複数ステージに対応できるよう設計されていることを表しています。

このプロシージャは、引数をひとつ取るようになっており、受け取った引数はステージ数を表します。先ほどワークシートに設計したブロックの配置図はステージがひとつ分しかありませんでしたが、下方向に同じレイアウトの配置図を作成しておくことで、複数のステージをこのプロシージャひとつで読み込むことが可能です。

それでは肝心の中身を見ていきます。
まず、変数の宣言ですが、このプロシージャではよっつの変数を宣言しています。変数 L と、変数 LL は、計算に使うための汎用変数です。そして変数 Cell_Row と変数 Cell_Col は、セルの参照を行う計算の中で使います。

このプロシージャではまず、汎用として宣言した変数 L を使った繰返し処理が始まります。For 文を使って、0 ~ 24 までの繰り返し処理を行っているのがわかると思います。
そして、繰り返し処理の中では、まずふたつの変数に値を取得しています。ここは紛らわしいので、ゆっくり見ていきましょう。

Cell_Row = (Stage * 5 - 4) + (L \ 5)
Cell_Col = (L Mod 5) + 1

Cell_Row は、その名の通りセルの行数を取得するための変数です。上の計算をよく見てみると、引数として受け取ったステージ数( Stage )と繰り返し処理のカウンタ( L )を使っていますね。
ステージ数を使っているほうの計算『 (Stage * 5 - 4) 』では、変数 Stage の値が増えるたびに、1、6、11、16……、というふうに増えていきますね。そしてカウンタ変数 L は『 \ 』という演算子を使って計算していますね。この演算子は、割り算した結果から、整数部分だけを抜き出してくれる演算子です。たとえば変数 L の値が 3 だとすると、3 ÷ 5 = 0.6 となりますよね。この場合は、\ 演算子は 0 を返してきます。変数 L が 8 だったらどうでしょうか。この場合は、8 ÷ 5 = 1.6 となるため \ 演算子を使った計算では 1 が返ってきます。

Cell_Colのほうはどうでしょうか。
こちらは Mod 演算子を使っていますね。この演算子は以前にも何度か使いました。割り算した結果から余りだけを返してくれる演算子ですね。このように計算した結果をセルの列数として使います。

さて、これらのふたつの計算をすると、一体どのような結果が得られるのでしょうか。
上記の計算で得られたふたつの変数を、Cells プロパティの引数として渡すと、次のように順番に処理していくことができます。

634.gif

左上から、右方向に、一段ずつ処理していくことができるのですね。
今回のブロック崩しでは、ブロックにラベルコントロールを使っていましたよね。そして、そのラベルは名前が連番になっていたのを憶えていますか? つまり、このセルの処理順序は、ラベルの名前の連番と全く同じ順序になっていたですね。

さて、次です。
続いては、上記のようにして得られたセルの参照を使って、順番にセルの値を調べていきます。このとき、セルの値が 0 より大きかった場合だけ、ブロック管理構造体にデータを取得していきます。
ブロックの横位置を表す X 、同様に縦位置を表す Y にそれぞれ計算した座標を入れておき、ブロックが見えているかどうかを表す Vis には True を入れます。
最後に、ユーザーフォーム上の実際のラベルを見えるようにするために、ラベルのVisible プロパティに True を設定して完了です。

ちなみに、セルの値が 0 だった場合には、逆にブロックが見えないようにしておく必要があります。ブロック管理構造体の要素 Vis と、ラベルの Visible プロパティには、いずれも False を設定しておきます。

ちょっと紛らわしいですが、落ち着いて考えましょう。
このプロシージャでポイントなるのは、なんといってもセルの参照を得るために行われる計算です。ここがちょっと複雑なのですが、あとは難しいことはしていません。ゆっくりじっくり考えましょう。


■ユーザーフォーム側の準備

さて、前回の講座内容と、今回の内容で、初期化の部分は解説できました。
ボールやバーの初期化処理と、ブロックの初期化処理のふたつが完成しましたので、これをユーザーフォームの起動と同時に呼び出せるようにしておきます。

ユーザーフォームの Initialize イベントを使って、ふたつの初期化処理が呼び出されるようにしておきましょう。以下のプロシージャは、フォームモジュールに記述するコードです。標準モジュールではないので間違えないようにしましょうね。

Private Sub UserForm_Initialize()

    Init
    
    Init_Block 1
    
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    End
    
End Sub

ここでは特に難しいことはしていませんが、注意するべきは Init_Block の呼び出し部分。このプロシージャはステージ数を引数として受け取るように設計されていましたよね。とりあえず現状はここで 1 を指定して、ステージ 1 が読み込まれるようにしておきます。

このようにフォームモジュールに記述したあとで、ユーザーフォームを起動してみてください。すると、ワークシートに設計したとおりのブロック配置で、ユーザーフォームが起動するはずです。

ステージの設計図を作ったシートに、複数のステージを作っておいて引数を変更すると、きちんと別のステージも読み込まれるはずです。興味のある人はやってみてもいいでしょう。

630.gif


■まとめ

今回は結構長くなりましたが、どうでしょうか。
ステージを読み込む部分がちょっと複雑でしたが、これは一度作ってしまえばかなり汎用的に使えるプロシージャなので、がんばって仕組みを理解しておいてくださいね。

最後に画像で紹介したように、同じレイアウトのステージ設計図を作っておけば、引数を変更してプロシージャを呼び出すだけで、簡単に複数ステージを扱うことができます。また、前回のボールやバーの初期化処理と、今回のブロックの初期化処理を分けて作成してあるおかげで、初期化を別々のタイミングで管理することが可能になっています。このことは、ブロック崩しゲームの作成が進んでいくほど重要になってきます。

今回の講座では、ワークシートとプログラムの連携、そしてセルの参照を行う計算の仕組み、これを理解しておけば大丈夫です。今回はちょっと複雑だったので、サンプルをダウンロードできるようにしておきます。どうしても計算の仕組みがよくわからない場合は、サンプルを実際に動かしながら、それを参考にして考えるのもいいでしょう。とにかく、焦りは禁物です。


サンプルダウンロード ⇒ コチラよりダウンロードできます。(別館)



■格言

ワークシートをうまく活用
複数のステージに対応できるように設計
セルの参照は複雑だけど落ち着いて


次回はメインループなどの根幹処理を作りましょう。


関連記事






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