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

Saw*_*r05 50 ios sprite-kit xcode6

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

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

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

任何人都可以至少指出我正确的方向吗?

Epi*_*yte 115

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

scene.scaleMode = SKSceneScaleMode.ResizeFill
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

计算每个维度的缩放因子,并选择两者中较大的一个.场景的每个轴都相同的缩放因子缩放.这可以保证视图的整个区域都被填充,但可能会导致部分场景被裁剪.


SKSceneScaleMode.AspectFit
Run Code Online (Sandbox Code Playgroud)

计算每个维度的缩放因子,并选择两者中较小的一个.场景的每个轴都相同的缩放因子缩放.这可以保证整个场景可见,但可能需要在视图中使用letterboxing.


SKSceneScaleMode.Fill
Run Code Online (Sandbox Code Playgroud)

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


SKSceneScaleMode.ResizeFill
Run Code Online (Sandbox Code Playgroud)

场景未缩放以匹配视图.而是自动调整场景的大小,使其尺寸始终与视图的尺寸相匹配.


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


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


其他信息
请参阅此处的答案,以获取示例代码,其中显示了如

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

  • @nmokkary这真的取决于你想要如何布局你的游戏.我会举一个例子说明我的所作所为.我有一个适用于iOS和OS X的rts游戏.对于iOS,我根本不缩放场景.我总是让场景与视图大小相同.现在在我的游戏中,我有一个滚动的大世界.那么这意味着具有更大屏幕的iOS用户会看到更多内容,因为没有缩放.屏幕越大,他们看得越多.但是,在OS X上,我将所有内容扩展到iPad大小.这是因为如果我没有扩展,大型桌面屏幕将会看到我的世界太多. (2认同)
  • @nmokkary很难规划你的游戏在各种尺寸下的外观.我建议您在编辑器中绘制所有屏幕尺寸,并计划您的游戏在每个屏幕上的外观.然后在代码中查看您需要做什么来解决问题.例如,某些屏幕尺寸可能具有相同的宽高比,因此您只需缩放资产即可.其他尺寸将具有不同的比例,因此您需要以某种方式调整布局或使用滚动.希望这可以帮助.请参阅我的答案http://stackoverflow.com/a/30820076/2158465 (2认同)
  • @nmokkary在这样的游戏中你可能没有任何滚动或缩放,所以你的界面必须完全适合屏幕.问题是每个设备都有不同的大小和宽高比.在我看来,我会布置你的按钮,使他们填满屏幕.因此,某些设备(如iPad)上的按钮应该更大,而其他设备上的按钮应该更小.您根本不需要缩放场景.而是设置精灵的大小,使它们对齐并适合屏幕.您需要提出一些数学布局规则来实现这一目标.该规则将直接取决于屏幕大小. (2认同)