スポンサーサイト

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

【コード】template を用いた遷移ベースクラス簡易版

クラス内で遷移をするために関数ポインタを用いた記事を以前紹介した事がありまして
http://dvdm.blog134.fc2.com/blog-entry-24.html

これを基本的な機能をベースクラスにまとめて継承すれば
サブクラスで実装したメソッドをセッターを通して関数へのアドレスをセットしてやれば
使えるのではないかと言う所で改変しました。


template<typename T> class CSceneBase
{
protected:
bool m_isEnd; // 終了フラグ

void (T::*m_pExeScene)(); // 関数ポインタ
void SetScene(void (T::*pExeScene)()); // 実行関数のセット

virtual void Init()=0; // 初期化処理
virtual void Exit()=0; // 終了処理
virtual void Update()=0; // 更新

public:
CSceneBase();
virtual ~CSceneBase();

bool GetisEnd()const; // シーンの終了フラグを取得する
};


とりあえずこんな感じのクラスを作成しました。
m_isEnd は、そのシーンが終了しているか実行中かを表すフラグです。
TRUE の時は実行中、FALSE の時は終了と言う事にしてあります。

メインはこの二行です。
void (T::*m_pExeScene)(); // 関数ポインタ
void SetScene(void (T::*pExeScene)()); // 実行関数のセット

どのクラスの関数ポインタなのかを示すだけなのでそれほど難しいものではないと思います。

例えば継承の際、

class CTitle : public CSceneBase<CTitle>
{
    - 実装 -
}

こんな風に書けば CTitle::*pExeScene になりますし、
COption と言うのを作れば COpiton::*pExeScene になりますので
シーンはこれを継承していけばいいだけです。

protected なメンバに純粋仮想関数を仕込んでありますので
Init, Exit, Update は各サブクラスで実装する事になります。
この辺は好みに合わせればいいのではないかと思います。

責任を持ってサブクラスの Update メソッドをコールすれば
メインはスッキリ書けるかなと思います。
Update メソッドはこんな感じでしょうか。



//*******************************************
// 更新(サブクラスは責任を持ってこのメソッドをコースする)
// 引数 : なし
// 戻り値 : なし
//*******************************************
template<typename T> void CSceneBase<T>::Update()
{
(this->*m_pExeScene)();
}



関数アドレスをセットする SetScene メソッドの中身はこんな感じです。


//*******************************************
// 実行関数のセット
// 第一引数 : 実行する関数のアドレス
// 戻り値 : なし
//*******************************************
template<typename T> void CSceneBase<T>::SetScene(void (T::*pExeScene)())
{
m_pExeScene = pExeScene;
}


引数の書き方が変わったくらいで前の記事と特に変わってませんね・・・。

GeitisEnd メソッドも一応載せておきましょうか・・・。
といっても、フラグをリターンしてるだけで特別何をしている訳でもないんですけどね・・・。


//*******************************************
// シーンの終了フラグを取得する
// 引数 : なし
// 戻り値 : TRUE:終了 FALSE:実行中
//*******************************************
template<typename T> bool CSceneBase<T>::GetisEnd()const
{
return m_isEnd;
}



実行するメソッドのアドレスをセットするにはこんな風に記述します。

//*******************************************
// タイトルの初期化
//*******************************************
void CTitle::Init()
{
this->SetScene(&CTitle::MainTitle);
}


これで CTitle クラスのメンバメソッドである MainTitle メソッドが実行時に呼ばれます。
まぁ関数ポインタが protected ですのでセッターを用意せず
直接代入するのも有りでしょうけど、個人的にはメソッド派なので用意してます。

勿論外部に公開する槓すではありませんので
何の関係もないクラスからセッターを通してどうこうすることは出来ません。

例えばにシーンマネージャクラスに管理して貰い、
必要に応じてマネージャクラスが指示を出したりするのがいいんじゃないかなって個人的に思います。


今回はこんなけです。
今は当たり判定を実装していきたいなと思ってましてそちらの準備をしてます。
当たり判定用の画像も用意しないといけないのでグラフィックどうしようか悩んでます;


ここ最近帰ってきたらすぐ寝てしまうようになりましてやりたい気持ちに体が付いてきません・・・
歳・・・なのかな・・・・・・・・・・・・。
一応年齢的にはアラサーの範囲にギリギリ入ったくらいなのでまだ若い気持ちでいたいんですけどね。
いかんせん精神的におじさんです('A`)

そんな訳でなんとか生きてます。

この記事へのコメント

- はぐれステンレス - 2012年06月18日 16:59:02

低脳の俺にはちんぷんかんぷんだぜぇww

- ペン猫 - 2012年06月18日 22:38:54

C言語のポインタの扱いが難関ですよねw

クラス使うと使いまわしが良くていいので、ソースも見やすくなるよねw

前の記事も見ましたが、具合が良くなかったらしいですね。

体の方をお大事に~また、チャットにでも来てください~ノシ

- DVDM - 2012年06月19日 02:53:08

>> はぐれステンレスさん
プログラムなんて解らなければそんなもんですよ・・・。


>> ペン猫さん
そうですね~。
C++ はうまく設計しないと C よりやり辛いってことがざらにあるので
利便性を求めるあまり使いにくい設計になると元も子もないので
C++ は難しいです;

最近チャットやってるんですか・・・。
コミュニティの方が更新されてないのでてっきりやってないのかと思ってました。
また覗きに行きます~

トラックバック

URL :

検索フォーム
プロフィール

DVDM

Author:DVDM
自作ゲームの開発過程ブログ。
赤髪愛なら誰にも負けない。

 
Pixiv バナー


ブロとも申請フォーム
最新記事
カテゴリ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
ブロとも一覧
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。