SpriteKit 加载新场景但精灵立即下降

Posted

技术标签:

【中文标题】SpriteKit 加载新场景但精灵立即下降【英文标题】:SpriteKit loading new scene but sprite immediately drops 【发布时间】:2016-07-11 17:28:07 【问题描述】:

我正在关注这个 (https://www.raywenderlich.com/100560/video-tutorial-how-to-make-a-game-like-flappy-bird-in-swift-part-6-collision-detection) 视频教程系列来了解 SpriteKit,但是使用 Xcode 7.2 似乎存在一个错误,在精灵掉落后,用户点击屏幕并调用 switchToNewGame,但是精灵立即掉到地上,我不知道为什么。下面是 switchToNewGame 和这个 gist 中的完整代码:https://gist.github.com/gesabo/2e585f22c2860af13e099590a2e00e47

 func switchToNewGame() 
        runAction(popAction)
        let newScene = GameScene(size: size)
        let transition = SKTransition.fadeWithColor(SKColor.blackColor(), duration: 1.0)
        view?.presentScene(newScene, transition: transition)
    

我认为这可能与 RW 使用的 didMoveToView 中的 physicsWorld.gravity = CGVector(dx: 0, dy: 0) 这一行有关,因为他说他想控制重力而不是 SpriteKit,但删除它似乎并没有影响这个问题。

【问题讨论】:

【参考方案1】:

他为什么不摔倒?你的默认 GameState 是 .Play,所以一旦你的场景加载,你的小鸟就会开始摔倒。现在,当您过渡时,您的场景正在运行,因此您的鸟可能会因此而下降。

我会推荐

1) 将 gameState 更改为 play 以外的内容,然后在您准备好时将其更改为 play

2)在过渡期间暂停场景,查看SKTransition文档以达到您想要的效果

3) 使用 dispatch_async(dispatch_get_main_queue()) 加载你的新场景,这样加载时间不会影响场景时间。 (基本上,您从场景中获得的第一次更新时间可能会很长,会扭曲过渡)

注意:从 9.3 开始,paused 变量存在错误,由于某种原因它也会改变所有子项的暂停状态,因此在转换时,您可能会得到一些不希望的效果

【讨论】:

感谢您的回答,但是 (1) 尝试不同的游戏状态似乎没有帮助,但是我不确定哪种生命周期方法适合设置为 .Play?我在 didMoveToView 中尝试过,但结果相同(2)暂停传入场景默认设置为 true,因此无法在那里找到任何帮助(3)很好的想法,但在主队列中加载新场景 = 相同的结果。 sprite kit 和 pause 有一个 bug,所以你可能认为场景暂停了,但可能不是 我建议将游戏状态设置为在 didmovetoview 上播放,我很确定转换完成后会调用它 谢谢,这就是我尝试过的,但结果相同,我还将 pauseIncomingScene 设置为 true 但相同。 在你做的移动到视图功能中,最后暂停场景,看看你得到了什么结果。

以上是关于SpriteKit 加载新场景但精灵立即下降的主要内容,如果未能解决你的问题,请参考以下文章

我如何在视图中保持下降的精灵节点?

Spritekit -- 保持场景以高于特定高度的精灵为中心

如何在 SpriteKit 中从 Web API 加载精灵表

SpriteKit 在哪里为数千个精灵加载纹理图集

Gamecenter init/authentication 使 SpriteKit 的精灵运动滞后

将游戏中心添加到游戏后第一次接触时 Spritekit 游戏场景停止