そんなこんなで、再考察。 まず用語の再定義をしよう。オブジェクト、オブジェクトと言っても曖昧すぎるので。
用語 | 定義 |
---|---|
スプライト | ゲーム中に描画されるであろう何か |
スプライト・ベース・クラス | スプライト管理クラスとスプライト・グループ・クラスがスプライトを管理するための基底クラス |
スプライト・グループ・クラス | スプライトの集合を保持・管理するクラス |
スプライト・コントロール・クラス | スプライト・グループの集合を管理するクラス |
スプライト・ハンドル | スプライト・ベース・クラスのポインタを得るためのハンドル |
スプライト・ルックアップ | スプライト・グループ内で現在処理中のスプライトを指す参照値 |
グループ・ルックアップ | 現在処理中のグループを指す参照値 |
ルックアップ | ここではグループ・ルックアップとスプライト・ルックアップをあわせたもの |
インターフェース | あるクラスからのみ呼び出される関数郡 |
ロックオン | ここでは、あるスプライトが他のスプライトを指すスプライト・ハンドルを得ること |
複合スプライト | 実体が複数のスプライトから構成される事(たとえば触手) |
ルート・スプライト | 複合スプライトを構成する大元のスプライト |
クラス名 | 詳細 |
---|---|
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;
}
}
うむ、適当に書きなぐってみた。ぬけてる要件とかないかな〜。