![](/img/trans.png)
[英]When player jumps: scene moves down, player stays at place like Doodle Jump
[英]SKCameraNode Lags Behind When Player Moves
我目前正在嘗試讓我的相機在移動播放器時跟隨播放器“ orb”。 我將攝影機的位置設置為無論何時移動球,都將其移動到球的x位置,但是由於某些原因,隨着球的快速移動,SKCameraNode會出現毛刺和卡頓,好像它試圖趕上節點的位置一樣。 我讀到這是因為物理過程在實際的update()之后運行,但是我不知道如何解決該問題。 有什么辦法可以解決這個問題?
注意:我不希望相機始終位於“球體”的中心,而是在它跟隨球體時稍微延遲一點,以使它具有自由移動的感覺。 (如果有道理)
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)
}
}
您可以使用didSimulatePhysics方法而不是update方法來解決此問題。
將此更新方法替換為:
> override func didSimulatePhysics() {
> let action = SKAction.moveToX(orb.position.x, duration: 0.5)
> theCamera.runAction(action)
> }
之所以會受到這種影響,是因為在每次更新時,都會在相機上附加一個新的SKAction。 這意味着在1秒內,您的相機被告知60次移動到球體位置。 這意味着您有60個動作控制着精靈的移動方式,它們全都在爭奪優先權。
您需要做的是刪除上一個動作,或者使上一個動作完成。
要刪除該動作,可以調用removeAllActions()
或removeAction(forKey:)
當然,這意味着您需要首先為操作分配一個鍵, theCamera.runAction(action, withKey:"cameraMove")
現在,替換動作的一種theCamera.runAction(action, withKey:"cameraMove")
方法是只調用theCamera.runAction(action, withKey:"cameraMove")
,因為新動作將通過刪除它來替換現有動作。
您的另一個選擇是檢查該動作是否與action(forKey:)
存在,然后確定是否需要處理進一步的動作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.