SpriteKit 中的触摸持续时间

Posted

技术标签:

【中文标题】SpriteKit 中的触摸持续时间【英文标题】:Touch duration in SpriteKit 【发布时间】:2021-11-28 08:10:31 【问题描述】:

我目前正在使用 SpriteKit,只要用户正在触摸某个 SpriteNode,我就想在更新循环中运行一个代码块。我尝试通过使用布尔值来实现这一点,当 touchesBegan() 方法识别到此节点上的触摸并设置为 false 时,设置为 true,当 touchesEnded() 方法识别到此节点上的触摸结束时。但是,当用户触摸节点然后将手指移出边界时,touchesEnded() 方法无法识别。

有没有一种简单的方法来检查从该节点开始但随后移出该节点的触摸是否仍然存在?或者我可以检查一下 UITouch 实例是否仍然存在?

【问题讨论】:

【参考方案1】:

不清楚您想要什么行为,但一般来说,您可能希望使用触摸身份来跟踪正在发生的事情。

例如,如果您正在处理包含节点的场景中的触摸,并且希望只是在触摸节点时开始动作并在触摸结束时停止动作,那么类似:

// Whatever touch initiated the action
var activeTouch: UITouch?
// Checked by update loop
var doingSomething = false

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
  for touch in touches 
    // Ignore new touches if one is already active
    guard activeTouch == nil else  return 
    let location = touch.location(in: self)
    let touchedNodes = self.nodes(at: location)
    for node in touchedNodes 
      if <some test for the interesting node> 
        activeTouch = touch
        doingSomething = true
      
    
  


override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) 
  for touch in touches 
    if touch == activeTouch 
      // Finished
      activeTouch = nil
      doingSomething = false
    
  

如果您还希望在用户将手指从节点上移开时停止操作并在他们移回节点时重新启动,则还需要覆盖 touchesMoved,例如:

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 
  for touch in touches 
    if touch == activeTouch 
      let location = touch.location(in: self)
      let touchedNodes = self.nodes(at: location)
      // Assume they moved off the node
      doingSomething = false
      for node in touchedNodes 
        if <some test for the interesting node> 
          // Nope, still touching it
          doingSomething = true
        
      
    
  

(您还应该以某种适当的方式处理touchesCancelled,可能会停止操作并清除activeTouch,如touchesEnded

当有多个触摸处于活动状态时,您可能会考虑其他一些行为。您可能需要跟踪所有活动的触摸以及它们在节点上或关闭的状态,然后如果节点上有任何活动的触摸,则设置doingSomething = true。或者,您可能希望touchesMoved 在离开节点后立即放弃活动触摸,因此再次重新打开该触摸不会重新激活。

主要的一点是,跟踪触摸身份为您提供了很大的灵活性,但您必须决定您希望游戏如何反应。

【讨论】:

以上是关于SpriteKit 中的触摸持续时间的主要内容,如果未能解决你的问题,请参考以下文章

如果使用编辑器中的场景加载,如何在 SpriteKit 中检测触摸

如何将 SpriteKit 节点移动为汽车驾驶体验?

SpriteKit 触摸

SpriteKit - 如何检测使用触摸影响哪个节点?

SpriteKit 在触摸时移动物理身体(空气曲棍球游戏)

检测 SpriteKit 中节点特定区域的触摸