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

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

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



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


スポンサーサイト

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






Chapter.126 [ クラスモジュール:プロパティ編 ]

■クラスとプロパティ

前回は、クラスモジュールの準備とメソッドの実装について取り上げました。メソッドは要するに単なるサブプロシージャで実装でき、それほど難しい概念でもありませんでした。

今回は、前回のメソッドに続き、オブジェクトには欠かせない概念であるプロパティについてやりたいと思います。プロパティってなに? という方がもしいらっしゃったら、過去の講座などを参考に予習しておくことをオススメします。少なくとも、プロパティがなんなのかなど、そういった基本的な知識抜きでクラスモジュールは理解できません。焦らず、基本からしっかり習得しておきましょう。(参考:Chapter.74 [ プロパティ・メソッド・イベント ]

さて、プロパティとは簡潔に表現するならオブジェクトが持つ変数に他なりません。当然、クラスモジュールを用いた処理でも、このプロパティを活用することで、様々な処理を行うことができます。
たとえばユーザーフォームで考えてみると、様々なプロパティがありますね。幅や高さなどを表すプロパティもあれば、色や外見にかかわるプロパティもあります。Caption プロパティを操作すればタイトルバーに表示される文字列が変化したりもしますね。

プロパティはたしかに、役割としては変数のようなものです。オブジェクトの様々な特徴や属性を保持する役目があり、それによってオブジェクトの外見や挙動が変化します。一度設定した値などは、特別な理由がない限りは勝手に変化せず、参照すればその値を取得することができます。
しかしよく考えてみると、普通の変数とは異なる面がありますね。たとえば先ほどの例で考えると、ユーザーフォームには様々な色にまつわるプロパティがあります。BackColor プロパティを変更すると、ユーザーフォーム自体の色が変化しますね。普通の変数には、このような外見に影響を与えるような効果はありません。Caption プロパティにしてもそうです。値を設定するとユーザーフォームのタイトルバーの文字列が変化します。このような値とは別の部分にまで影響を与える効果は、通常の変数にはないプロパティ独自の機能です。

こうして考えてみると、プロパティとは普通の変数以上の特別な存在であるということがわかりますね。ただ単に値を保持することだけが、プロパティの役割ではありません。値が変更されると同時に、値とは別の部分にまで影響を与えるというケースがプロパティにはあるのですね。実は、このことを理解することこそが、クラスモジュールでプロパティを実装するうえで非常に重要になります。


■取得と設定

ひとくちにプロパティと言っても、参照のみを許すプロパティや、値の取得も設定も両方可能なものなどがありますね。この点も、普通の変数とは違いますね。
そして、ユーザーフォームの BackColor プロパティのように、値が設定された瞬間になにかしらの処理が同時に起こるプロパティがあったりします。

実は、プロパティには、値が取得される場合と、設定される場合というふたつの局面が存在します。そして、それぞれに、どういった挙動をするべきかがあらかじめ決められているのです。ですから、値が変更されると同時に外見が変化したり、表示される文字列まで変化したりする場合があるわけです。

プロパティが取得される場合には、あまり特殊なことはありませんね。ただ単に、現在設定されている値をプログラムに返してやるだけです。しかし、設定される場合には様々なケースが存在します。色を変える必要があったり、表示されている文字列を変更する必要があったり、いろいろ考えられますね。

クラスモジュールには、このようなプロパティの特性を独自に実装する仕組みがキチンと備わっています。

サブ、そしてファンクションに続く、新たなプロシージャである『 プロパティプロシージャ 』によって、この特徴的なプロパティというものを実装させることが可能になります。


Property Get プロシージャ

プロパティプロシージャには、実はふたつの種類があります。先ほどから言っているように、プロパティには取得されるときと設定されるときのふたつの場面が存在するからです。

プログラムがプロパティを取得しようとしているとき、どのような処理を行うのか定義するのが Property Get プロシージャです。反対に、プロパティが設定されようとしているとき、その動作を定義するのが Property Let プロシージャになります。
早速、それぞれの使い方を見ていきましょう。

まずは、Property Get プロシージャからです。
Public Property Get Prop() As type

End Property

上記のコードで「 Prop() 」となっている部分がプロパティ名になります。わかりやすいプロパティ名をつけましょう。そして、その後ろには As から繋がる変数の型宣言がありますね。プロパティは変数と同じように当然型を持っていますから、ここではそれを指定します。
Property Get プロシージャの場合にはプロパティの取得が行われようとしたときに自動的に呼び出されます。ですから、特別な理由がない限りは、そのまま値を渡し、取得を完了させてやります。

値を返す際には、プロパティ名にそのまま値を渡します。これは Function プロシージャなどの場合と同じですね。

Public Property Get Prop() As type

    Prop = VarProp

End Property

さて、ここでひとつ大事なポイントがあります。
プロパティは、プログラムの実行中いつでも取得できるものでなければなりませんから、当然、その値を保持するために、変数が必要です。プロパティプロシージャはあくまでも、プロパティを取得したり設定するための手法でしかありません。橋渡しをするプログラムでしかないわけですね。
値を実際に保持する変数は、必ず別途必要になります。上記の例で言うと、VarProp がその変数に相当します。そして、この値を保持するための変数は、常に値を保持するわけですからモジュールレベルで宣言します。クラスモジュールの宣言セクションで Private キーワードと共に宣言します。

'クラスモジュールの宣言セクションに記述
Private VarProp As type

ちょっとわかりにくいかもしれませんが、よく考えて理解してみてくださいね。一度、簡単に整理してみましょう。

クラスモジュールにプロパティを実装するには、プロパティの値を保持する変数(今回の例で言うと VarProp )が必要です。この変数は常に値を保持し続けるわけですから、必ずモジュールレベルで宣言します。Private キーワードを忘れずに付加して宣言するようにしましょう。
そして、プロパティの値をプログラムとの間でやり取りするために必要なのがプロパティプロシージャですね。プロパティプロシージャで指定された名前が、実際のプロパティ名になります。
先ほどの値を保持するための変数は、あくまでもクラスモジュールの内部で値を保持するために必要な変数に過ぎません。クラスモジュールの中でさえ有効であればそれでいいわけですね。外部から参照されるプロパティの名称は、プロパティプロシージャの名称で指定するわけです。この点に気をつけましょう。
また、Private キーワードと共に宣言する変数の型と、プロパティプロシージャで指定される型とが必ず一致するようにしましょう。上記の例ではいずれも type と書かれていますが、この部分が必ずリンクするように同じ型を指定するように気をつけましょう。

補足コラム:スコープ
クラスモジュールを扱う際には、変数やプロシージャのスコープが非常に重要になります。はっきり言いますが、スコープの何たるかがわかっていないうちは、クラスモジュールを本当の意味で理解できたとは到底言えません。
まず、モジュールレベルでPrivate宣言した変数のスコープは、どの範囲になるでしょうか。Private付加なら、その変数は同モジュール内でのみ有効な変数となります。つまりそのクラスモジュールの外からは参照できません。
一方で、プロパティプロシージャ自体はPublic付加で記述します。これは何故だかわかりますか? プロパティはプロジェクトのあらゆる場所から参照できなければ意味がありません。ですから、Publicなプロシージャとして記述するわけです。
プロパティを参照することは、プロジェクトのどこからでもできます。しかし、実際に値を保持している変数を直接参照して操作するのではなく、あくまでもPublicなプロシージャを介して値を操作しているわけです。
このことが実はすごく重要で、わかりにくい部分でもあります。オブジェクトとは、プロパティやメソッドなどが、ひとつにパッケージ化されたプログラムやデータの集合体です。その中身はそれぞれのオブジェクトごとに独立して管理され、外部との情報のやり取りは厳密に管理された状態であることがポイントになります。
プロシージャはPublic、中身の変数はモジュールレベルのPrivate、など、スコープの範囲がそれぞれに異なっているのも、このようなオブジェクトの概念をしっかり周到した結果なんですね。



Property Let プロシージャ

さて、続いてはプロパティが設定される場合に呼び出される Property Let プロシージャです。

プロパティが設定される際には、先ほども解説したように、値以外の部分が変化する場合があります。それを独自に実装するために Propety Let プロシージャは存在します。まずは、構文です。

Public Property Let Prop(var As type)

End Property

ベースとなる構文はこれだけです。Property Get プロシージャと、Property Let プロシージャは、双方が存在する場合には必ず対になります。ですから、プロパティ名は同じものが指定されているところに注意してください。プロパティの中には、取得だけできて設定はできないものなどが存在します。そういった場合には片方だけ(つまり Property Get だけ)が存在するケースもあります。取得も設定も両方できる場合には、同じプロパティ名にするように気をつけましょう。

プロパティが設定される場合に必要となるわけですから、Property Let プロシージャには設定されようとする値を受け取る引数がありますね。上記の例で言うなら「 var As type 」の部分がそれに相当します。この変数 var に、今まさに設定されようとしている値が呼び出し元から渡され含まれています。もし単純にプロパティの値を変更するだけでいいのなら、次のように記述すればいいでしょう。

Public Property Let Prop(var As type)

    VarProp = var

End Property

値の設定と同時に何かしらの処理が必要な場合には、ここに追記する形で別に処理を記述すればいいですね。


■まとめ

さて、ざっと解説してきましたがどうだったでしょうか。

プロパティは、メソッドに比べて実装が非常に面倒です。ただ単にサブプロシージャひとつ記述することで実装できたメソッドに比べ、プロパティはモジュールレベルの変数であったりプロパティプロシージャであったり、様々なものを利用して初めて正規に実装できます。スコープの問題などもかかわってくるため、非常に面倒臭い印象を持たれた方も多いのではないかと思います。

しかし、プロパティはオブジェクトに欠かせない概念であると同時に、オブジェクトの特性を考えたとき、やはりプロパティの実装にはプロパティプロシージャという専用のプロシージャが必要です。

補足コラムでもちょっと触れましたが、オブジェクトとはプロパティなどのデータやメソッドなどの動作が全てひとつにパッケージ化されたものです。その中身にアクセスするためには、プロパティの参照や、メソッドの呼び出しなど、適切なプロセスが踏まれるべきです。これは考えてみるとまるで意味がないことのようにも思えますね。しかしとても大切なことです。

たとえば、ユーザーフォームを複数個利用しているなプロジェクトがあったとします。プログラムから自由に各オブジェクトの中身に干渉できるとしたら、どうでしょう。コードにプロパティの名称だけを記述して値を設定したら、いずれかのユーザーフォームがランダムに操作されるような仕様になっていたのでは、まともなプログラムが書けるはずがありません。プロパティを設定する際には、必ずオブジェクト名+プロパティ名という順序で記述し、プロパティを設定するはずです。
これは、各ユーザーフォームが個別にデータを保持しており、きちんとした手順を踏まなければその中身には容易にアクセスできないような、そういう構造を持っているということに他なりません。また、このパッケージ化されたオブジェクトの特性があるからこそ、複雑なプログラムを容易に管理でき、またコードの可読性が高まっているともいえますね。

クラスモジュールでクラスを実装し、オブジェクトの設計図を書くということはまさにそういうことを自前でやっていくことと同じです。多少面倒であっても、しっかりプロパティプロシージャや、メソッドを用意してやることで、データをうまく覆い隠し、管理することができるのですね。

最初は難しい概念かもしれませんが、オブジェクトとは何か、そしてクラスとは何かということがわかってくるにつれ、自然と理解できるようになってくると思います。

まずは、今回の内容をしっかりと習得し、プロパティプロシージャとはどういうものなのかを正しく理解してください。最初はどうしても難しいことばかりだと思いますし、スコープのことなどは余計にわけがわからなくなる要因だとは思います。しかし、焦らずひとつひとつ理解していけば、必ず意味がわかってきます。そして、その利便性や、クラスモジュールを用いることの大切さも自然と理解できるはずです。

大切なことは、諦めないこと。
そして、難しいことも順を追って、自分のわかるところから少しずつでも理解していくことが大事です。ここまできたら理解せずに終わりにしてしまうのは非常にもったいないです。諦めずに、がんばってみてください。



■格言

プロパティは単なる変数以上のもの
プロパティプロシージャには2種類ある
スコープをよく理解する


非常に難しい内容でした。私の言葉が不足していないか心配です。

関連記事






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