繁体   English   中英

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

[英]iOS Universal Device App with SpriteKit, how to scale nodes for all views?

我想让一个横向应用程序成为通用的,以便精灵节点与运行应用程序的任何视图大小成比例地缩放。 我想要一个完全程序化的解决方案,因为我不喜欢 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 和互联网上其他地方的视频教程。

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

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

所以你基本上有2个选择

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

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

在 iPad 上显示更多/在 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 上显示较少的游戏示例:

鲁米诺城,机器人独角兽来袭

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM