展开 SKPhysicsBody 不起作用
unwrapping SKPhysicsBody doesn't work
在我的项目中,我使用名为 RocketMaker 的 class 创建新节点。在这个 class 中,我有一个名为 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 错误是 "Value of optional type 'SKPhysiceBody' not unwrapped; did you mean to use '!' or '?'?" 并建议我强制展开
2)调用returns"Cannot invoke 'applyRecurringForce' with no arguments"
方法2:我加“!”按照建议的解决方案...
1) println 错误与之前的方法相同": "Value of optional type 'SKPhysiceBody' not unwrapped; did you mean to use '!' or '?'?" 并且它再次建议我强制解包
2) 调用returns 和之前一样的错误:"Cannot invoke 'applyRecurringForce' with no arguments"
Approach3:所以我遵循链条,在覆盖函数的两行中使用 "physicsBody!!"。这次,两个错误之一被删除了...
1) println 错误消失了
2)调用returns“'SKPhysicsBody没有名为'applyRecurringForce'”的成员
如果我注释掉这个调用,我会得到
physicsNodeName: type: representedObject:[ name:'rocket1' position:{56, 294} accumulatedFrame:{{16.849998474121094, 280.20001220703125}, {78.300003051757812, 27.5999755859375}}]
有谁知道发生了什么事吗??这种双重展开对我来说很奇怪。
您的 applyRecurringForce
方法是在您的自定义节点 class (RocketMaker
) 中声明的,而不是 SKPhysicsBody
class。因此,您需要将 for 循环的内部更改为:
println("physicsBody: \(rocketNode.physicsBody!.description)")
rocketNode.applyRecurringForce()
另外我不太确定 rocketShips
是什么。我最初虽然它是一个数组,但鉴于您正在访问 children
属性,我将假设它是某种 SKNode
。通常您不想将单个节点命名为复数。
假设 rocketShips
是一个节点,那么您需要将其子节点转换为您的自定义节点 class 因为默认情况下 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)
}
}
在我的项目中,我使用名为 RocketMaker 的 class 创建新节点。在这个 class 中,我有一个名为 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 错误是 "Value of optional type 'SKPhysiceBody' not unwrapped; did you mean to use '!' or '?'?" 并建议我强制展开
2)调用returns"Cannot invoke 'applyRecurringForce' with no arguments"
方法2:我加“!”按照建议的解决方案...
1) println 错误与之前的方法相同": "Value of optional type 'SKPhysiceBody' not unwrapped; did you mean to use '!' or '?'?" 并且它再次建议我强制解包
2) 调用returns 和之前一样的错误:"Cannot invoke 'applyRecurringForce' with no arguments"
Approach3:所以我遵循链条,在覆盖函数的两行中使用 "physicsBody!!"。这次,两个错误之一被删除了...
1) println 错误消失了
2)调用returns“'SKPhysicsBody没有名为'applyRecurringForce'”的成员
如果我注释掉这个调用,我会得到
physicsNodeName: type: representedObject:[ name:'rocket1' position:{56, 294} accumulatedFrame:{{16.849998474121094, 280.20001220703125}, {78.300003051757812, 27.5999755859375}}]
有谁知道发生了什么事吗??这种双重展开对我来说很奇怪。
您的 applyRecurringForce
方法是在您的自定义节点 class (RocketMaker
) 中声明的,而不是 SKPhysicsBody
class。因此,您需要将 for 循环的内部更改为:
println("physicsBody: \(rocketNode.physicsBody!.description)")
rocketNode.applyRecurringForce()
另外我不太确定 rocketShips
是什么。我最初虽然它是一个数组,但鉴于您正在访问 children
属性,我将假设它是某种 SKNode
。通常您不想将单个节点命名为复数。
假设 rocketShips
是一个节点,那么您需要将其子节点转换为您的自定义节点 class 因为默认情况下 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)
}
}