从类中创建信号以调用外部函数?

时间:2012-04-03 08:07:08

标签: c++ callback sprite

如果你可以提供任何指导,我就会徘徊。我正在为一个简单的游戏引擎编写精灵类。我以前使用的引擎允许将外部函数“连接”到动画完成时发出的信号。

E.g。

  • 创建精灵对象
  • 创建外部功能
  • 将外部函数连接到精灵完成信号
  • 发出信号时,会调用外部函数。

此功能不一定与sprite共享任何数据,它只是纯粹的游戏逻辑定时功能。 E.g球员得分一个目标,“恭喜”精灵动画被触发,然后完成功能将为球员得分增加一笔金额。

我已经调查了它,看起来我需要使用回调函数/函数ptr,但我还没有使用它们的经验。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

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

boost :: signals库非常易于使用:

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
祝你好运:)