首页 文章

使用Sprite Scene时,物理体展开会导致致命错误

提问于
浏览
0

我正在开发一个简单的平台游戏,一切运行良好,直到我试图在播放屏幕上使用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 回答

  • 0

    也许有一点,但你可以在场景设置大小之前调用 addGround 函数吗? (换句话说它有 CGSize.zero )?

    我相信这会给SKPhysicsBody初始化器提供一些东西来咀嚼......

  • 0

    如果大小为0,可能无法创建您的SKPhysicsBody(我尝试过它失败了!不要问我为什么因为相应的init没有被声明为可用,但是失败了!),然后通过非条件解除引用访问它是错误的 . 首选使用可选链接: ground.physicsBody?.isDynamic = false .

    ----编辑----

    看起来 SKPhysicssBody 是从Objective-C导入的,它可能会失败,而不会通过键入在Swift中报告它...相同的情况描述here for NSCalendar failure

相关问题