Как вызвать функцию типа CallFunc в классе, унаследованным от класса Sprite
Работаю с движком cocos2dx, 4 версии. Есть map, который хранит код нажатой кнопки в качестве ключа и указатель на объект типа CallFunc в качестве значения. Каким образом вызвать данную функцию? При передачи данного указателя в метод runAction вызывается исключение: нарушение доступа для чтения action-> в методе ActionManager::addAction в строке action->startWithTarget(target).
[MainHero.h]
class MainHero : public cocos2d::Sprite
{
cocos2d::Sprite m_hero_sprite;
double m_damage, m_hp;
std::set<cocos2d::EventKeyboard::KeyCode> m_keyboards_pressed_keys; // Хранит коды зажатой клавиши
std::map<const cocos2d::EventKeyboard::KeyCode, cocos2d::CallFunc*> m_action_hero_map;
protected:
MainHero(double hp, double damage, const std::string path_to_image);
public:
static MainHero* create(cocos2d::Vec2 position, std::string file_name);
void attack();
void jump();
void moveToLeft();
void moveToRight();
bool isKeyClamped(cocos2d::EventKeyboard::KeyCode key_code); // Проверка на зажатие клавиши
void controllingHero(cocos2d::EventKeyboard::KeyCode key_code); //Функция, отвечающая за управление персонажем
virtual ~MainHero();
};
[MainHero.cpp]
MainHero::MainHero(double hp, double damage, const std::string path_of_image) : m_hp(hp), m_damage(damage)
{
m_hero_sprite.setTexture(path_of_image); // Картинка для спрайта по определенному пути
auto keyboard_event_listener = cocos2d::EventListenerKeyboard::create(); // Инициализация обработчика событий клавиатуры
auto mouse_event_listener = cocos2d::EventListenerMouse::create(); // Обработчик событий мыши
m_action_hero_map = {
std::make_pair(
cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW, cocos2d::CallFunc::create(CC_CALLBACK_0(MainHero::jump,this))
),
std::make_pair(
cocos2d::EventKeyboard::KeyCode::KEY_LEFT_ARROW, cocos2d::CallFunc::create(CC_CALLBACK_0(MainHero::moveToLeft,this))
),
std::make_pair(
cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW,cocos2d::CallFunc::create(CC_CALLBACK_0(MainHero::moveToRight,this))
),
};
mouse_event_listener->onMouseDown = [this](cocos2d::Event* event)
{
cocos2d::EventMouse* mouse_event = dynamic_cast<cocos2d::EventMouse*>(event);
switch (mouse_event->getMouseButton())
{
case cocos2d::EventMouse::MouseButton::BUTTON_LEFT :
this->attack();
break;
default:
break;
}
};
keyboard_event_listener->onKeyPressed = [this](cocos2d::EventKeyboard::KeyCode key_code, cocos2d::Event* event)
{
m_keyboards_pressed_keys.insert(key_code); // Добавляем код клавиши в множество нажатых клавиш, которые не были отжаты( по сути зажатые клавиши)
controllingHero(key_code);
};
keyboard_event_listener->onKeyReleased = [=](cocos2d::EventKeyboard::KeyCode key_code, cocos2d::Event* event)
{
m_keyboards_pressed_keys.erase(key_code); // Если нажатая клавиша была отжата
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(mouse_event_listener, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(keyboard_event_listener, this);
}
void MainHero::jump()
{
if (!getActionManager()->getNumberOfRunningActions()) // Если количество действий равно 0, нужно чтобы прыжок не происходил еще раз при повторном нажатии
{
runAction(cocos2d::JumpTo::create(1, getPosition(), 40, 1));
}
}
void MainHero::moveToLeft()
{
runAction(cocos2d::MoveBy::create(0, cocos2d::Vec2(-1, 0)));
}
void MainHero::moveToRight()
{
runAction(cocos2d::MoveBy::create(0, cocos2d::Vec2(1, 0)));
}
void MainHero::controllingHero(cocos2d::EventKeyboard::KeyCode key_code)
{ //Управление персонажем
if (m_action_hero_map.find(key_code) != m_action_hero_map.end())
{
if (m_keyboards_pressed_keys.size() > 1)
{
auto iterator = m_keyboards_pressed_keys.begin();
auto sequence = cocos2d::Sequence::create(m_action_hero_map[*iterator], m_action_hero_map[*++iterator], NULL);
this->runAction(sequence);
}
else
runAction(m_action_hero_map[key_code]);
}
}
Пробовал: 1)Менять аргументы в CallFunc::create() на std::bind, на лямба функцию, которая вызывает нужный метод. Ожидал: 1)Смогу обращаться к указателям функций в контейнере, чтобы помещать их в Spawn, который выполняет одновременно объекты типа Action.