[英]SpriteKit: static background in the scene with moving SKCameraNode
[英]SKCameraNode doesn't keep up with moving node
我目前正在嘗試制作“啟動游戲”,即使用SpriteKit進行拋擲草龜,學習飛行和Burrito Bison風格的游戲。 我已經開始使用SpriteKit的內置物理方法進行工作,但是當我嘗試使用SKCameraNode跟隨主角時,似乎總是落后一步(或更多),這使得主角“搖晃”高速行駛。
我嘗試過使用SKAction和.position-property設置相機的位置,結果相同。
我猜這是因為物理更新的速度比實際的update()快,所以我嘗試搜索有關此信息,但發現zilch。
用於“啟動”主角的功能:
func touchStopped(touchPoint: CGPoint) {
if !inAir {
arrow.removeFromParent()
inAir = true
mainCharNode.physicsBody = SKPhysicsBody(circleOfRadius: mainCharNode.size.width/2)
mainCharNode.physicsBody?.mass = mainChar.mass
mainCharNode.physicsBody?.restitution = mainChar.restitution
mainCharNode.physicsBody?.linearDamping = mainChar.airResistance
mainCharNode.physicsBody?.velocity = CGVectorMake(touchPoint.x*2, touchPoint.y)
mainCharNode.physicsBody?.categoryBitMask = mainCategory
mainCharNode.physicsBody?.collisionBitMask = groundCategory
} else {
mainCharNode.physicsBody?.applyImpulse(CGVectorMake(10000, 10000))
}
}
Update()函數:
override func update(currentTime: CFTimeInterval) {
if lastUpdateTime > 0 {
dt = currentTime - lastUpdateTime
} else {
dt = 0
}
lastUpdateTime = currentTime
if mainCharNode.position.x > 1000 {
let moveCamera = SKAction.moveTo(CGPoint(x: mainCharNode.position.x, y: cameraNode.position.y), duration: dt)
cameraNode.runAction(moveCamera)
}
if(inAir && !gameOver) {
distance += (mainCharNode.physicsBody?.velocity.dx)!*CGFloat(dt)
if(mainCharNode.physicsBody?.velocity == CGVector(dx: 0,dy: 0)) {
gameOver = true
mainCharNode.physicsBody?.dynamic = false
}
}
}
https://github.com/CalleLundstedt/LauncherGame,這里是github上的完整項目。
通過在update
手動設置攝像頭位置,您會將攝像頭移動至少延遲一幀-物理在update
后運行,因此您的攝像頭移動是在角色移動后在該幀上發生的。
當您使用移動動作而不是直接設置位置並為該動作提供非零的持續時間時,您將更加延遲相機的移動。 (代碼中的dt
是該幀與其之前的最后一個幀之間的時間,您正在將該時間應用於將來的動作。)由於角色在執行動作時仍在移動,因此相機永遠不會追上來-你總是移動相機的字符在哪里。
但是,完全設置相機位置只是為自己做一些額外的工作。 改用SKConstraint
,SpriteKit本身將確保攝影機的位置與角色保持一致-它可以解決物理問題之后但在同一幀上的約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.