如何避免在SceneKit中使用SpriteKit叠加时出现拉伸?

3

在WWDC 2017的SceneKit会话中,他们建议使用overlaySKScene来覆盖SceneKit上的SpriteKit层,用于HUD等。在我旋转iPhone/iPad之前,它似乎运作良好。现在,在旋转设备时,SpriteKit中的所有文本都被拉伸了(如果从纵向变为横向)或缩小了(如果从横向变为纵向)。有没有办法保持文本或图形大小不受方向影响?

    sceneView.overlaySKScene = SKScene(size: sceneView.frame.size)

我以一种非常简单的方式解决了这个问题。只需要调整overlaySKScene的大小并重新定位所有内容即可。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    let width = sceneView.frame.height
    let height = sceneView.frame.width

    sceneView.overlaySKScene?.size = CGSize(width:width, height:height)
    ...
}

希望这可以帮助其他遇到类似问题的人。
1个回答

5

你需要了解SKScene的工作原理:

这意味着为给定的方向设置覆盖层的尺寸与iPhone屏幕大小相同:

sceneView.overlaySKScene = SKScene(size: sceneView.frame.size)

现在我假设其他内容不变,这意味着您的scaleMode设置为.fill,这意味着将图形拉伸至填满所有边缘。

当处于纵向模式时,您不会注意到任何变化,因为它是1比1的比例。

现在您将其翻转到横向模式。

系统将尝试将您的纵向屏幕尺寸转换为横向尺寸。

这意味着您将得到胖矮图形,因为它将拉伸您的两侧并缩小顶部和底部以填满所有边缘。

这就是为什么编写类似代码 sceneView.overlaySKScene = SKScene(size: sceneView.frame.size) 是不好的。您最终会让自己感到困惑。

我总是建议使用SKS文件或设置一个常量场景大小,因此 sceneView.overlaySKScene = SKScene(size: CGSize(750,1334))

然后,根据我想要显示的叠加层方式,使用适当的比例模式。

在我想要叠加层占用精确百分比的游戏中,我使用.aspectFill

在我想要叠加层占用精确像素数量的游戏中,我使用.resizeFill

通过查看scaleMode,我现在知道我的场景应该如何行动。

使用.aspectFill时,我需要检测方向何时翻转,并在此时呈现相应于方向的SKS或移动相应于方向的节点。

对于.resizeFill,我需要创建一个调整大小方法,使其符合方向翻转时的情况,并按比例移动新尺寸中的节点。

您可以在ViewController中检测方向翻转:

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 

然后使用视图到达场景,调用您的resize函数/加载一个新场景。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接