簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM