精灵节点位置是否无法通过触摸更新?

时间:2019-06-06 22:39:16

标签: ios swift xcode sprite-kit

本质上,我想要的是当我触摸节点时,我希望能够在屏幕上移动它。问题在于,每当我过快地移动手指时,节点就会停止跟随它。

特别是我尝试使用物理对象和动画纹理进行处理的spriteNodes,因此我尝试使用完全简单的spriteNode进行相同的代码,并且遇到了相同的问题。

我在这里拥有的代码非常简单,所以我不确定这是否是我编写的内容的问题,还是仅仅是我无法解决的滞后问题。在所有touchesBegan,touchesMoved和touchesEnded中基本上也是相同的

for touch in touches {

  let pos = touch.location(in: self)
  let node = self.atPoint(pos)

  if node.name == "activeRedBomb"{
    node.position = pos
  }

  if node.name == "activeBlackBomb"{
    node.position = pos
  }


  if node.name == "test"{
    node.position.x = pos.x
    node.position.y = pos.y
  }


}

1 个答案:

答案 0 :(得分:0)

发生的事情是,如果您过快地移动手指,则在某些时候,触摸位置将不再位于子画面上,因此您进行移动节点的代码将不会触发。

您需要做的是在touchesBegan()中设置一个标志以指示该精灵已被触摸,如果已设置该标志,请将其移动到touchesMoved()中的触摸位置,然后重置在touchesEnded()中标记。

这里大致是您需要添加的内容:

import SpriteKit

class GameScene: SKScene {

var bombIsTouched = false

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        if activeRedBomb.contains(touch.location(in: self)) {
            bombIsTouched = true
        }
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if bombIsTouched {
        activeRedBomb.position = (touches.first?.location(in: self))!
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    if bombIsTouched {
        bombIsTouched = false
    }
}