我使用 Objective C 在 SpriteKit 中编写了一个游戏,它在 ios9 上完美运行,但在 ios8 上看起来很糟糕。我真的很想知道如何解决这个问题,或者通过“纠正”我的错误,或者如果我没有错误,那么通过寻找 ios8 中的错误的解决方法。
我想我已经尽我所能让问题尽可能清晰,包括制作大量屏幕截图来说明问题,以及制作一个尽可能简单同时仍然显示问题的新 Xcode 项目。
如果你想尝试 Xcode 项目,这里是它的链接……。 xcode 项目
如果您想查看问题的屏幕截图,那么这里是屏幕截图的链接。 截图
现在我将尝试解释我编写的代码和屏幕截图中说明的问题。
请记住:我的代码在 iOS9.3 上完美运行。所以我的代码显然不是完全垃圾。但不可否认,我不是处理屏幕旋转的专家,所以我的代码可能会更好。
我应该提一下,两个场景的缩放模式都设置为 SKSceneScaleModeResizeFill。我之所以选择这种模式,是因为在使用 SKSceneScaleModeAspectFill 时,我很难为所有可能的屏幕尺寸(包括 iPhone)进行正确的布局。我希望我能在坚持使用 SKSceneScaleModeResizeFill 的同时解决这个问题。
无论如何,我的应用程序是一个有两个场景的 SpriteKit 游戏。主要场景是您玩游戏的 GameScene。而且这个场景有一个指向 SettingsScene 的指针,你可以在其中更改场景的设置。(例如更改难度级别)。
每当用户旋转屏幕时,GameViewController 都会在 viewWillTransitionToSize 中检测到这种变化,并告诉 GameScene 对象新的屏幕宽度和屏幕高度。然后游戏场景会根据新的屏幕方向调整其精灵的位置,然后将新的屏幕宽度和高度告知其 SettingsScene 对象,以确保设置场景也已正确布局。
请注意,使用这种设计,无论何时用户旋转屏幕,两个场景上的所有精灵都会重新定位,而不管当时哪个场景实际处于活动状态。
正如我之前所说,在 ios9.3 上一切正常。但是在ios8上,结果很糟糕。屏幕截图说明了 ios8 上的一个典型体验示例。如果用户在使用游戏时旋转屏幕然后转到设置屏幕,他会看到一些可怕的东西。并且经常会陷入这种糟糕的体验,因为返回主游戏的按钮甚至可能不再适合屏幕。
起初,我似乎无法在设置场景中为横向模式重新定位精灵。但这种解释是错误的。屏幕上的文本显示最后一个布局是在考虑横向的情况下执行的。
那么这里出了什么问题呢?
任何建议都将受到高度高度赞赏。
谢谢!
-j
ps 如果您不想直接查看链接的项目文件,这里有一些关于示例代码的详细信息。GameViewController 实现 viewTransitionToSize 来处理任何屏幕旋转。它直接将新的屏幕尺寸告诉 GameScene,然后再告诉 SettingsScene。考虑到新的屏幕尺寸,两个场景都重新排列了它们的精灵。在ios9上一切顺利。然而,在 ios8 上,不活动的场景在呈现时最终看起来很丑陋,尽管它显然确实根据新的尺寸重新定位了它的精灵。