Как создать пользовательский прослушиватель событий без лямбда-функции в Cocos2d-x 3.x?

76
11

Новый диспетчер событий в Cocos2d-x 3.x имеет несколько тестовых примеров, в которых lambdas используется для обратных вызовов в одном классе. У меня есть базовый класс, который должен регистрироваться для какого-либо события, а затем метод overside subclass отвечает на это событие. Как бы я это сделал?

В моем базовом классе:

EventListenerCustom* listener = EventListenerCustom::create("my_event", myVirtualEventMethod);

Обновлено на основе ответа Кадзуки:

class BaseScene : public cocos2d::Layer
{
public:
virtual void myVirtualEventMethod();
};

Мой метод:

EventListenerCustom* listener = EventListenerCustom::create("my_event", CC_CALLBACK_1(BaseScene::myVirtualEventMethod, this));

См. Ошибку в комментариях ниже.

спросил(а) 2021-01-19T17:09:59+03:00 2 месяца, 3 недели назад
1
Решение
95

EventListenerCustom :: create() принимает std :: function.

https://github.com/cocos2d/cocos2d-x/blob/v3/cocos/base/CCEventListenerCustom.h#L59

static EventListenerCustom* create(const std::string& eventName, const std::function<void(EventCustom*)>& callback)

Таким образом, вы можете указать функцию-член с std :: bind следующим образом.

EventListenerCustom* listener = EventListenerCustom::create("my_event",
std::bind(&YourSubclass::myVirtualEventMethod, this, std::placeholders::_1));

И есть макрос для него в cocos2d-x.

EventListenerCustom* listener = EventListenerCustom::create("my_event",
CC_CALLBACK_1(YourSubclass::myVirtualEventMethod, this));

РЕДАКТИРОВАНИЕ

No viable conversion from '__bind<void (BaseScene::*)(), BaseScene ,
std::__1::placeholders::__ph<1>&>' to 'const std::function<void(Eventcustom)>'

Поскольку тип myVirtualEventMethod не совпадает с типом void (EventCustom *). Таким образом, это должно быть

virtual void myVirtualEventMethod(EventCustom*);

Или

EventListenerCustom* listener = EventListenerCustom::create("my_event",
CC_CALLBACK_0(YourSubclass::myVirtualEventMethod, this));

ответил(а) 2021-01-19T17:09:59+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема