【问题标题】:unwrapping SKPhysicsBody doesn't work展开 SKPhysicsBody 不起作用
【发布时间】:2015-06-20 11:00:40
【问题描述】:

在我的项目中,我使用一个名为 RocketMaker 的类来创建新节点。在这个类里面,我有一个函数叫做applyRecurringForce()...

func applyRecurringForce() {
    var thrust: CGVector = CGVectorMake(100, 100)
    physicsBody!.applyForce(thrust)
}

我的问题是我无法从主场景访问此功能。

override func update(currentTime: NSTimeInterval) {
    /* Called before each frame is rendered */
    for rocketNode in rocketShips.children {
        println("physicsBody: \(rocketNode.physicsBody.description)")
        rocketNode.physicsBody.applyRecurringForce()
    }
}

从上面的代码开始,我得到两个错误,一个是println,另一个是调用applyRecurringForce()

方法 1:不强制展开...
1) println 错误是“可选类型 'SKPhysiceBody' 的值未解包;您的意思是使用 '!'或者 '?'?”并建议我强制展开
2) 调用返回“Cannot invoke 'applyRecurringForce' with no arguments”

Approach2:我添加“!”遵循建议的解决方案...
1) println 错误和之前的方法一样": "Value of optional type 'SKPhysiceBody' not unwrapped;你的意思是用'!'还是'?'?”它再次建议我强制展开
2) 调用返回与之前相同的错误:“Cannot invoke 'applyRecurringForce' with no arguments”

Approach3:所以我遵循这个链条,使用“physicsBody!!”在覆盖函数的两行中。这一次,两个错误之一被删除...
1) println 错误消失了
2)调用返回“'SKPhysicsBody 没有名为'applyRecurringForce'的成员”

如果我注释掉电话,我会得到

physicsNodeName:类型:表示对象:[名称:'rocket1'位置:{56, 294} 累积帧:{{16.849998474121094, 280.20001220703125}, {78.300003051757812, 27.5999755859375}}]

有人知道发生了什么吗?这种双重展开对我来说看起来很奇怪。

【问题讨论】:

    标签: sprite-kit skphysicsbody forced-unwrapping


    【解决方案1】:

    好吧,您的 applyRecurringForce 方法是在您的自定义节点类 (RocketMaker) 中声明的,而不是在 SKPhysicsBody 类中声明的。因此,您需要将 for 循环的内部更改为:

    println("physicsBody: \(rocketNode.physicsBody!.description)")
    rocketNode.applyRecurringForce()
    

    我也不确定rocketShips 是什么。我最初虽然它是一个数组,但鉴于您正在访问children 属性,我将假设它是某种SKNode。通常你不想命名单个节点的复数形式。

    假设rocketShips 是一个节点,那么您需要将其子节点转换为您的自定义节点类,因为默认情况下childrenAnyObject 的数组(这就是您看到双重展开的原因)。完整解决方案见下文。请注意,我正在投射整个 children 数组。如果您的数组包含RocketMaster 节点和其他节点的混合,您将需要分别转换每个子节点。

    import SpriteKit
    class GameScene: SKScene {
        var rocketShips: SKNode! //var rocketShips: [RocketMaster] = []
        override func update(currentTime: NSTimeInterval) {
            /* Called before each frame is rendered */
            for rocketNode in rocketShips.children as! [RocketMaster] {
                println("physicsBody: \(rocketNode.physicsBody!.description)")
                rocketNode.applyRecurringForce()
            }
        }
    }
    
    class RocketMaster: SKNode {
        func applyRecurringForce() {
            var thrust: CGVector = CGVectorMake(100, 100)
            physicsBody!.applyForce(thrust)
        }
    }
    

    【讨论】:

    • 感谢负载!你是对的,rocketShips 是一个 SKNode。它的子节点建立在自定义节点类(不同颜色的火箭级别)中。我也尝试过rocketNode.applyRecurringForce(),但被错误“AnyObject 没有名为'applyRecurringForce()'的成员”阻止。将rocketShips 子级投射到RocketMaster 解决了这个问题!
    • @ShaneO'Seasnain 如果您觉得您的问题已解决,请将我的回答标记为已接受。祝你的游戏好运。
    猜你喜欢
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2021-08-24
    • 2017-02-03
    相关资源
    最近更新 更多