ホーム < ゲームつくろー! < デザインパターン習得編

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パターンだらけと言って良いと思います。簡単だけど重要なパターンです。