Приложение Cocos2d-x v3 для iOS не регистрирует события первого касания x

У меня действительно странная проблема с 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 (скорее всего, в папке, к которой у него не было доступа).


person Michaël    schedule 26.06.2014    source источник
comment
Вопросы, требующие помощи в отладке (почему этот код не работает?), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для их воспроизведения, в самом вопросе.   -  person LearnCocos2D    schedule 26.06.2014
comment
У меня вообще нет этой проблемы. Можете ли вы показать код о том, что работает, а что, по вашему мнению, нет, чтобы мы могли помочь?   -  person GameDeveloper    schedule 26.06.2014
comment
Я добавил запрошенную информацию... Я не против опубликовать весь код, но я подумал, что это сделает огромный пост, и меня будут ругать :) Я просто проверял, сталкивался ли кто-нибудь с подобным поведением, так как это очень специфичный (первые касания ## не регистрируются на устройстве iOS, но как только они регистрируются, все работает нормально). Если никто не видел этого раньше, я создам небольшой демонстрационный проект и начну работать оттуда... Прямо сейчас мне пришлось бы опубликовать весь код моего движка, и это было бы немного TMI.   -  person Michaël    schedule 27.06.2014
comment
Какую версию cocos2d-x вы используете?   -  person Wez Sie Tato    schedule 27.06.2014
comment
Wez: 3.1.1 для Android, 3.0 для iOS.   -  person Michaël    schedule 27.06.2014
comment
Я думаю, что я попробую создать совершенно новый проект xcode и начать с нуля. Возможно, там что-то не так, так как проблема, похоже, не случалась ни с кем другим. Как только я это выясню, я дам вам знать, ребята.   -  person Michaël    schedule 27.06.2014


Ответы (2)


В моей игре много слоев, и я не делаю этого так, как вы. В вашем коде необходимость получить EventDispatcher локально и создать прослушиватель касаний, как вы, кажется мне странным. Я никогда не видел, чтобы он спускался вниз так много ступенек.

I do:

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);
person GameDeveloper    schedule 27.06.2014
comment
Это потому, что Cocos2d-x — это всего лишь цель для моего движка. У меня также есть встроенная поддержка Direct X, поддержка Flash и поддержка определенных SDK, необходимых для встраиваемых систем. Я пишу фактический код игры один раз, а затем могу выпустить все, что поддерживается. Плюс, если выходит что-то новое, я просто добавляю цель, и игра работает над этим. - person Michaël; 27.06.2014
comment
хорошо, вы можете сделать это, но вы не можете не делать то, что нужно cocos2d-x, потому что вы поддерживаете другие цели игрового движка. Я тоже поддерживаю больше, и у меня нет ваших проблем. Я бы просто прошел через то, что вы делаете, и проверил бы это тогда. - person GameDeveloper; 30.06.2014
comment
Я почти уверен, что происходит что-то странное, поэтому я перезапущу весь чистый проект. Я делаю все, что нужно cocos2d-x, поэтому он работает нормально :) Есть только эта странная проблема при работе на реальных устройствах iOS, и я отладил ее до самого высокого уровня читаемого кода в коде cocos, и там он срабатывает только после 15/20 нажатий. Буду держать вас в курсе моих находок... - person Michaël; 01.07.2014
comment
Для справки, тот же движок отлично работал на cocos2d v1, но я обновился до cocos2d-x v3, чтобы мне не пришлось поддерживать 2 разные версии cocos (фактически 3, считая Windows RT). - person Michaël; 01.07.2014

Я исправил это.

Проблема, казалось бы, была совершенно не связанной, я пытался открыть файл std::ofstream (мой файл журнала), скорее всего, в папке, к которой у него не было доступа (какого-либо и/или записи). Что не требуется и не требуется на устройстве iOS.

Как только я добавил IOS в список исключений (так же, как Android и некоторые другие цели), все стало работать идеально.

Я не знаю, что именно пошло не так, и почему он начинает работать после нескольких касаний, но я предполагаю, что он ждал или повторял что-то в фоновом режиме.

Я обнаружил проблему во время отладки другой :) Надеюсь, это поможет всем, кто может наткнуться на ту же или связанную проблему.

С уважением, Михаил

person Michaël    schedule 25.07.2014