そんなこんなで、再考察。 まず用語の再定義をしよう。オブジェクト、オブジェクトと言っても曖昧すぎるので。
| 用語 | 定義 |
|---|---|
| スプライト | ゲーム中に描画されるであろう何か |
| スプライト・ベース・クラス | スプライト管理クラスとスプライト・グループ・クラスがスプライトを管理するための基底クラス |
| スプライト・グループ・クラス | スプライトの集合を保持・管理するクラス |
| スプライト・コントロール・クラス | スプライト・グループの集合を管理するクラス |
| スプライト・ハンドル | スプライト・ベース・クラスのポインタを得るためのハンドル |
| スプライト・ルックアップ | スプライト・グループ内で現在処理中のスプライトを指す参照値 |
| グループ・ルックアップ | 現在処理中のグループを指す参照値 |
| ルックアップ | ここではグループ・ルックアップとスプライト・ルックアップをあわせたもの |
| インターフェース | あるクラスからのみ呼び出される関数郡 |
| ロックオン | ここでは、あるスプライトが他のスプライトを指すスプライト・ハンドルを得ること |
| 複合スプライト | 実体が複数のスプライトから構成される事(たとえば触手) |
| ルート・スプライト | 複合スプライトを構成する大元のスプライト |
| クラス名 | 詳細 |
|---|---|
| CSpriteBase | スプライト・ベース・クラス |
| CSprite | ユーザの定義したスプライト・クラスの総称 |
| CSpriteGroup | CSpriteBaseを保持・管理 |
| CSpriteControl | CSpriteGroupを保持・管理 |
| インターフェース名 | 詳細 |
|---|---|
| CSpriteISprite | スプライト→スプライト |
| CSpriteIGroup | スプライト→グループ |
| CSpriteIControl | スプライト→コントロール |
| CSpriteControlISprite | コントロール→スプライト |
「A→B」はクラスAからのみ呼び出されるために、クラスB側で用意するインターフェース
| クラス | インターフェース |
|---|---|
| CSpriteBase | CSpriteISprite CSpriteIControl |
| CSpriteControl | CSpriteControlISprite |
| 種類 | 要件 | 名前 |
|---|---|---|
| 基底クラス | コントロール・クラスで保持するためのクラス | CSpriteBase |
| インターフェース | スプライト間のインターフェース | CSpriteISprite |
| インターフェース | コントロール・クラスへのインターフェース | CSpriteIControl |
| 種類 | 要件 | 実装方法 |
|---|---|---|
| クラス | CSpriteISpriteの取得 | 関数 |
| クラス | CSpriteIControlの取得 | 関数 |
| 種類 | 要件 | 実装方法 |
|---|---|---|
| データ | CSpriteBaseの保持 | ? |
| 処理 | CSpriteBaseの取り付け・取り外し | 関数 |
| 処理 | ソート | ? |
| 処理 | ハンドルの作成・取得・開放 | ? |
| 種類 | 要件 | 実装方法 |
|---|---|---|
| データ | CSpriteGroupの保持 | vector |
| 処理 | CSpriteBaseの取り付け・取り外し | 関数(CSpriteGroupへ受け渡し) |
| 処理 | ハンドルの作成・取得・開放 | ? |
CSpriteBase
{
public:
virtual ~CSpriteBase(){};
virtual CSpriteISprite & GetISprite(void) = 0;
virtual CSpriteIControl & GetIControl(void) = 0;
};
CSpriteIGroup
{
int m_key;
public:
int SortKey(void){ return m_key; };
};
ユーザが自分のCSpriteのために用意する。
例)
CSpriteISprite
{
virtual const POINT & GetPoint(void) = 0;
virtual const RECT & GetRect(void) = 0;
virtual int OnCollision( const CSpriteMyShip & ) = 0;
virtual int OnCollision( const CSpriteEnemy & ) = 0;
}
CSpriteIControl
{
public:
virtual void OnDraw(void) = 0;
virtual void OnMove(void) = 0;
virtual void OnAction(void) = 0;
}
ユーザが自由に用意する。
例)
CSpriteMyShip
: public CSpriteBase,
: private CSpriteISprite, CSpriteIGroup, CSpriteIControl
{
POINT m_pt;
RECT m_rt;
// CSpriteBase
CSpriteISprite & GetISprite(void){ return *this; };
CSpriteIControl & GetIControl(void){ return *this; };
// CSpriteISprite
const POINT & GetPoint(void){ return m_pt; };
const RECT & GetRect(void){ return m_rt; };
int OnCollision( const CSpriteMyShip & ){ ASSRET(......); };
int OnCollsion( const CSpriteEnemy & enemy ){ ...... };
// CSpriteIControl
void OnMove()
{
......
m_key = p.y;
}
}
うむ、適当に書きなぐってみた。ぬけてる要件とかないかな〜。