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

时间:2016-01-18 21:37:48

标签: ios swift sprite-kit universal

我想将 风景应用设为通用,以便精灵节点与运行应用的任何视图大小成比例缩放。我喜欢完全程序化的解决方案,因为我不喜欢IB。

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

我想要的是改变场景的大小以便始终适合视图吗?如果是这样,你能否彻底解释这一点,因为我已经尝试更改我的视图控制器的这一部分

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

是构造函数方法,它将size作为参数,但Xcode并不喜欢这样。

我尝试过的事情

  1. 使用self.view.bounds.width / height的分数。这通常会使所有iPhone看起来都很好,但是在iPad上拉伸和扭曲节点以及视图周围的边界框。
  2. 更改所有四种类型中的scaleMode。我希望保持良好的练习并且感觉像.AspectFill(默认)是我应该让我的应用程序使用的,但可以接受建议。注意;我不希望任何设备上出现黑边,只是整个视图按比例显示/缩放。
  3. 应用程序化约束。现在我对此很新,并且完全不了解约束,但是我甚至没有看过RayWenderlich的教程,谈论节点的约束,所以我没有深入研究这个问题。
  4. 使用这样的方法在视图之间转换点。这对于节点的点定位实际上非常有效,如果可能的话我希望这个方法可以解决,但是我仍然遇到节点大小的问题。此外,当我使用这种方法为iPad构建时,视图似乎从纵向开始,节点看起来很好但是我必须手动将其切换到横向,精灵和视图边界再次搞砸了。这是方法:

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

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

1 个答案:

答案 0 :(得分:12)

我最初尝试使用2个游戏进行缩放,这只是疯狂(场景大小=视图大小或场景缩放模式= .ResizeFill)。您必须调整所有设备的所有值,例如字体大小,精灵大小,脉冲等,它们永远不会保持一致。

所以你基本上有两个选择

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

你通常只是在iPad上的顶部/底部(风景)或左/右(人像)上显示/显示一些额外的背景,这些背景会在iPhone上被裁剪。

iPhone上的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。

要调整标签等特定内容,您可以这样做

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

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

现在将默认设置更改为scene size = frame或使用.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/