我正在开发一个简单的平台游戏,一切运作良好,直到我尝试在播放屏幕上使用SpriteKit场景。
我有一个菜单屏幕,最初我会点击开始游戏,它将使用默认的GameScene(大小:大小)启动场景。这很好用,我没有错误,但我想要的新代码不适用于此。
为了使我的代码有效,我尝试将其更改为GameScene(fileNamed:" GamePlay"),从而调用SpriteKit场景;游戏运行良好,直到我点击开始游戏,它崩溃与以下消息:
线程1:致命错误:在解包可选值时意外发现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 Class,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
修改
感谢您的评论,就像您要求我将物理体的大小值更改为固定值一样,并且它有效。
答案 0 :(得分:0)
也许有一点,但你可以在场景设置大小之前调用addGround
函数吗? (换句话说,它有CGSize.zero
)?
我相信这会给SKPhysicsBody初始化器提供一些可以咀嚼的东西......
答案 1 :(得分:0)
如果大小为0,可能无法创建您的SKPhysicsBody(我尝试过它失败了!不要问我为什么因为相应的init没有声明为可用,但是失败了!),然后通过非条件解除引用来访问它错误。更喜欢使用可选链接:ground.physicsBody?.isDynamic = false
。
----编辑----
看起来SKPhysicssBody
是从Objective-C导入的,如果没有在Swift中通过输入报告它就会失败...相同的情况描述here for NSCalendar failure