【问题标题】:SKCameraNode doesn't keep up with moving nodeSKCameraNode 跟不上移动节点
【发布时间】:2016-04-09 22:39:52
【问题描述】:

我目前正在尝试制作一个“启动游戏”,即使用 SpriteKit 的 Toss the turle、Learn to fly 和 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 上的完整项目。

【问题讨论】:

    标签: ios swift sprite-kit game-physics


    【解决方案1】:

    通过在update 中手动设置相机位置,您将相机移动至少延迟一帧 - 物理在update 之后运行,因此您的相机移动发生在角色移动后的帧上。

    当您使用移动动作而不是直接设置位置并赋予该动作非零持续时间时,您会进一步延迟相机移动。 (代码中的dt 是这一帧和之前的最后一帧之间的时间,并且您正在将该时间应用于未来 动作。)因为在您执行动作时角色仍在移动运行时,相机将永远追不上——您总是将相机移动到角色所在的位置

    不过,设置相机位置只是为您自己做额外的工作。改用SKConstraint,SpriteKit 本身会确保相机位置与角色保持一致——它在物理之后解决了约束,但在同一帧上。

    【讨论】:

    • 非常感谢,这很好用!现在的问题是确保只要主角在屏幕内,相机节点的 y 值是恒定的(即如果 mainCharNode.position.y
    • 现在我有两个约束,一个使用恒定范围 0 和 mainCharNode 作为 toNode: 的距离约束,以及一个使用可播放屏幕的 midY 值的 positionY 约束。然而,距离约束似乎“压倒”了 positionY 约束,并且 cameraNode 仍然遵循 mainCharNode 的 x 和 y 值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多