本质上,我想要的是当我触摸节点时,我希望能够在屏幕上移动它。问题在于,每当我过快地移动手指时,节点就会停止跟随它。
特别是我尝试使用物理对象和动画纹理进行处理的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
}
}
答案 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
}
}