如何在SpriteKit游戏中禁用第二次触摸?

时间:2015-08-01 20:38:20

标签: ios objective-c sprite-kit

玩家在我的游戏中拖动一个精灵但是当用另一根手指意外触摸屏幕时,它会明显地扭动这个动作。

我使用以下解决方案禁用第二次触摸,但遗憾的是它不起作用:

//--------------

-(void)touchesBegan:(NSSet*) touches withEvent:(UIEvent*) event {    

    if (touches.count == 1 && draggedNode == nil) {

        CGPoint pos = [[touches anyObject] locationInNode:self];
        SKNode * touchedNode = [self nodeAtPoint:pos];

        if([touchedNode.name isEqual: @"shooterBall"]){
            draggedNode = touchedNode;
        }
        draggedNodeOffset = CGPointMake(draggedNode.position.x - pos.x, draggedNode.position.y - pos.y);
    }   

}

//--------------

-(void)touchesMoved:(NSSet*) touches withEvent:(UIEvent*) event {    
    if (touches.count <= 1) {    
        CGPoint pos = [[touches anyObject] locationInNode:self];
        draggedNode.position = CGPointMake(pos.x + draggedNodeOffset.x, pos.y+draggedNodeOffset.y);
    }
}

//--------------

-(void)touchesEnded:(NSSet*) touches withEvent:(UIEvent*) event {   
    draggedNode = nil;   
}

//--------------

你有什么解决方案吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您想在场景中实施UIPanGestureRecognizer。它可以让您跟踪用户触摸的位置,同时控制其他“迷路”触摸:UIPanGestureRecognizer Documentation

初始化之后,您需要实现一个方法来处理用户的平底锅。您必须在此方法内设置标志以控制滑动开始/结束的时间。我想this answer on StackOverflow gave a really good explanation of using it (with Swift)。顺便说一句,当你初始化它时,你应该将手势识别器的属性maximumNumberOfTouches设置为1(这将导致它在用户平移时忽略其他触摸)。

更棘手的部分是将您之前编写的相同代码转换为手势识别器。不同之处在于,对于每次“滑动”或“平移”,您的处理程序只会被调用一次,而每次有“触摸”时,您现在使用的触摸方法都会被调用。此时有几种方法可以继续,您可以尝试任何您喜欢的方式,但我认为一旦您设置了手势识别器(扰流板),这将是最简单的方法:

  1. 确保手势识别器是一个实例变量,以便您可以从所有方法访问它。

  2. 转到update:方法并制作if语句,检查gesture.state == UIGestureRecognizerStateBegan || gesture.state == UIGestureRecognizerStateChanged

  3. 使用与此if语句相同的算法。要检查触摸所在的位置,请使用以下方法:locationInView:。使用self.view作为参数。

  4. 希望这有帮助!祝你好运。