Cocos2d-x v3 iOS应用程序未注册第一个x触摸事件

时间:2014-06-26 14:55:35

标签: ios cocos2d-x cocos2d-x-3.0

我对cocos2d-x v3有一个非常奇怪的问题,前15个触摸左右未在我的iOS设备上注册(尝试了iPad 2和iPad air)。一旦触摸最终注册,一切正常(也就是触发onTouch功能后的所有触摸)。

触摸事件在模拟器中完美运行。 此外,相同的代码在我的Windows和Android版本中完美运行。

有没有人发生这种情况,或者可能知道是什么原因造成的?

我正在使用监听器,并且我调试到touchesBegan将输入事件转发给监听器的位置,但即使在第15次敲击之后事件也不会进入。

这真的很奇怪......而且我想我会在这里试一试,因为在开始剥离代码尽可能干净之前,有人可能也遇到过这种情况,然后尝试从我的方式回来那里...

亲切的问候, 迈克尔

编辑:根据要求,这里有一些代码。理想的行为是它可以在iOS设备中运行:首先触摸触发onTouchBegan。

我没有添加它,因为它认为它不重要,因为代码适用于Android。 但我很感激你想看到它,以防万一我可能错过了什么

GameLayer是一个Cocos2d :: Layer。

void GameLayer::onEnter()
{
    cocos2d::CCLayer::onEnter();

    // Register Touch Event
    auto pEventDispatcher = cocos2d::Director::getInstance()->getEventDispatcher();
    if (pEventDispatcher)
    {
        // Touch listener
        auto pTouchListener = cocos2d::EventListenerTouchOneByOne::create();
        if (pTouchListener)
        {
            pTouchListener->setSwallowTouches( true );
            pTouchListener->onTouchBegan        = CC_CALLBACK_2( GameLayer::onTouchBegan, this );
            pTouchListener->onTouchMoved        = CC_CALLBACK_2( GameLayer::onTouchMoved, this );
            pTouchListener->onTouchEnded        = CC_CALLBACK_2( GameLayer::onTouchEnded, this );
            pTouchListener->onTouchCancelled    = CC_CALLBACK_2( GameLayer::onTouchCancelled, this );
            pEventDispatcher->addEventListenerWithSceneGraphPriority( pTouchListener, this );
        }
    }
}


bool GameLayer::onTouchBegan( cocos2d::Touch* pTouch, cocos2d::Event* /*pEvent*/ )
{
    // Breakpoint here triggers fine on first touch for Android/Windows/iOS Simulator,
    // but not on iOS device (iPad/iPhone)
    bool breakHere = true;
    <<snip actual code>>
}

编辑: 问题是std :: ofstream试图在iOS设备上打开()(很可能是在它无法访问的文件夹中)。

2 个答案:

答案 0 :(得分:0)

我的游戏中有很多层次,我不像你那样做。在你的代码中,需要在本地获取EventDispatcher并像你一样创建触摸监听器对我来说似乎很奇怪。我从未在这么多步骤中看到它。

我做:

auto listener = cocos2d::EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);

listener->onTouchBegan = [&](cocos2d::Touch* touch, cocos2d::Event* event)
{
    return true;
};

listener->onTouchEnded = [=](cocos2d::Touch* touch, cocos2d::Event* event)
{
    // ... do something

};

cocos2d::Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(listener, 31);

答案 1 :(得分:0)

我修好了。

问题似乎完全不相关,我试图打开一个std :: ofstream文件(我的日志文件),很可能是在它没有(任何和/或写入)访问权限的文件夹中。 iOS设备上不需要,也不需要。

一旦我将IOS添加到排除列表中(就像Android和更多目标一样),一切都开始变得完美。

我不知道到底出了什么问题,以及为什么它会在几次触摸输入后开始工作,但我猜它正在等待或在后台重试某些内容。

我在调试另一个时遇到了问题:) 希望这可以帮助其他任何可能遇到相同或相关问题的人。

亲切的问候, 迈克尔