2015-06-20 45 views
0

在我的项目中,我使用名为RocketMaker的类创建了新节点。这个类里面,我有一个名为applyRecurringForce()功能...展开SKPhysicsBody不起作用

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:所以我跟着链,这两个错误中的一个被删除...
1)println错误消失
2)该调用返回“'SKPhysicsBody没有名为'applyRecurringForce'的成员“

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

physicsNodeName:类型:representedObject:[名称: 'rocket1' 位置:{56,294} accumulatedFrame:{{16.849998474121094,280.20001220703125},{78.300003051757812,27.5999755859375}}]

没有人有一个想法这是怎么回事??这个双解开看起来很奇怪。

回答

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

谢谢加载!你说得对,rocketShips是一个SKNode。它的孩子建立在自定义节点类(不同颜色的火箭级别)中。我也尝试过rocketNode.applyRecurringForce(),但被错误“AnyObject没有名为'applyRecurringForce()''的成员阻止。将RocketShip儿童投入RocketMaster解决了问题! –

+0

@ ShaneO'Seasnain如果您觉得问题已解决,请将我的答案标记为已接受。祝你好运。 –