2012-04-03 1 views
0

あなたが何か指導をすることができたら、私はさまよっていました。私は現在、単純なゲームエンジン用のスプライトクラスを作成しています。以前のエンジン私はアニメーションが終了したときに放出される信号に外部機能を「接続」する機能を使用しました。クラス内から外部関数を呼び出すための信号を作成しますか?

など。

  • 信号を外部関数が呼び出されるときに放出されるスプライト完了信号
  • に外部関数を接続
  • 外部関数を作成スプライトオブジェクト
  • を作成します。

この関数は、純粋なゲームロジックのタイミング機能であるスプライトと必ずしもデータを共有するとは限りません。例えば、プレーヤーが目標を獲得すると、 "Congrats"スプライトアニメーションがトリガーされ、完了機能がプレイヤーのスコアに加算されます。

私はそれを調べて、コールバック関数/関数ptrを使用する必要があるように見えますが、まだそれらを使用している経験はありません。

ご協力いただければ幸いです。関数はグローバルであり得る

#include <iostream> 

//defining a type that is a 'function that returns void and takes an int' 
typedef void FnPtr(int i); 

//this is a 'function that returns void and takes an int' 
void AFunction(int i) 
{ 
    std::cout << "AFunction Called!"; 
} 

//a function that accepts a pointer to a 'function that returns void and takes an int' 
void AFunctionThatTakesAFnPtrAsAnArg(FnPtr* fn) 
{ 
    //store the pointer to use "later". 
    FnPtr* local = fn; 
    . 
    . 
    . 
    //use it. 
    local(3); 
} 

int main(int, char**) 
{ 
    AFunctionThatTakesAFnPtrAsAnArg(AFunction); 
} 

注、または静的クラスのメンバー:

答えて

1

は、C++関数ポインタは次のように使用することができます。オブジェクトインスタンスの関数を呼び出す場合は、これを参照してください - 特に私の答えです! :-) What is a C++ delegate?

EDIT:コメントで尋ねたより良いフィットの質問に:

#include <iostream> 

typedef void FnPtr(); 

void AFunction() 
{ 
    std::cout << "Animation done"; 
} 

class Sprite 
{ 
public: 
    void SetFnPointer(FnPtr* fn) 
    { 
     m_Fn = fn; 
    } 

    void DoAnimation() 
    { 
     m_Fn(); 
    } 

private: 
    FnPtr* m_Fn; 
}; 

int main(int, char**) 
{ 
    Sprite s; 
    s.SetFnPointer(AFunction); 
    s.DoAnimation(); 
} 
+0

実際に機能を使用するためのおかげで、あなただけの*呼び出します。 fn()。また、ローカル(3)コールとは何ですか?私はこれに慣れていない。 –

+0

また、これを私のシナリオに合わせるために、私の関数は何も返さず、パラメータを取らないので、スプライトクラスはtypdef void FnPtr(void)とvoid AFunctionThatTakesAFnPtrAsAnArg(FnPtr * fn)を含みます。スプライトの作成に関しては、私が保存する関数ポインタを渡し、適切なタイミングでAFunctionThatTakesAFnPtrAsAnArg(savedFunctionPtr)を呼び出します。 –

+0

@ Martin Smith私はあなたの問題に答えるために答えをさらに追加しました。はい、引数がない場合は、typedefについて正しいと思います。 HTH。 –

0

http://www.boost.org/doc/libs/1_49_0/doc/html/signals.html またはhttp://libsigc.sourceforge.net/

でブーストを見てみましょう::信号ライブラリを本当に使いやすいです。

boost::signal<void(float)> update_sig; 

次に、ゲームロジック(some_client_class)のどこかに

あなたのコアのアップデート(例えば、あなたのゲームのメイン実行ループ)で
update_sig.connect(boost::bind(&some_client_class::callback, this, _1)); 

そして最後に:

float delta = cur_time - last_update_time; 
update_sig(delta); // executes all connected slots 

幸運:)

+1

ブーストのlibは完璧に見えます、病気を見てみましょう。ありがとう。 –

関連する問題