2017-05-22 2 views
0

Je travaille sur un jeu construit en Cocos2d-x, se passait bien jusqu'à ce que je l'ai testé sur iPhone 6S Plus. Sur cet appareil particulier CCTouchesMoved est appelé plusieurs fois, même sur un seul événement de tap alors que son fonctionne bien sur d'autres appareils iOS, pouvez-vous m'aider ce qui me manque ou y at-il quelque chose de changé dans iPhone 6S plus?CCTouchesMoved appelé plusieurs fois sur single Tapez dans Cocos2d-x

void CCLayerPanZoom::ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent) { 
    CCLOG("CCLayerPanZoom::ccTouchesBegan"); 
} 
void CCLayerPanZoom::ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent) { 
CCLOG("CCLayerPanZoom::ccTouchesMoved"); 
} 

Ici, ccTouchesMoved est appelée plusieurs fois, ce qui est pas un comportement normal et aussi ne pas se produire sur d'autres appareils iOS.

+0

Pouvez-vous fournir du code? – Darvydas

+0

@Darvydas J'ai modifié ma question et ajouté du code. – Zubair

Répondre

1

Je trouve la réponse here

Comme le lancement de l'iPhone/6s 6s plus, une nouvelle technologie appelée 'Touch 3D' est introduit. Le jour où j'ai eu mon nouvel iPhone 6s, j'ai testé mon jeu dessus.

Tout fonctionne très bien pour moi, mais: 1. Parfois, les événements tactiles ne fonctionnent tout simplement pas. 2. Parfois, les événements tactiles fonctionnent de manière ridicule.

Après une semaine de prise de problème, je trouve enfin: La fonction de 'onTouchMoved' sera appelée parfois même si l'emplacement tactile en 2D ne change pas. Oui, l'emplacement tactile est maintenant en 3D. Et l'emplacement tactile dans la dimension z est extrêmement sensible (en comparaison avec les dimensions x et y). Une très légère force appliquée de votre doigt à l'écran pourrait amener l'emplacement tactile à changer de dimension z et faire que le moteur de jeu (cocos2d-x) appelle la fonction de 'onTouchMoved'.

Cependant, la dernière version de cocos2d-x (jusqu'au jour de publication de ce sujet: 2015/10/25) n'a pas encore supporté 3D Touch. Vous ne pouvez donc pas accéder à la dimension z, mais être dérangé par celle-ci. Si une partie de votre logique de jeu ne se préoccupe que si l'emplacement tactile a changé en 2D, la fonction de 'onTouchMoved' n'est plus fiable. Voici ma solution:

Warn votre lecteur de toucher l'écran très légèrement pour éviter le changement de position de contact dans la dimension z fronçant les sourcils

Ou, vous pouvez ajouter du code comme ci-dessous pour éviter le code dans la fonction « onTouchMoved » être utilisé de façon imprévue:

void CCLayerPanZoom::ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent) { 
CCPoint point1 = touch->getLocation(); 
CCPoint point2 = touch->getPreviousLocation(); 
if (point1.equals(point2)) { 
    return; 
} 
CCLOG("CCLayerPanZoom::ccTouchesMoved"); 
} 

getLocation() ou getPreviousLocation() renvoie des valeurs vec2, de sorte que vous pouvez éliminer à peu en toute sécurité le cas de perturbation par le paramètre de force tactile (contact déplacé dans la dimension z).

Alors, c'est ça.