現在、Cocos2D を使用して iOS デバイスでタッチを読み取って保存しようとしています。私の方法は、ccTouchBegan、ccTouchMoved、ccTouchCanceled、および ccTouchEnded 関数で各タッチ (マルチタッチが有効になっている) を個別に処理することです。
重要な ivar は次のとおりです。
- activeTouches (新しい有効なタッチ (ジョイスティックの近くにないことを意味する有効な意味) が受信されたときに増加または減少する int)。
- acceptingGestures (新しいタッチを無視するために使用されるブール値)
- GestureTimer (update 関数で ccTime によって連続的にインクリメントされるフロート。あるしきい値を超えると、acceptingGestures は FALSE に設定されます)
これが私のコードです:
-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
CGPoint touchLocation = [touch locationInView: [touch view]];
touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
touchLocation = [self convertToNodeSpace:touchLocation];
//check to see if touch is near joystick to prevent accidental gestures. may want to consider increasing the 'deadzone' value
if(abs(self.joystickLocation.x - touchLocation.x) <= 35 && abs(self.joystickLocation.y - touchLocation.y) <= 35)
{
return NO;
}
if(self.activeTouches == 0)
{
[self setGestureTimerEnable:TRUE];
[self setGestureTimer:0.0f];
}
if(self.acceptingGestures == TRUE);
{
if (self.firstTouch == nil)
{
self.firstTouch = touch;
self.activeTouches++;
return YES;
}
else if (self.secondTouch == nil)
{
self.secondTouch = touch;
self.activeTouches++;
return YES;
}
}
CCLOG(@"touched: %f, %f\n",touchLocation.x, touchLocation.y);
return NO;
}
ccTouchBegan 関数で奇妙な問題が発生しています。エミュレーターを使用した私のテスト シナリオでは、ソフトウェアによって 1 つのタッチが認識され、その後、gestureTimer が実行されています。x 時間後、gestureTimer はしきい値を超え、acceptingGestures を FALSE に設定します。次に、画面に 2 回目のタッチを適用すると、コードはタッチを受け入れ、activeTouches 変数をインクリメントします。それができないはずです!
デバッガーを使用してブレークポイントを設定し、この奇妙なイベントをキャプチャしようとしました。acceptGestures が FALSE であっても (ブレークポイントでの acceptGestures 式は実際には FALSE です)、コードは依然として If ステートメントを通過します! 添付のスクリーンショットで、acceptingGestures が FALSE になっていることに注意してください。
助けていただければ幸いです!ありがとうございました!