使用Sprite Scene

时间:2018-03-28 08:37:25

标签: ios swift sprite-kit skphysicsbody skscene

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

修改

感谢您的评论,就像您要求我将物理体的大小值更改为固定值一样,并且它有效。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

----编辑----

看起来SKPhysicssBody是从Objective-C导入的,如果没有在Swift中通过输入报告它就会失败...相同的情况描述here for NSCalendar failure