2012-04-03 73 views
0

如果您可以提供任何指導,我就會徘徊。我目前正在爲一個簡單的遊戲引擎編寫一個精靈類。我曾經使用過的以前的引擎允許將外部函數「連接」到信號,並在動畫結束時發出。從類內部創建一個信號來調用外部函數?

E.g.

  • 創建sprite對象
  • 創建外部函數
  • 外部函數連接到精靈完成信號
  • 當信號發射的外部函數被調用。

該函數不一定與sprite,它的純遊戲邏輯計時功能共享任何數據。例如,玩家獲得一個目標,「恭喜」精靈動畫被觸發,然後完成功能將增加玩家得分。

我已經看過它,它看起來像我需要使用回調函數/函數ptr,但我還沒有任何使用它們的經驗。

任何幫助將不勝感激。

回答

1

在C++中的函數指針可用於這樣的:

#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); 
} 

注功能可以是全局的,或一個靜態類成員。如果你想調用一個對象實例的函數,那麼看看這個 - 特別是我的答案! :-) What is a C++ delegate?

編輯:在評論中問道,更適合的問題:

#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)電話。我對此不熟悉。 – 2012-04-03 10:28:01

+0

此外,爲了適應我的情況,我的函數不會返回任何內容,並且不帶參數,所以我的精靈類將包含typdef void FnPtr(void),然後是void AFunctionThatTakesAFnPtrAsAnArg(FnPtr * fn)。在創建精靈時,我會傳入我將要存儲的函數指針,然後在正確的時間調用AFunctionThatTakesAFnPtrAsAnArg(savedFunctionPtr)。 – 2012-04-03 10:36:18

+0

@馬丁史密斯我已經添加了更多的答案,以適應您的問題;是的,如果你沒有參數,你對typedef是正確的。 HTH。 – 2012-04-03 11:14:53

0

看看http://www.boost.org/doc/libs/1_49_0/doc/html/signals.htmlhttp://libsigc.sourceforge.net/

了boost ::信號庫很容易使用:

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

boost lib看起來很完美,生病了看看整個tuts。謝謝。 – 2012-04-03 12:22:17