Создание сигнала из класса для вызова внешней функции? - PullRequest
0 голосов
/ 03 апреля 2012

Я бродил, если бы вы могли предложить какое-либо руководство. В настоящее время я пишу класс спрайтов для простого игрового движка. Предыдущие механизмы, которые я использовал, позволяли «подключать» внешнюю функцию к сигналу, излучаемому по окончании анимации.

* 1003 Е.Г. *

  • создать объект спрайта
  • создать внешнюю функцию
  • подключить внешнюю функцию к сигналу завершения спрайтов
  • Когда излучается сигнал, вызывается внешняя функция.

Эта функция не обязательно делится какими-либо данными со спрайтом, это чисто игровая логическая функция синхронизации. Например, игрок забивает гол, запускается спрайтовая анимация «Поздравляю», затем функция завершения добавляет сумму к счету игрока.

Я изучил это и похоже, что мне нужно использовать функцию обратного вызова / функцию ptr, но у меня пока нет опыта их использования.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

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

Обратите внимание, что функция может быть глобальной или статической. Если вы хотите вызвать функцию в экземпляре объекта, посмотрите это - особенно мой ответ! :-) Что такое делегат C ++?

РЕДАКТИРОВАТЬ: Чтобы лучше соответствовать вопросам, заданным в комментариях:

    #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 голосов
/ 03 апреля 2012

Взгляните на http://www.boost.org/doc/libs/1_49_0/doc/html/signals.html или http://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

Удачи:)

...