gpt4 book ai didi

swift - 如何防止 SceneKit 中的 SpriteKit 覆盖拉伸(stretch)?

转载 作者:搜寻专家 更新时间:2023-10-31 22:11:05 27 4
gpt4 key购买 nike

在 WWDC 2017 SceneKit session 中,他们推荐使用 overlaySKScene 将 SpriteKit 层覆盖在 SceneKit 上,用于 HUD 等。在我旋转 iPhone/iPad 之前,它似乎工作正常。现在 SpriteKit 中的文本都被拉伸(stretch)(如果从纵向变为横向)或收缩(如果从横向变为纵向)。无论如何,无论方向如何,都可以使文本或图形保持相同的大小吗?

    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)
...
}

希望这能帮助其他面临类似问题的人。

最佳答案

你需要看看 SKScene 是如何工作的:

这意味着将叠加层设置为给定方向的 iPhone 屏幕大小: sceneView.overlaySKScene = SKScene(size: sceneView.frame.size)

现在我假设没有其他变化,这意味着您的 scaleMode 设置为 .fill,这意味着拉伸(stretch)图形直到所有边都被填充。

当坐在纵向模式下时,您不会注意到任何东西,因为它是 1:1 比例。

现在将其翻转为横向。

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

这意味着您将获得粗短的图形,因为它会拉伸(stretch)您的两侧,并收缩您的顶部和底部以填充所有边缘。

这就是为什么像 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) 

然后使用 View 到达场景调用调整大小函数/加载新场景。

关于swift - 如何防止 SceneKit 中的 SpriteKit 覆盖拉伸(stretch)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45191068/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com