1

在以下代码中,我不断收到“致命错误:在展开可选值时意外发现 nil”

let ballCategoryName =  "ball"


class GameScene: SKScene, SKPhysicsContactDelegate {
    override func didMoveToView(view: SKView) {

    let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
    borderBody.friction = 0
    self.physicsBody = borderBody


    let ball = childNodeWithName(ballCategoryName) as! SKSpriteNode
    ball.position = CGPointMake(self.size.width / 2, self.size.height / 2)
    ball.physicsBody?.dynamic = true
    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height / 2)
    ball.physicsBody!.applyImpulse(CGVector(dx: 2.0, dy: -2.0))

    self.addChild(ball)

错误出现在“let ball = childNodeWithName(ballCategoryName) as!SKSpriteNode”想知道是否有人可以在这里帮助我了解为什么会出现这种情况

4

3 回答 3

1

您必须将该球创建为节点。您可以像这样制作一个节点:

让球 = SKSpriteNode(imageNamed: "fileimage.png")

然后将其添加到场景中。

问题是你从无到有创造了那个球。如果您尚未创建该场景,您将不会在下面找到任何内容。那个孩子不存在。

childNodeWithName(ballCategoryName) 为!SKSpriteNode

于 2016-07-19T21:59:17.080 回答
1

问题是你强制在这条线上不安全地投射:

let ball = childNodeWithName(ballCategoryName) as! SKSpriteNode

该方法childNodeWithName()返回 sprite kit 节点或 nil ( SKSpriteNode?)。感叹号:as! SKSpriteNode表示您确定此 return 不是 nil 并且您想将其转换为 non-optional SKSpriteNode。您似乎遇到了childNodeWithName(..返回 nil 的情况,因此强制转换失败并且您的应用程序崩溃了。

您可以通过多种方式解开可选项,例如,如果您使用以下代码,您的代码会是什么样子if let

if let ball = childNodeWithName(ballCategoryName) {
    ball.position = CGPointMake(self.size.width / 2, self.size.height / 2)
    ball.physicsBody?.dynamic = true
    ball.physicsBody = SKPhysicsBody(circleOfRadius: ball.size.height / 2)
    ball.physicsBody!.applyImpulse(CGVector(dx: 2.0, dy: -2.0))
    self.addChild(ball) 
}

请注意,在此示例中,如果childNodeWithName(ballCategoryName)返回 nil,则 if 子句主体中的代码根本不会运行。

请参阅Apple 文档,以获得有关您可能解开可选值的所有方式的非常全面的解释。

或者,正如其他答案所示,您可以使用 SKSpriteNode 将球实例化为非可选实例let ball = SKSpriteNode(imageNamed: "something.png")

于 2016-07-19T21:59:50.113 回答
0

你应该替换这个

let ball = childNodeWithName(ballCategoryName) as! SKSpriteNode

有了这个

let ball = SKSpriteNode(imageNamed: "YOUR_IMAGE_NAME")

我还建议您阅读SpriteKit 编程指南

于 2016-07-19T21:53:52.560 回答