在SpriteKit中处理不同的iOS设备分辨率

我在Xcode 6,iOS 8 beta 5中使用了SpriteKit。在iPhone 4S模拟器中,所有的东西都已经布局并且完美运行,但是当切换到5S时,屏幕底部的元素被切断了。

据我了解,iPhone屏幕的左下angular应该是CGPoint(0,0),但是通过打印到控制台的坐标来检查位置之后,我可以点击左下angular的最低点(5, 44)。 在我的场景设置是否有什么错误造成这种情况?

没有对GameViewController文件进行更改,即使在删除GameScene文件后问题仍然存在。

至less有谁能把我指向正确的方向呢?

添加下面的代码解决您的问题(代码在Swift中):

scene.scaleMode = SKSceneScaleMode.ResizeFill 

现在,如果你想知道为什么这会解决你的问题,你的问题实际上是什么,以及如何处理多个决议 – 我build议你继续阅读。

有三件事会影响你场景中节点的位置。

1)锚点
确保您的场景的定位点设置为(0,0)左下angular。 默认情况下,场景的定位点从(0,0)开始,所以我假设不会造成问题。

2)尺寸
检查你的场景的大小。 我通常使我的场景大小与设备的大小相匹配(即iPad,iPhone 4英寸,iPhone 3.5英寸),然后在场景中放置另一层以存储节点。 这使得我能够对较小分辨率的设备进行滚动效果,但这取决于您的游戏当然。 我的猜测是你的场景大小可能被设置为320,480,这可能会导致你的iPhone 5s的定位问题。

3)缩放模式
缩放模式对场景中节点的位置有很大的影响。 确保您将缩放模式设置为适合您的游戏的内容。 当您的场景尺寸与视图尺寸不匹配时,缩放模式将会启动。 所以缩放模式的目的是让Sprite Kit知道如何处理这种情况。 我的猜测是,你的场景尺寸设置为320,480,并且场景被缩放以匹配iPhone 5视图,这将导致定位问题与您所描述的相同。 以下是您可以为场景设置的各种缩放模式。

 SKSceneScaleMode.AspectFill 

计算每个维度的比例因子,select两者中较大的一个。 场景的每个轴以相同的比例因子缩放。 这保证了视图的整个区域被填满,但是可能导致场景的部分被裁剪。

 SKSceneScaleMode.AspectFit 

计算每个维度的比例因子,select其中较小者。 场景的每个轴以相同的比例因子缩放。 这确保整个场景可见,但可能需要在视图中进行letterboxing。

 SKSceneScaleMode.Fill 

场景的每个轴都被独立缩放,以便场景中的每个轴精确地映射到视图中该轴的长度。

 SKSceneScaleMode.ResizeFill 

场景不缩放以匹配视图。 相反,场景会自动resize ,使其尺寸始终与视图的尺寸相匹配。

结论
它看起来像你想删除你的场景的缩放,这样你的位置在场景中将匹配视图中的实际位置。 您可以设置场景的大小以匹配视图大小,在这种情况下不会进行缩放。 或者你可以将场景的缩放模式设置为ResizeFill,这将使场景的大小始终与视图的大小相匹配,并且不会缩放任何东西。 一般来说,我会远离任何缩放,而是调整界面和场景大小,以最适合每个设备。 您可能还需要添加缩放和/或滚动以允许具有较小分辨率的设备实现相同的视野。


但是如果我想扩展我的场景呢?
但是,如果你需要缩放你的场景,但是你仍然希望相对于视图的位置(即,即使场景被截断,你也希望(0,0)成为屏幕的左下angular),那么请在这里看到我的答案


附加信息
在这里查看答案示例代码显示如何dynamic布局节点。

请参阅此处的答案以获取有关扩展以支持多个设备的更多详细信

如果要保留场景的大小(通常在使用固定大小和坐标系时需要),则可能需要在场景的任一侧添加填充。 这将删除信箱,并保留在任何平台上的应用程序的所有物理和dynamic。

我创build了一个小框架来帮助这个:

https://github.com/Tokuriku/tokuriku-framework-stash

只是:

  1. 下载存储库的ZIP文件
  2. 打开“SceneSizer”子文件夹
  3. 拖动项目中的SceneSizer.framework“乐高块”
  4. 确保embedded式框架不只是链接
  5. 在您的代码import SceneSizer某处导入框架

你完成了,你现在可以调用sizer类: SceneSizer.calculateSceneSize(#initialSize: CGSize, desiredWidth: CGFloat, desiredHeight: CGFloat) -> CGSize

以防万一,尝试做CMD + 1,为我工作。 一些元素被切断了,因为它们不是在模拟器中显示的 – 我强调这一点,这只是一个模拟器function(如果你问我这个问题,浪费时间来解决这个问题)。 CMD + 2,CMD + 3视图有时可以隐藏部分场景。