当前位置: 首页 > 面试题库 >

带有SpriteKit的iOS Universal Device App,如何缩放所有视图的节点?

云鸿达
2023-03-14
问题内容

我想使 Landscape 应用程序具有 通用性 ,以使Sprite节点与运行该应用程序的任何视图大小成比例地缩放。我想要一个
完全编程的 解决方案,因为我不喜欢IB。

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

我所寻找的可能是更改场景的大小以始终适合视图吗?如果是这样,您可以彻底解释一下吗,因为我尝试更改视图控制器的这一部分

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

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

我尝试过的事情

  1. 使用self.view.bounds.width / height的分数。通常,这会使所有iPhone看起来不错,但在iPad上,拉伸和倾斜节点以及thew视图周围的边界框。
  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教程。

提前致谢!感谢您的帮助。我知道这个话题很奇怪,因为很多人对此提出疑问,但是每个人的情况似乎都不同,以至于一个解决方案不能完全适用。


问题答案:

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

所以你基本上有2个选择

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

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

在iPad上显示更多内容/在iPhone上显示更多内容的游戏示例:

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

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

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

鲁米诺城,机器人独角兽攻击

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



 类似资料:
  • 问题内容: 我正在寻找一种简单的方法,可以一次从一个超级视图中删除所有子视图,而不是一个一个地删除它们。 我缺少什么? 更新 我的应用有一个main 。我必须添加其他不同的视图作为子视图,以便提供一种导航。 因此,当单击按钮“打开”特定页面时,我需要删除所有子视图并添加新的子视图。 更新2-可行的解决方案(OS X) 我猜苹果已经解决了。 现在,它比以往更容易了,只需致电: 问题答案: 编辑:(感

  • 我有一个无法解决的问题... 我有一个自定义的imageview,它会根据更大的尺寸改变大小——包含该视图的布局的宽度或高度。它的工作方式总是适合布局。 它的布局是这样的: 我正在努力实现的是,我有尺寸为1000x1000px的原始地图。在这张地图上,我有一些点。我必须在Android上显示这张地图,并在与原始地图相同的点上添加其他视图。 所以举个例子: > 原始地图为1000x1000px 我用

  • 我在RShiny中的中有一个地图,其中绘制了标记,一旦我单击一个标记,它就会在地图上添加圆圈,显示所有与标记相关的点。 我想做的是设置地图的缩放/视图,使所有相关的圆圈都可见。 标记的圈数因标记而异,有些标记有1或2个圈,而有些标记有更多圈。此外,圆圈的位置在美国各地不同,所以它们可以放在一个城市或另一个州。 map=带标记的原始映射Df=lng图中所选标记相关性质的圆的lng 我想设置缩放级别,

  • 我在中有10个标记。我想尽可能地放大,让所有的标记都在视野中?在早期版本中,这可以通过实现,但在v2中,我不知道该如何实现。进一步,我知道需要可见的圆的半径。

  • 我试图使用kafka-node从kafka主题读取压缩消息。 问题是,最近插入的消息留在EOL上方,在插入其他消息之前无法访问。实际上,EOL和高水位偏移之间存在间隙,这会阻止读取最新消息。原因尚不清楚。 已使用创建主题 主题中产生了许多关键值。有些钥匙是一样的。 这是插入的键和值 然后请求主题键集。 有一个高水位偏移量,表示最新的值10。然而,消费者看到的偏移值只有7。不知何故,压缩阻止了消费者

  • 问题内容: 我试图弄清楚如何确定一个节点在屏幕上还是屏幕外可见。这仅仅是节点的true / false属性吗?谢谢。(使用swift spritekit) 问题答案: 您可以使用以下命令测试场景中是否有节点: 假设这是一个子类,例如。