【问题标题】:How to make SKScene have fixed width?如何使 SKScene 具有固定宽度?
【发布时间】:2017-08-10 05:55:13
【问题描述】:

我正在制作一个基于 spriteKit 的游戏,想知道是否可以将 SKScene 设置为固定宽度(以便更轻松地布局精灵),并让它在保持纵横比的同时调整到实际屏幕宽度。是否有可能实现这个目标,是否推荐(由于调整大小,精灵会不会被清晰地渲染)?

【问题讨论】:

标签: ios sprite-kit


【解决方案1】:

给场景一个固定大小实际上是我们想要在 SpriteKit 游戏中做的事情。 SpriteKit 将使用 scaleMode 设置(默认为 .aspectFill)为每个设备缩放游戏。将场景设置为设备大小或使用 .resizeFill 进行缩放模式并不是一个好主意,因为这会导致不同设备上的大量不一致。我以前参加过一场比赛,那绝对是一场噩梦。

所以我们基本上有两种方法可以正确地做到这一点

1) 将场景大小设置为 iPad(例如 1024x768 - 横向,768x1024 - 纵向。这是 Xcode 7 中的默认设置。

您通常只在 iPad 的顶部/底部(横向)或左侧/右侧(纵向)显示一些额外的背景。

在 iPad 上显示更多的游戏示例:

Altos Adventure、Leos Fortune、Limbo、The Line Zen、Modern Combat 5。

2) Apple 将 xCode 8 中的默认场景大小更改为 iPhone 6/7(750*1334-Portait、1337*750-Landscape)。此设置将在 iPad 上裁剪您的游戏。

在 iPad 上显示较少的游戏示例:

Lumino City,机器人独角兽攻击

这两个选项之间的选择取决于您,并且取决于您制作的游戏。我通常更喜欢使用选项 1 并在 iPad 上显示更多背景。

无论场景大小,缩放模式通常最好保留默认设置 .aspectFill。这样您就可以在所有设备上获得一致的体验。

我不会尝试在不同设备上手动更改场景或节点大小/比例的随机黑客行为,您应该让 xCode/SpriteKit 为您完成。

在代码中,您将使用您喜欢的大小初始化一个 SKScene,如下所示

let gameScene = GameScene(size: CGSize(width: 1024, height: 768))

如果您使用视觉场景编辑器,您可以直接在右侧的检查器面板中设置场景大小。

希望对你有帮助

【讨论】:

  • 谢谢。我还使用 UIKit 构建游戏的 UI(按钮、菜单)(因为使用 SpriteKit 很难做这些事情)。 UIKit 可以应用相同的技术吗?
  • 你不应该在 SpriteKit 中使用 UIKit,这不是一个好主意。 UIKit 的东西被添加到你的 GameViewController 中。该 GameViewController 将处理您的所有 SKScenes,这意味着您的 UIButtons/UILabels 将显示在所有 SKScenes 中。所以你必须通过为每个场景删除/添加 UI 来管理它,这将是疯狂的。您的所有 UI 都应直接在相关场景中使用 SpriteKit API(例如 SKLabelNodes、SKSpriteNodes、SKNodes 等)创建。谷歌有很多教程,例如如何在 SpriteKit 中创建按钮。我强烈建议您不要继续使用这种方法。
  • 我的意思是,如果你只有 1 个 SKScenes,我猜这很好,但这仍然不是一个好主意。
【解决方案2】:

任何调整大小都会带来性能损失和调整大小的瑕疵,例如边缘模糊或其他。

场景大小由 ViewController 在呈现之前实例化场景时定义。用与实际屏幕大小相同的大小创建场景而不进一步调整大小不是更好吗?

【讨论】:

  • 我想最终的结果会更好,但它让我的布局代码更难(因为它需要照顾不同的屏幕尺寸。)
  • 如果您对精灵位置进行硬编码,就会出现这种情况。一件可怕的事情。您永远不知道 Apple 的生产线还降低了哪些其他分辨率或宽高比。这是一个很好的方法 - 创建一个辅助常量来保持屏幕的视图大小。然后使用此视图大小的分数在屏幕上填充您的精灵。例如,如果您的视图大小为 1024x768(例如 iPad),则不要将精灵放在 CGPoint(x: 102, y: 77) 上,而是将其放在 CGPoint(x: viewSize / 10, y: viewSize / 10) 上。这将使其在所有设备分辨率上保持不变。
  • 将场景大小设置为设备的实际大小是一个非常糟糕的主意,它会导致不同设备上的大量不一致(物理、字体大小、精灵大小等)。您应该设置一个固定的场景大小并让 SpriteKit 为您进行缩放,通常通过 .aspectFill。
  • 不一致是什么意思?如果您的数学考虑到您设备的视图大小,那么我看不出哪个会导致这种不一致。例如,字体大小可以计算为 view.height 的一部分,这将保证字体的大小始终相对于实际视图大小。
  • @Stoyan 不要接管,但这样做会使纹理在 iPad 上明显拉伸,因为与 iPhone 相比存在巨大的纵横比差异。让 .aspectFill 完成这项工作会使所有设备的宽高比相同,您只需为较大的设备(iPad)添加一些额外的背景。这很容易完成,并显示在此答案中:stackoverflow.com/a/34878528/6728196
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 2019-04-19
  • 2014-11-25
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多