Swift SpriteKit 出现场景错误

Posted

技术标签:

【中文标题】Swift SpriteKit 出现场景错误【英文标题】:Swift SpriteKit presentScene error 【发布时间】:2016-06-04 04:40:25 【问题描述】:

我正在尝试制作一个小行星类型的游戏,每次小行星与玩家相撞时,结束场景加载正常,当我尝试重新启动它时剪切,就像代码卡在循环调用结束场景的碰撞函数一样。这里是碰撞函数

func didBeginContact(contact: SKPhysicsContact) 
    print("5")
    //Creating a variable that holds which two items collide
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
    //Creating a switch case statement
    //This will run a different case depending on whitch two objects collide
    switch(contactMask) 
    //If the satellite and the asteroid collide do this
    case bitMask.satellite.rawValue | bitMask.asteroid.rawValue:
        //removing the satellite
        let secondNode = contact.bodyB.node
        secondNode?.physicsBody?.allowsRotation = true
        let firstNode = contact.bodyA.node
        firstNode?.removeFromParent()
        //Stopping the mission timer
        removeActionForKey("missionDurationTime")
        self.removeAllChildren()
        print("6")
        self.view?.presentScene(EndScene())
        print("7")
    default:
        return
    

这是从我的结束场景回到我的游戏场景的函数

func Restart()
    print("hello")
    RestartBtn.removeFromSuperview()
    speach.removeFromSuperview()
    score.removeFromSuperview()
    gameOver.removeFromSuperview()
    self.view?.presentScene(GameScene())


在我点击重启按钮后,EndScene 中的所有标签都按原样消失了,但随后屏幕为空白,控制台仅打印 `5 6 7 在结束场景中的标签回来之前,数不胜数。我很困惑,不知所措。非常感谢任何帮助!

更新:

我把重启按钮里的代码改成了这个

print("hello")
    RestartBtn.removeFromSuperview()
    speach.removeFromSuperview()
    score.removeFromSuperview()
    gameOver.removeFromSuperview()
    let scene =  GameScene(size: self.view!.bounds.size)
    scene.backgroundColor = SKColor(red: 1, green: 1, blue: 1, alpha: 1)
    scene.scaleMode = .AspectFill
    scene.backgroundColor = UIColor.whiteColor()
    let transition = SKTransition.pushWithDirection(SKTransitionDirection.Left, duration:0.5)
    self.scene?.view?.presentScene(scene, transition: transition)

现在游戏场景加载完毕,一切正常,只是一切都大了五倍。这应该是这样的: What it should look like

这就是它的样子 What it does look like

【问题讨论】:

应用启动时如何调用第一个场景(gameView 控制器中的代码)?您能否将该代码放入您的问题中。在您当前的重新启动代码中,您关心使用视图边界作为其大小来初始化 GameScene。执行此操作时,下面的缩放模式第 2 行将不起作用,因为您不再缩放场景。我假设您在加载游戏和重新启动游戏时调整场景的大小不同,因此看起来不同。 我只是在使用 Xcode 为您提供的游戏视图控制器中的代码,如果这有意义的话。我现在无法发布确切的代码我不在我的 Mac 上。 我添加了一个答案。告诉我进展如何。 【参考方案1】:

在您重新启动代码时,您正在初始化具有 view.bounds 大小的 GameScene。

如果您没有更改 GameViewController 代码,则默认情况下您使用 GameScene.sks 文件作为参考(视觉关卡编辑器),默认场景大小为 1024*768,缩放模式为 .AspectFill。

简而言之,在你的重启功能中试试这个

 if let scene =  GameScene(fileNamed: "GameScene")  // fileNamed is the GameScene.sks file
     scene.backgroundColor = SKColor(red: 1, green: 1, blue: 1, alpha: 1) 
      ....


 

或者

 let scene = GameScene(size: CGSize(width: 1024, height: 768)
 scene.backgroundColor ....

【讨论】:

这适用于所有屏幕尺寸吗?现在不能尝试,只是提前考虑 是的,使用 aspectFill 是大多数情况下的最佳解决方案,这取决于您在做什么。通常的想法是,您将游戏中的东西放在中心位置,并且在 iPad 上运行时在侧面/顶部/底部留出一些额外的空间(在您的情况下只是更多的空间背景)。看看这个blog.infinitecortex.com/2014/01/… 它想让我在每个 scene.thing 后面加上逗号,然后它说变量在它自己的初始值中使用 太棒了。祝您编码愉快,如果您这么友善,请您标记为已回答。

以上是关于Swift SpriteKit 出现场景错误的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit 在转换到新场景时收到有关 UIElements 的错误

Swift,SpriteKit:如何保存场景的整个进度

Swift / Spritekit:通过特定场景播放音乐

Swift,SpriteKit:释放游戏场景并重新分配新场景

Swift:删除 Spritekit 中不同场景的广告

Swift:Spritekit 中的多个场景,从第二个和第一个场景的不同 Sprite 节点类型调用 touchesBegan