0

我正在使用 GLKit(不使用 Cocos2d)创建游戏,我基本上需要两个“按钮”——每个按钮 250 点宽,并在横向模式下放置在相对的两侧。MultipleTouch 是 YES,因为我需要跟踪不止一个触摸。

在 touchesbegan 中,我确定 touch.x <= 250(按钮 1)或 >= view.bounds.size.width - 250(按钮 2)。基于此,我将 BOOL 设置为 YES 来确定状态。

在 touchesended 中,我想知道用户何时不再“按下”按钮 1 或按钮 2。问题是 - 我不能再测试触摸发生在视图中的位置,因为用户可能已经移动了手指,所以它不是超过最初按下的“按钮”。这意味着如果用户通过按下 Button 1 开始触摸但将手指移到 Button 边界之外然后抬起手指 - 状态仍然是 YES。

有没有一种好方法可以可靠地跟踪 TouchesEnded 中触摸的首次开始位置?任何指向源代码的指针都将受到高度赞赏。

编辑: 这是我创建的代码:

请注意,我知道此代码是错误的,因为它只跟踪一次触摸。但是,我想要实现的是当用户按下左键并将取景器移出该按钮时.. 我需要知道 touchesEnded 中的触摸相当于早先在按钮中开始的触摸,所以我知道该按钮不再“按下”。

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    // Determine where the touch happened
    CGPoint p = [touch locationInView:self.view];

    // If the user pressed the left gutter then break
    if ( p.x <= 250 )
        isBreaking = YES;

    // If the user pressed the right gutter then accelerate
    if ( p.x >= (self.view.bounds.size.width - 250) )
        isAccelerating = YES;
}


- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    // Determine where the touch happened
    CGPoint p = [touch locationInView:self.view];

    // If the user pressed the left gutter then stop break
    if ( p.x <= 250 )
        isBreaking = NO;

    // If the user pressed the right gutter then stop accelerate
    if ( p.x >= (self.view.bounds.size.width - 250) )
        isAccelerating = NO;
}
4

1 回答 1

1

我想我找到了解决方案,虽然我还没有测试过:http: //www.blumtnwerx.com/blog/2009/06/taming-touch-multi-touch-on-the-iphone/

我真正需要知道的是文档:

UITouch 对象在多点触控序列中是持久的。在处理事件时,您永远不应该保留 UITouch 对象。如果您需要将有关触摸的信息从一个阶段保存到另一个阶段,您应该从 UITouch 对象中复制该信息。

于 2013-08-01T20:39:14.453 回答