在展开可选值时意外发现 nil - Sprite Kit
unexpectedly found nil while unwrapping an Optional value - Sprite Kit
大家好,我的 Sprite Kit 游戏有一个大问题。我是新手,我正在尝试做一种小行星游戏,只是为了锻炼我学到的东西。
我的问题是,我的小行星是无限的,除非玩家被击中,否则它们不会停止。我的代码如下:
对于流星:
func addMeteor() {
let bigMeteor = SKSpriteNode(imageNamed: "meteor1")
let bigMeteorAux = bigMeteor
let sizeX = UInt32(CGRectGetMaxX(self.frame))
let randomX = CGFloat(arc4random_uniform(sizeX))
var impulse : CGVector!
bigMeteorAux.position = CGPoint(x: randomX, y: size.height + 100)
impulse = CGVector(dx: 0, dy: -30)
bigMeteorAux.physicsBody = SKPhysicsBody(texture: bigMeteor.texture, size: bigMeteor.size);
bigMeteor.physicsBody?.affectedByGravity = false
bigMeteor.physicsBody?.allowsRotation = false
bigMeteorAux.physicsBody?.friction = 0.0
bigMeteorAux.physicsBody!.categoryBitMask = CollisionCategoryAsteroids
bigMeteorAux.name = "Asteroid"
foregroundNode!.addChild(bigMeteorAux)
bigMeteorAux.physicsBody!.applyImpulse(impulse)
}
我用一个动作调用函数:
runAction(SKAction.repeatActionForever(
SKAction.sequence([
SKAction.runBlock(addMeteor),
SKAction.waitForDuration(1.0)
])
))
完美到现在,游戏运行正常。这是播放器代码:
playerNode = SKSpriteNode(imageNamed: "spaceshipv2")
playerNode!.physicsBody = SKPhysicsBody(texture: playerNode!.texture, size: playerNode!.size);
playerNode!.xScale = 0.5
playerNode!.yScale = 0.5
playerNode!.position = CGPoint(x: size.width / 2.0, y: 220.0)
playerNode!.physicsBody!.linearDamping = 1.0
playerNode!.physicsBody!.allowsRotation = false
playerNode!.physicsBody?.affectedByGravity = false
playerNode!.physicsBody!.categoryBitMask = CollisionCategoryPlayer
playerNode!.physicsBody!.contactTestBitMask =
CollisionCategoryAsteroids
playerNode!.name = "Player"
//addChild(playerNode!)
foregroundNode!.addChild(playerNode!)
最后一个联系方式:
func didBeginContact(contact: SKPhysicsContact) {
var nodeB = contact.bodyB!.node!
if nodeB.name == "Asteroid" {
println("Touched")
nodeB.removeFromParent()
}
}
所以我的问题从 nodeB 开始,出于某种原因有时当小行星撞击玩家时这段代码工作正常但其他时候当小行星撞击玩家时游戏崩溃并且我得到
fatal error: unexpectedly found nil while unwrapping an Optional value
程序进入联系人功能后
关于如何解决这个问题的任何想法或解决方案?多谢! =)
崩溃来自两个强制展开调用之一:bodyB!
和 node!
。通过这样写,你断言你确定他们永远不会 nil
。
找到其中一个为零的情况的方法是将代码分解成可以使用断点检查的行。
var bodyB = contact.bodyB
if bodyB == nil {
// breakpoint here
}
var nodeB = bodyB!.node
if nodeB == nil {
// breakpoint here
}
if nodeB!.name = "Asteroid" // etc.
代码停止后,您可以检查对象并尝试找出它们 nil
的原因并解决问题。
我不确定为什么节点显示为 nil,但您可以通过不强制展开 nil 值来避免崩溃:
if let nodeB = contact.bodyB?.node?
if nodeB.name == "Asteroid" {
println("Touched")
nodeB.removeFromParent()
}
}
如果这些可选值可以成功解包,那段代码只会运行。
大家好,我的 Sprite Kit 游戏有一个大问题。我是新手,我正在尝试做一种小行星游戏,只是为了锻炼我学到的东西。
我的问题是,我的小行星是无限的,除非玩家被击中,否则它们不会停止。我的代码如下:
对于流星:
func addMeteor() {
let bigMeteor = SKSpriteNode(imageNamed: "meteor1")
let bigMeteorAux = bigMeteor
let sizeX = UInt32(CGRectGetMaxX(self.frame))
let randomX = CGFloat(arc4random_uniform(sizeX))
var impulse : CGVector!
bigMeteorAux.position = CGPoint(x: randomX, y: size.height + 100)
impulse = CGVector(dx: 0, dy: -30)
bigMeteorAux.physicsBody = SKPhysicsBody(texture: bigMeteor.texture, size: bigMeteor.size);
bigMeteor.physicsBody?.affectedByGravity = false
bigMeteor.physicsBody?.allowsRotation = false
bigMeteorAux.physicsBody?.friction = 0.0
bigMeteorAux.physicsBody!.categoryBitMask = CollisionCategoryAsteroids
bigMeteorAux.name = "Asteroid"
foregroundNode!.addChild(bigMeteorAux)
bigMeteorAux.physicsBody!.applyImpulse(impulse)
}
我用一个动作调用函数:
runAction(SKAction.repeatActionForever(
SKAction.sequence([
SKAction.runBlock(addMeteor),
SKAction.waitForDuration(1.0)
])
))
完美到现在,游戏运行正常。这是播放器代码:
playerNode = SKSpriteNode(imageNamed: "spaceshipv2")
playerNode!.physicsBody = SKPhysicsBody(texture: playerNode!.texture, size: playerNode!.size);
playerNode!.xScale = 0.5
playerNode!.yScale = 0.5
playerNode!.position = CGPoint(x: size.width / 2.0, y: 220.0)
playerNode!.physicsBody!.linearDamping = 1.0
playerNode!.physicsBody!.allowsRotation = false
playerNode!.physicsBody?.affectedByGravity = false
playerNode!.physicsBody!.categoryBitMask = CollisionCategoryPlayer
playerNode!.physicsBody!.contactTestBitMask =
CollisionCategoryAsteroids
playerNode!.name = "Player"
//addChild(playerNode!)
foregroundNode!.addChild(playerNode!)
最后一个联系方式:
func didBeginContact(contact: SKPhysicsContact) {
var nodeB = contact.bodyB!.node!
if nodeB.name == "Asteroid" {
println("Touched")
nodeB.removeFromParent()
}
}
所以我的问题从 nodeB 开始,出于某种原因有时当小行星撞击玩家时这段代码工作正常但其他时候当小行星撞击玩家时游戏崩溃并且我得到
fatal error: unexpectedly found nil while unwrapping an Optional value
程序进入联系人功能后
关于如何解决这个问题的任何想法或解决方案?多谢! =)
崩溃来自两个强制展开调用之一:bodyB!
和 node!
。通过这样写,你断言你确定他们永远不会 nil
。
找到其中一个为零的情况的方法是将代码分解成可以使用断点检查的行。
var bodyB = contact.bodyB
if bodyB == nil {
// breakpoint here
}
var nodeB = bodyB!.node
if nodeB == nil {
// breakpoint here
}
if nodeB!.name = "Asteroid" // etc.
代码停止后,您可以检查对象并尝试找出它们 nil
的原因并解决问题。
我不确定为什么节点显示为 nil,但您可以通过不强制展开 nil 值来避免崩溃:
if let nodeB = contact.bodyB?.node?
if nodeB.name == "Asteroid" {
println("Touched")
nodeB.removeFromParent()
}
}
如果这些可选值可以成功解包,那段代码只会运行。