ios - SKCameraNode 跟不上移动节点

标签 ios swift sprite-kit game-physics

我目前正在尝试制作一款“启动(呃)游戏”,即使用 SpriteKit 的 Toss the turle、Learn to fly 和 Burrito Bison 风格的游戏。我已经使用 SpriteKit 的内置物理原理启动了工作,但是当我尝试使用 SKCameraNode 跟随主角时,它似乎总是落后一步(或更多步)让主角“摇晃” "在高速下。

我已经尝试使用 SKAction 和 .position-property 设置相机的位置,结果相同。

我猜这是因为物理更新的速度比实际的 update() 快,我尝试搜索相关信息但一无所获。

“启动”主角的功能:

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))
    }
}

更新()函数:

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 之后运行,因此您的相机移动发生在角色移动后的帧。

当您使用移动 Action 而不是直接设置位置并为该 Action 指定非零持续时间时,您会进一步延迟相机移动。 (您代码中的 dt 是这一帧与之前最后一帧之间的时间,并且您将该时间应用于 future 运动。)因为角色是当你的 Action 运行时仍在移动,相机永远不会 catch - 你总是将相机移动到角色曾经的地方。

不过,设置相机位置只是给自己增加了额外的工作量。使用 SKConstraint相反,SpriteKit 本身将确保相机位置固定在角色上——它在物理之后解决约束,但在同一帧上。

关于ios - SKCameraNode 跟不上移动节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36523568/

相关文章:

ios - Swift 是否可以继承一个轻量级的通用 Objective-c 类?

ios - SwiftUI 转义闭包捕获变异的 'self' 参数

swift - SpriteKit中如何控制节点的速度

Swift 包管理器 - Swift 4 语法

ios - SKSpriteNode - 不同的 Sprite 但功能相同

ios - 如何在 iOS 11 中使用 scenekit - ARKit 动态创建 3D 对象的注释?

android - 为什么 iOS 版本的 Gluon Mobile 应用程序的大小是 Android 相同应用程序版本的 10 倍?

ios - 单例类中的 Swift REST API 调用和协议(protocol)的使用

ios - Xcode 警告符号 - 带有白色圆圈的黄色三角形?

ios - UIStackview 左对齐