0

在我的项目中,我使用一个名为 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) 调用返回“无法调用‘applyRecurringForce’且没有参数”

方法2:我添加“!” 遵循建议的解决方案...
1) println 错误与之前的方法相同”:“可选类型 'SKPhysiceBody' 的值未展开;你的意思是用'!' 或 '?'?” 并再次建议我强制展开
2)调用返回与以前相同的错误:“无法在没有参数的情况下调用 'applyRecurringForce'”

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

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

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

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

4

1 回答 1

0

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

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

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

假设这rocketShips是一个节点,那么您需要将其子节点转换为您的自定义节点类,因为默认情况下children是一个数组AnyObject(这就是您看到双重展开的原因)。请参阅下面的完整解决方案。请注意,我正在投射整个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)
    }
}
于 2015-06-20T15:55:47.113 回答