ホーム < ゲームつくろー! < デザインパターン習得編
Facade
〜ユーザに優しいシステム操作人
@ 大雑把で十分
Facadeは「ファサード」と読みます。「見かけ」「外見」という意味です。この意味のとおり、Facadeパターンは、クライアントに対して内部のシステムを秘密にして、クライアントが必要と思われる要求のみを公開する事で、複雑なシステムを簡便に扱います。
ゲームではユーザインターフェイスが必ず必要になります。Direct Inputを用いると、ゲームパッドのボタン情報を取得することが可能になります。しかし、その実装は結構面倒なものです。それだけ細やかな操作が出来るということですが、ゲームを製作する側からすると、「ここまで細かいことはいらん!」と思うことが度々あるのです。そういう時にFacadeパターンが役に立ちます。
Facadeパターンの簡単な例を考えて見ます。今、ゲームパッドのボタン情報(押下、方向、アナログ情報など)を管理しているクラスがあるとしましょう。
BUTTONNUMBER 10
class GamePad
{
protected:
int m_LeftLevel;
int m_RightLevel;
int m_UpLevel;
int m_DownLevel;
int m_Button[BUTTONNUMBER];
public:
void Update();
int GetLeftLevel();
int GetRightLevel();
int GetUpLevel();
int GetDownLevel();
int GetButtonLevel(int);
//* 他にも沢山の関数がある! *//
};
このクラスではボタンに関して非常に細かな情報を扱っています。もちろん、これらの情報を最大限に利用したゲームを作成するのも良いのですが、多くの場合、もっと簡略化した情報だけで十分です。このクラスを無理やり使うことも出来るのですが、面倒この上ありません。
クライアントが「ボタンが押されているかどうかだけ知れればよい」という要求であれば、その要求だけに限定したFacadeクラスを作ります。
class SimplePadFacade
{
protected:
GamePad* m_Pad;
public:
Update();
BOOL Left();
BOOL Right();
BOOL UP();
BOOL DOWN();
BOOL Button1();
BOOL Button2();
}
SimplePadFacadeクラスは、限定したパッドを想定して、そのボタンが押されたかどうかだけを判定してくれます。この時、複雑なGamePadクラスはコンポーネントとして保持します。このコンポーネントを取得する手段をなくせば、クライアントが内部の情報にアクセスすることが禁止されます。
クライアントは、
SimplePadFacade Pad;
Pad.Update();
if(Pad.Left()){
//* 左ボタンの処理 *//
}
と簡単なプログラムでボタンの情報を扱えるようになります。
今回の例はとても簡単なものなのですが、もっと複雑なシステムに対しても、このパターンはユーザフレンドリなビューを提供する手段として有効です。銀行のATMなどは、まさにFacadeパターンです。
ゲームもプレーヤーの簡単な操作で複雑な処理をこなすわけですから、実はFacadeパターンだらけと言って良いと思います。簡単だけど重要なパターンです。