我正在尝试让我的相机跟随我的播放器" orb"每当玩家移动时。每当球体移动时,我都将相机的位置设置为移动到球体的位置,但是由于某种原因,当球体快速移动时,SKCameraNode会出现故障并且断断续续,就像它是试图赶上节点的位置。我读过它是因为物理在实际更新()之后运行,但我不知道如何解决这个问题。有没有办法解决这个问题?
注意:我不希望相机始终以" orb"为中心,而是在跟随球体时稍微延迟,给它一个自由移动的感觉。 (如果这是有道理的)
import SpriteKit
class GameScene: SKScene {
var orb = SKSpriteNode()
var Touch: UITouch?
let theCamera: SKCameraNode = SKCameraNode()
override func didMoveToView(view: SKView) {
let orbTexture1 = SKTexture(imageNamed:"orb.png")
orb = SKSpriteNode(texture: orbTexture1)
orb.name = "Orb"
orb.position = CGPointMake(300, 95)
self.addChild(orb)
theCamera.position = CGPointMake(300, 0)
theCamera.name = "Camera"
self.addChild(theCamera)
self.camera = theCamera
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
if nodeAtPoint(touch.locationInNode(self)).name == "Orb" {
Touch = touch as UITouch
}
}
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
if Touch != nil {
if touch as UITouch == Touch! {
let location = touch.locationInNode(self)
orb.position = location
}
}
}
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
let action = SKAction.moveToX(orb.position.x, duration: 0.5)
theCamera.runAction(action)
}
}
答案 0 :(得分:1)
您可以使用didSimulatePhysics方法而不是更新方法来解决此问题。
将更新方法替换为:
> override func didSimulatePhysics() {
> let action = SKAction.moveToX(orb.position.x, duration: 0.5)
> theCamera.runAction(action)
> }
答案 1 :(得分:0)
您正在受到这种影响,因为在每次更新时,您都要将新的SKAction附加到相机。这意味着在1秒内,您的相机被告知60次移动到球体位置。这意味着你有60个动作控制你的精灵应该如何移动,并且他们都在努力获得优先权。
您需要做的是删除之前的移动操作,或者让上一个操作完成。
要删除操作,您可以致电removeAllActions()
或removeAction(forKey:)
这当然意味着您需要先为行动分配一个密钥theCamera.runAction(action, withKey:"cameraMove")
现在,替换操作的简便方法是只调用theCamera.runAction(action, withKey:"cameraMove")
,因为新操作将替换现有操作,删除它。
您的另一个选择是检查action(forKey:)
行动是否存在。然后确定是否需要处理进一步的操作。