带有 SpriteKit 的 iOS 通用设备应用程序,如何为所有 View 缩放节点?

标签 ios swift sprite-kit universal

我想制作一个landscape 应用通用,以便 Sprite 节点根据运行该应用的任何 View 大小按比例缩放.我想要一个完全程序化的解决方案,因为我不喜欢 IB。

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

有没有可能我正在寻找的是改变场景的大小以始终适合 View ?如果是这样,您能否彻底解释一下,因为我已经尝试更改 View Controller 的这一部分

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

成为将大小作为参数但 Xcode 不喜欢的构造方法。


我尝试过的事情

  1. 使用 self.view.bounds.width/height 的分数。这通常会使所有 iPhone 看起来都不错,但在 iPad 上会拉伸(stretch)和倾斜 View 周围的节点和边界框。
  2. 更改所有四种类型的 scaleMode。我想保持良好的习惯,感觉 .AspectFill(默认)是我应该让我的应用程序使用的那个,但对建议持开放态度。笔记;我不希望任何设备出现黑边,只希望整个 View 按比例显示/缩放。
  3. 应用编程约束。现在我对此还很陌生,并不完全理解约束,但我什至从 RayWenderlich 那里看到的教程都没有谈到节点上的约束,所以我没有深入研究这一点。
  4. 使用这样的方法在 View 之间转换点。这实际上对于节点的点定位非常有效,如果可能的话,我希望这种方法能够解决,但我仍然遇到节点大小的问题。此外,当我使用这种方法为 iPad 构建 View 时, View 似乎从纵向开始,节点看起来不错,但随后我必须手动将其切换为横向, Sprite 和 View 边界再次变得困惑。方法如下:

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

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

最佳答案

我最初尝试用 2 个游戏自己进行缩放,这太疯狂了(场景大小 = View 大小或场景缩放模式 = .ResizeFill)。您必须为所有设备调整所有值,例如字体大小、 Sprite 大小、脉冲等,它永远不会保持一致。

所以你基本上有两个选择

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

您通常只是在 iPad 的顶部/底部(横向)或左/右(纵向)有/显示一些额外的背景,这些背景在 iPhone 上被裁剪。

在 iPad 上显示更多/在 iPhone 上裁剪的游戏示例:

Altos Adventure、Leos Fortune、Limbo、The Line Zen、现代 war 5。

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

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

Lumino City,机器人 unicorn 攻击

这两个选项之间的选择取决于您,并且取决于您制作的游戏。我通常更喜欢使用选项 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/

关于带有 SpriteKit 的 iOS 通用设备应用程序,如何为所有 View 缩放节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34864533/

相关文章:

sprite-kit - 使用 SpriteKit 在 Swift 3 中进行不一致的接触检测

ios - 将自定义 UIView 添加到 Scenekit 节点

ios - 如何测试 SKNode 子类中的 SK 物理接触?

ios - 使用 google Direction Api 并请求 json 中的数据时获取 nil 数据

ios - sharedApplication' 不可用 : not available on iOS (App Extension) - Use view controller based solutions where appropriate instead

ios - 通过向上滑动和向下滑动使 UIView 出现和消失 - Swift

swift - NSTask 在命令中添加额外的单引号

ios - Parse.com IAP : How to switch between production and sandbox mode?

ios - 尺寸等级最初未知

ios - Swift:基类数组不调用子类函数实现