iOS通用设备应用程序使用SpriteKit,如何为所有视图缩放节点?

17

我想制作一个景观应用程序,使其成为通用型,这样精灵节点就可以按比例缩放到运行应用程序的任何视图大小。我想要一个完全以编程方式的解决方案,因为我不喜欢Interface Builder。

我的游戏非常简单,不需要任何形式的滚动或缩放,因此整个游戏将始终存在并占据整个视图。

是否可能我正在寻找的是始终适合视图的场景大小?如果是这样的话,您能否详细解释一下,因为我已经尝试更改了我的视图控制器的这一部分。

    if let scene = GameScene(fileNamed:"GameScene")
作为构造函数方法,它带有一个尺寸参数,但Xcode不喜欢这样做。

我尝试过的事情

  1. 使用self.view.bounds.width/height的分数。这通常会使所有iPhone看起来很好,但在iPad上会拉伸和扭曲节点以及周围视图的边界框。
  2. 在所有四种类型中更改scaleMode。我想保持良好的实践,并感觉.AspectFill(默认)是应该让我的应用程序正常工作的一种。但是,我愿意听取建议。注意; 我不希望任何设备出现黑边缘,只显示/按比例缩放整个视图。
  3. 应用编程约束。现在我对此还比较陌生,不完全理解约束,但是我没有看到任何教程,甚至来自RayWenderlich的教程都没有涉及节点上的约束,因此我没有深入研究这个问题。
  4. 使用像这样的方法在视图之间转换点。这实际上对于节点位置的点定位效果非常好,如果可能,我希望这种方法能够起作用,但是我仍然面临节点大小的问题。而且当我使用此方法构建iPad时,视图似乎以纵向开始,节点看起来很好,但是然后我必须手动切换到横向,sprites和视图边界再次混乱。这是方法:

    func convert(point: CGPoint)->CGPoint {
        return self.view!.convertPoint(CGPoint(x: point.x, y:self.view!.frame.height-point.y), toScene:self)
    }
    
  5. 无数关于RW和互联网其他地方的视频教程。

提前感谢!我很感激您的帮助。我知道这个话题很奇怪,因为很多人都会问问题,但每个人的情况似乎都不同,所以一个解决方案并不适用于所有人。

1个回答

14

我最初试图用两个游戏自己进行缩放,但这太疯狂了(场景大小=视图大小或场景缩放模式=.ResizeFill)。你必须为所有设备调整所有值,例如字体大小、精灵大小、冲量等等,而且永远不会保持一致。

因此,基本上有两个选项

1) 将场景大小设置为1024X768(横向)或768x1024(纵向)。这是Xcode 7的默认设置。

然后您通常只在iPad上/下部(横向)或左/右侧(纵向)显示一些额外的背景,它会被iPhone裁剪掉。

显示更多内容的游戏示例/在iPhone上进行裁剪的游戏:

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,Robot Unicorn Attack

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

无论场景大小如何,缩放模式通常最好保留为默认设置.aspectFill。

您可以通过以下方式调整特定内容(例如标签):

 if UIDevice.current.userInterfaceIdiom == .pad {
   ...
 }

您可以尝试自己缩放场景,创建一个新的SpriteKit示例游戏项目。在所有 iPhone 上运行,您会注意到 HelloWorld 标签在所有设备上看起来完美。

现在将默认设置更改为场景大小 = 帧或使用 .ResizeFill,HelloWorld 标签在所有设备上不再正确缩放。

附带说明,该行

 if let scene = GameScene(fileNamed: "GameScene")

引用了GameScene.sks文件。你说你一切都是通过编程实现的,因此你可能可以删除GameScene.sks文件并更改这行代码为

 let skView = view as! SKView!
 let scene = GameScene(size: CGSize(width: 1024, height: 768)) // 768 x 1024 if portrait

更新:

由于在iPhoneX上适应我的游戏时出现了问题,我现在使用了稍微不同的变体。我将场景大小设置为1334x750,并使用纵横比缩放模式。然后,如果需要(例如在iPad或iPhone X上),我会运行一些代码来删除黑边。它基于这篇很棒的文章(链接已失效)。

http://endlesswavesoftware.com/blog/spritekit-skscene-scalemode/


2
感谢您的帮助!我将其标记为正确,因为它包含了解决我的问题的有效方法。然而,我另外找到了一种解决方法,并将坚持使用这种方法:在我的info.plist中,我注意到iPhone和iPad的屏幕方向都在那里,而iPad的纵向视图仍然存在。我只是从列表中删除了它们。之后,我还需要将scene.size设置为skView.bounds.size,这两个步骤修复了问题(但如果只做其中一个会破坏程序)。现在,我继续相对于视图定位和缩放节点,一切正常运行。 - ljs
2
谢谢标注。是的,我没有意识到你在 plist 文件中寻找横屏相关的内容。有点奇怪的是,即使在 Xcode 中取消选择纵向布局,这两个条目仍然会保留,这在一开始就让我很头疼。祝编码愉快! - crashoverride777

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