我目前正在尝试使用 Cocos2D 在 iOS 设备上读取和存储触摸。我的方法是在 ccTouchBegan、ccTouchMoved、ccTouchCanceled 和 ccTouchEnded 函数中单独处理每个触摸(启用多点触控)。
重要的变量是:
- activeTouches(当接收到新的有效触摸(有效表示不在操纵杆附近)时递增或递减的 int)。
- acceptingGestures(用于忽略任何新触摸的布尔值)
- 手势定时器(float,在更新函数中由 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。然后我对屏幕应用第二次触摸,代码接受触摸并增加 activeTouches 变量!它不应该这样做!
我使用调试器设置了一个断点,并试图捕捉这个奇怪的事件。即使acceptingGestures 是FALSE(断点处的acceptingGestures 表达式确实是FALSE),代码仍然通过If 语句!在随附的屏幕截图中,请注意 acceptingGestures 为 FALSE。
我将不胜感激任何帮助!谢谢!