展开SKPhysicsBody不起作用

时间:2015-06-20 11:00:40

标签: sprite-kit skphysicsbody forced-unwrapping

在我的项目中,我使用名为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'且没有参数”

Approach2 :我添加“!”遵循建议的解决方案......
1)println错误与前一种方法相同“:”未解包的可选类型'SKPhysiceBody'的值;你的意思是用'!'或'?'?“并再次建议我强行打开 2)调用返回与先前相同的错误:“无法调用'applyRecurringForce'而没有参数”

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

如果我发表评论,我会

  

physicsNodeName:type:representObject:[name:'rocket1'position:{56,294} accumulationFrame:{{16.849998474121094,280.20001220703125},{78.300003051757812,27.5999755859375}}]

有谁知道怎么了?这种双重展开对我来说非常奇怪。

1 个答案:

答案 0 :(得分:0)

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