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