我正在开发一个简单的平台游戏,一切运行良好,直到我试图在播放屏幕上使用SpriteKit场景 .
我有一个菜单屏幕,最初我会点击开始游戏,它将使用默认的GameScene(大小:大小)启动场景 . 这很好用,我没有错误,但我想要的新代码不适用于此 .
为了使我的代码工作,我尝试将其更改为GameScene(fileNamed:“GamePlay”),从而调用SpriteKit场景;游戏运行良好,直到我点击开始游戏,它崩溃与以下消息:
线程1:致命错误:在解开Optional值时意外发现nil
在我声明SKNode的物理主体的大小之后出现它的行:ground.physicsBody!.isDynamic = false
我已经搜索过并且我已经完成了nil值的测试,我知道它有零值,但我不知道如何替换它,它只会在我添加SpriteKit场景时发生 . 我还读到它可能与同时检测到三个或更多碰撞有关,但同样,它在没有场景的情况下工作 .
有问题的SpriteKit场景只有一个摄像头和一个精灵,所有其他资源都是按代码添加的 . 我也想知道这是否是问题的一部分?
我添加了用于调用场景的代码以及错误发生的位置,希望有人可以帮助我或指导我如何解决这个问题 .
MainMenu类代码
if nodes(at: location)[0].name == "StartButton" {
let scene = GameScene(fileNamed: "GamePlay")
scene?.scaleMode = SKSceneScaleMode.aspectFill
self.view?.presentScene(scene!, transition: SKTransition.doorsCloseVertical(withDuration: 1))}
GameScene类,addGround方法
ground.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width:self.frame.width, height: self.frame.midY/1.5))
ground.physicsBody!.isDynamic = false
suelo.physicsBody!.restitution = 0.0
ground.physicsBody!.categoryBitMask = PhysicsCategory.EspacioTubos
ground.physicsBody!.collisionBitMask = PhysicsCategory.EspacioTubos
ground.physicsBody!.contactTestBitMask = PhysicsCategory.EspacioTubos
EDIT
感谢您的评论,就像您要求我将物理体的大小值更改为固定值一样 .
2 回答
也许有一点,但你可以在场景设置大小之前调用
addGround
函数吗? (换句话说它有CGSize.zero
)?我相信这会给SKPhysicsBody初始化器提供一些东西来咀嚼......
如果大小为0,可能无法创建您的SKPhysicsBody(我尝试过它失败了!不要问我为什么因为相应的init没有被声明为可用,但是失败了!),然后通过非条件解除引用访问它是错误的 . 首选使用可选链接:
ground.physicsBody?.isDynamic = false
.----编辑----
看起来
SKPhysicssBody
是从Objective-C导入的,它可能会失败,而不会通过键入在Swift中报告它...相同的情况描述here for NSCalendar failure