Не удается подключиться к работе в многоплатформенном приложении cocos2d-x

Итак, я пытаюсь создать простое приложение, используя новейшую сборку cocos2d-x, и по какой-то причине не могу подключить свое прикосновение. Вот мои классы:

class GameLayer : public cocos2d::Layer
{
public:
    static cocos2d::Layer* createLayer();
    void update(float dt);
    virtual bool init();
    CREATE_FUNC(GameLayer);
private:
    bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event);
    void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event);
    void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event);
};

cocos2d::Layer* GameLayer::createLayer()
{
    GameLayer *layer = GameLayer::create();

    return layer;
}

bool GameLayer::init()
{
    if (!cocos2d::Layer::init())
    {
        return false;
    }

    this->schedule(schedule_selector(GameLayer::update));
    this->setTouchEnabled(true);

    return true;
}

void GameLayer::update(float dt)
{

}

bool GameLayer::onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event)
{
    cocos2d::log("You touched %f, %f", touch->getLocationInView().x, touch->getLocationInView().y);
    return true;
}
void GameLayer::onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event)
{

}
void GameLayer::onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event)
{

}

I noticed when I call into the setTouchEnabled call that an internal flag called _running is set to false so it doesn't actually register my touch events. However I can't seem to figure out why that is the case. Am I calling things incorrectly or in the wrong order?


person Kevin DiTraglia    schedule 03.11.2013    source источник


Ответы (1)


В настоящее время cocos2dx проходит капитальный ремонт библиотеки, и многие вещи изменились, включая регистрацию и распространение Touch. Вот как это работает сейчас:

GameLayer.h

class GameLayer : public cocos2d::Layer
{
public:
    static cocos2d::Layer* createLayer();
    void update(float dt);
    virtual bool init();
    CREATE_FUNC(GameLayer);

private:
    virtual void onEnter();
    virtual void onExit();

    bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event);
    void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event);
    void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event);
};

GameLayer.cpp

cocos2d::Layer* GameLayer::createLayer()
{
    GameLayer *layer = GameLayer::create();

    return layer;
}

bool GameLayer::init()
{
    if (!cocos2d::Layer::init())
    {
        return false;
    }

    this->schedule(schedule_selector(GameLayer::update));

    return true;
}

void GameLayer::onEnter()
{
    Layer::onEnter();

    // Register Touch Event
    auto dispatcher = Director::getInstance()->getEventDispatcher();
    auto listener = EventListenerTouchOneByOne::create();

    listener->onTouchBegan = CC_CALLBACK_2(GameLayer::onTouchBegan, this);
    listener->onTouchMoved = CC_CALLBACK_2(GameLayer::onTouchMoved, this);
    listener->onTouchEnded = CC_CALLBACK_2(GameLayer::onTouchEnded, this);

    dispatcher->addEventListenerWithSceneGraphPriority(listener, this);
}

void GameLayer::onExit()
{
    // You don't need to unregister listeners here as new API
    // removes all linked listeners automatically in CCNode's destructor
    // which is the base class for all cocos2d DRAWING classes

    Layer::onExit();
}

void GameLayer::update(float dt)
{

}

bool GameLayer::onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event)
{
    cocos2d::log("You touched %f, %f", touch->getLocationInView().x, touch->getLocationInView().y);
    return true;
}

void GameLayer::onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event)
{

}

void GameLayer::onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event)
{

}

Надеюсь, поможет!

person nomann    schedule 03.11.2013
comment
Похоже, что registerWithTouchDispatcher устарел, а getTouchDispatcher() больше не существует на Director. Есть идеи, что сейчас эквивалентно? - person Kevin DiTraglia; 03.11.2013
comment
Что ж, API снова обновили. :) Пожалуйста, взгляните на мой обновленный ответ. - person nomann; 03.11.2013
comment
Спасибо за помощь, я использую версию 3.0, которая была только на их главной странице, а не на github (которая также все изменила). Так что в моей версии нет eventListener. Я собираюсь попытаться обновиться до того, что есть на github, я буду держать вас в курсе, если смогу заставить его работать. - person Kevin DiTraglia; 03.11.2013
comment
Человек, загружаемый на их веб-сайте, и то, что находится в github, сильно отличается, наконец, получил его, и этот код работает. Спасибо еще раз за помощь. - person Kevin DiTraglia; 03.11.2013
comment
Вы сказали, что библиотека автоматически отменит регистрацию узла в деструкторе, но вы добавляете EventListener каждый раз, когда узел добавляется в сцену. (т.е. если мы объединяем объект или что-то в этом роде, мы без необходимости заменяем уже существующий список событий, поскольку мы так и не достигли деструктора). - person Mazyod; 05.04.2014
comment
Сделал именно это, и это не работает для меня :/. Я использую Cocos2d-x v3.7 - person user365314; 30.07.2015