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

时间:2014-08-08 14:31:33

标签: ios sprite-kit xcode6

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

根据我的理解,iPhone屏幕的左下角应该是CGPoint(0,0)但是在通过将坐标打印到控制台来检查位置后,我可以点击左边角落的最低点(5,44)。在我的场景设置中是否存在导致此问题的错误?

没有对GameViewController文件进行任何更改,甚至在我剥离GameScene文件后问题仍然存在。

至少有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:113)

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

scene.scaleMode = SKSceneScaleMode.ResizeFill

现在,如果你想知道为什么这可以解决你的问题,你的问题实际上是什么,以及如何处理多种分辨率 - 我建议你继续阅读。

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

1)锚点
确保您的场景的锚点设置为左下角的(0,0)。默认情况下,场景的锚点从(0,0)开始,所以我假设没有引起问题。

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

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

SKSceneScaleMode.AspectFill
  

计算每个维度的比例因子,并计算其中的较大值   这两个是被选中的。场景的每个轴都是缩放   比例因子。这保证了视图的整个区域   填充,但可能会导致部分场景被裁剪。


SKSceneScaleMode.AspectFit
  

计算每个维度的缩放因子,并计算其中的较小值   这两个是被选中的。场景的每个轴都是缩放   比例因子。这可以保证整个场景可见,但是   可能需要在视图中使用letterbox。


SKSceneScaleMode.Fill
  

场景的每个轴都独立缩放,以便每个轴都在   场景完全映射到视图中该轴的长度。


SKSceneScaleMode.ResizeFill
  

场景未缩放以匹配视图。相反,场景是   自动调整大小,使其尺寸始终与   观点。


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


但是,如果我想扩展我的场景怎么办?
但是,如果您需要缩放场景,但仍希望位置相对于视图(即,即使场景被截止,您希望(0,0)成为屏幕的左下角),请参阅我的答案{{3} }


其他信息
有关如何动态布局节点的示例代码,请参阅答案here

有关扩展以支持多个设备的详细信息,请参阅答案here

答案 1 :(得分:2)

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

我创建了一个小框架来帮助解决这个问题:

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

只需:

  1. 下载存储库的ZIP文件
  2. 打开“SceneSizer”子文件夹
  3. 在项目中拖动SceneSizer.framework“lego block”
  4. 确保嵌入式框架而不仅仅是链接
  5. 在代码import SceneSizer
  6. 中的某处导入框架

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

答案 2 :(得分:0)

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