添加以下代码将解决您的问题(代码在 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
计算每个维度的比例因子,取较小者
两个被选中。场景的每个轴都缩放相同
比例因子。这保证了整个场景是可见的,但是
可能需要在视图中添加信箱。
SKSceneScaleMode.Fill
场景的每个轴都是独立缩放的,因此每个轴都在
场景精确映射到视图中该轴的长度。
SKSceneScaleMode.ResizeFill
场景未缩放以匹配视图。取而代之的是场景
自动调整大小,使其尺寸始终与
视图。
结论
看起来您想要删除场景的缩放,这样您在场景中的位置将与视图中的实际位置相匹配。您可以设置场景的大小以匹配视图大小,在这种情况下不会发生缩放。或者,您可以将场景的缩放模式设置为 ResizeFill,这将始终使场景的大小与您的视图大小相匹配,并且不会缩放任何内容。一般来说,我会远离任何缩放,而是调整界面和场景大小以最适合每个设备。您可能还需要添加缩放和/或滚动功能,以允许分辨率较小的设备获得相同的视野。
但是如果我想缩放我的场景呢?
但是,如果您需要缩放场景,但仍希望位置相对于视图(即,即使场景被截断,您也希望 (0,0) 位于屏幕的左下角),请查看我的答案here
其他信息
请参阅答案here 以获取显示我如何动态布局节点的示例代码。
有关扩展以支持多个设备的更多详细信息,请参阅答案 here。