Как вызвать функцию типа 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.


Ответы (0 шт):