【问题标题】:Updating SKPhysicsBody rectangleOfSize更新 SKPhysicsBody rectangleOfSize
【发布时间】:2015-12-23 07:13:34
【问题描述】:

所以我有一个桨/杆,当那个杆与球碰撞时,它会收缩。我还想更新到桨/杆的 SKPhysicsBody 以便它与视觉精灵保持相同的碰撞框。我该如何做到这一点?

这是我当前的代码,位于 didBeginContact-collision 函数中

bar.size = CGSizeMake(16 * playerLife, 16)
bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64))

bar.size 按预期工作。 physicsBody rectangleOfSize 使游戏崩溃。

更新:包含更多代码以回应评论

bar.size = CGSizeMake(16 * playerLife, 16)
bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64))


func CollisionWithDeathBar(ball: SKSpriteNode, deathBar: SKSpriteNode) {
    playerLife--
    bar.size = CGSizeMake(16 * playerLife, 16)
    shouldResizePaddle = true
}

override func didSimulatePhysics() {
    if shouldResizePaddle {
        bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64))
        shouldResizePaddle = false
    }
}

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    不允许在物理接触回调期间修改物理体。

    (想想看。在更新物理模拟期间,SpriteKit 必须检查世界上所有的物理实体,找到碰撞,并为每个实体调用接触处理程序。如果你可以在中间更改实体所有这些,你会得到未定义的,或者至少是定义不明确的结果。)

    我建议使用联系功能来安排稍后发生的物理体更改。像这样的:

    var shouldResizePaddle = false
    
    func didBeginContact(_ contact: SKPhysicsContact) {
        if /* paddle/ball contact */ {
            shouldResizePaddle = true
        }
    }
    
    override func didSimulatePhysics() {
        if shouldResizePaddle {
            bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64))
            shouldResizePaddle = false
        }
    }
    

    【讨论】:

    • 我更新了我的帖子以包含更多代码。我试过你的例子,我遇到了一个奇怪的问题。桨/条(碰撞时)向下跳约 32 像素。并允许所有球直接通过它。似乎 SKPhysicsBody 只是消失了。它还会崩溃(有时)“致命错误:在展开可选值时意外发现 nil”
    • 不可能从您发布的代码中诊断出所有这些问题。然而,至少有一些是明确的:如果你重新创建一个物理体,你需要重新设置与之相关的所有属性(如碰撞蒙版)。
    • 这正是缺少的,谢谢!我没有意识到它被重新创建了。我认为它只是更改了该值,类似于更新变量。谢谢。
    • 很高兴为您提供帮助!当你看到像bar.physicsBody = //... 这样的表达式时,它总是用右边的东西替换左边的东西。当您看到Thing(/*...*/) 之类的内容时,它总是创建一个新的 Thing,不管它所在的任何表达式的左侧可能是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多