c++ - 无法接触到在多平台 cocos2d-x 应用程序中工作

标签 c++ cocos2d-x cocos2d-x-3.0

所以我正在尝试使用 cocos2d-x 最新版本创建一个简单的应用程序,但由于某种原因无法连接我的触摸。这是我的类(class):

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)
{

}

我注意到,当我调用 setTouchEnabled 调用时,名为 _running 的内部标志设置为 false,因此它实际上并未注册我的触摸事件。但是我似乎无法弄清楚为什么会这样。我是不是调用错误或顺序错误?

最佳答案

目前,cocos2dx 正在对库进行重大改革,许多事情都发生了变化,包括触摸注册和传播。现在它是这样工作的:

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)
{

}

希望对您有所帮助!

关于c++ - 无法接触到在多平台 cocos2d-x 应用程序中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19748790/

相关文章:

c++ - 如何避免忘记在子类中定义 operator== ?

cocos2d-x - CCLayer::init() 和 CCLayer::onEnter() 之间的区别?

android - 使 : No rule to make target. Eclipse 错误

c++ - 使用 Cocos2d-x 3.x 在 Sprite 上触摸事件?

c++ - 当焦点在 QTableView 上丢失时丢失背景颜色

c++ - 使用 IwGxFontDrawText 显示西里尔字体

javascript - Cocos2d js 如何自动换行 ccLabel

c++ - 我是否需要为每个要检测的 Sprite 设置 addEventListenerWithSceneGraphPriority?

c++ - 在一个文件中未定义对 Class::Class() 和函数的引用? C++

javascript - 为什么 cocos2d-js + Chipmunk 只适用于 Web 构建