如何防止SceneKit中的SpriteKit叠加拉伸?

时间:2017-07-19 12:46:19

标签: swift sprite-kit scenekit

在WWDC 2017 SceneKit会话中,他们建议使用overlaySKScene在SceneKit上为HUD等覆盖SpriteKit图层。在旋转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 个答案:

答案 0 :(得分:4)

您需要了解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,我需要创建一个resize方法,该方法在方向被翻转时遵循,并按照新大小的比例移动节点。

您可以使用

检测方向何时翻转ViewController
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 

然后使用视图进入场景调用调整大小函数/加载新场景。