【问题标题】:How to disable second touch in an SpriteKit game?如何在 SpriteKit 游戏中禁用第二次触摸?
【发布时间】:2015-08-01 20:38:19
【问题描述】:

玩家在我的游戏中拖动了一个精灵,但是当不小心用第二根手指触摸屏幕时,它显然会拧紧移动。

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

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

-(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;   
}

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

您对此有任何解决方案吗?

提前感谢您的帮助!

【问题讨论】:

  • 你为什么不使用手势识别器。它将允许您指定一次可以发生多少次触摸
  • 我以为它是用来滑动和捏合的。
  • 是的,你想让玩家的手指在屏幕上滑动或平移,对吧?
  • 是的,但不仅仅是一次滑动,他可以将精灵拖动到屏幕的任何位置。和平移手势一样吗?
  • 是的。在这里,我将给出更详细的解释

标签: ios objective-c sprite-kit


【解决方案1】:

您想在场景中实现UIPanGestureRecognizer。它将允许您跟踪用户触摸的位置,同时控制其他“杂散”触摸:UIPanGestureRecognizer Documentation

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

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

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

  2. 转到update: 方法并创建一个if 语句来检查gesture.state == UIGestureRecognizerStateBegan || gesture.state == UIGestureRecognizerStateChanged 是否存在

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

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

【讨论】:

  • 非常感谢!我唯一的问题是我已经为 skscene 使用了一个委托来进行物理碰撞检测。我怎样才能让另一个做手势?
  • 没问题,物理“委托”实际上与手势处理无关。物理内容将在didBeginContact: 中调用,而手势内容将在您初始化时定义的另一种方法(操作:@selector(insertyourmethodnamehere))中调用。只需查看我给您的第二个链接即可。会有很大帮助的。
  • 如果我有 我不能将 放在 skscene 标题中。它只接受一名代表,这是我的问题。
  • 哦,你不需要这样做。像在我放入的那个链接中那样使用动作选择器进行初始化要容易得多。基本上,您将手势识别器配置为调用场景内的方法并将自身作为参数传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多