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

2023-12-07

我想做一个景观 app to be 普遍的,以便精灵节点根据运行应用程序的任何视图大小按比例缩放。我想要一个完全程序化解决方案,因为我不喜欢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 上裁剪的游戏示例:

《阿尔托的冒险》、《利奥的财富》、《地狱边境》、《一线禅》、《现代战争 5》。

2)Apple 将 xCode 8 中的默认场景尺寸更改为 iPhone 6/7 (7501334-肖像,1337750-风景)。此设置将在 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

Update:

我现在使用稍微不同的变体,因为我在将游戏适应 iPhoneX 时遇到问题。我将场景大小设置为 1334x750 并使用宽高比适合作为缩放模式。如果需要的话,我会运行一些代码来删除黑条,例如在 iPad 或 iPhone X 上。它基于这篇很棒的文章(链接不再有效)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 另一个 - “无法识别的选择器发送到实例”问题

    我查看了有关该主题的每个已发布问题 但没有一个给我解决方案 我的项目在很大程度上复制了开发库中的 AVPlayer 演示应用程序 减去清理功能 我有一个复制和粘贴AVPlayerDemoPlaybackView类 重命名为YOPlaybac
  • UITabBar 显示更多图标而不是“更多”选项

    我目前正在尝试使用UITabBar对于包含 7 个的 iOS 应用程序tabBar Items 当我使用故事板时 我能够实现所有 7 个目标tabBarItems 当我以编程方式添加tabBarItems 它强制 更多 按钮访问其他 tab
  • 可以使用UIAppearance设置UINavigationItem的titleview吗?

    我目前使用此代码来设置导航项的 titleView void viewDidLoad UIImage navbarTitle UIImage imageNamed navbartitleview1 UIImageView imageView
  • SwiftUI withAnimation 完成回调

    我有一个基于某种状态的 swiftUI 动画 withAnimation linear duration 0 1 self someState newState 上述动画完成时是否会触发任何回调 如果有关于如何在 SwiftUI 中使用完成
  • SpriteKit:如何使用混合模式在图层中打孔

    我有一个简单的场景 添加了一些元素 现在我想专注于一个带有遮罩的特定元素 在与我想要关注的元素相同的位置切割整个元素 与我们在某些游戏第一次启动时看到的显示某种教程非常相似 基本上我添加了一个全屏层alpha 0 7 因此用户仍然可以看到所
  • 使用 AVFoundation 快速获取视频帧

    这是我的代码 我想要获取我的视频并将帧数据获取到 SceneKit SCNSphere NSString videoPath NSBundle mainBundle l var videoURL NSBundle mainBundle UR
  • Cordova 插件不适用于 Ionic

    我正在 Angular 中构建一个 Ionic 应用程序 但一直无法让插件工作 例如 我尝试使用状态栏插件 如下所述 http ionicframework com tutorials fullscreen apps http ionicf
  • 相机图像旋转问题

    我在这里面临一个非常奇怪的问题 当我在纵向模式下单击图像并上传它 然后再次获取它时 它会逆时针旋转 90 度显示 但是当我在相机胶卷中看到它时 它会以正确的方向显示 因为它被拍摄 我已经尝试了几乎所有可能的链接 代码来解决这个问题 但似乎没
  • 生成具有给定分布的随机数

    看看这个问题 快速选择随机数的概率 https stackoverflow com questions 26092977 swift probability of random number being selected 最上面的答案建议使
  • 将属性类型作为参数传递

    有没有办法将属性作为参数传递给函数 class Car let doors Int 4 let price Int 1000 有没有办法将 Car 属性作为类型传递给函数 我想实现以下目标 func f1 car Car property
  • Self 类型的存储变量(特别是子类化时)

    class LinkedNode
  • 你可以将 UIGestureRecognizer 附加到多个视图吗?

    UITapGestureRecognizer tapGesture UITapGestureRecognizer alloc initWithTarget self action selector tapTapTap self view1
  • webapp 在 iOS 7 中无法正确缩放

    有人遇到同样的问题吗 content width device width 当我的 iphone 仍然是 i0S 6 并且我刚刚更新到 iOS 7 并且似乎不再工作时它就可以工作 或者可能是其他原因导致了问题 有人有什么想法吗 现在我正在使
  • 从应用程序访问 iCloud Drive 文件

    我希望我的应用程序支持 iCloud 以便我可以存储和获取 PDF 文件 我的问题是 如何在不使用 iCloud 的情况下访问 iCloud 驱动器文件UIDocumentPickerViewController 实际上我想在我的应用程序中
  • iOS:不明确的属性合成行为。继承相关

    我在用着AppCode它标记了一个非常大的项目代码中的一个有趣的情况 预ARC 子类定义并合成一个称为委托的属性 实际上属性声明已经被注释掉了 但是 synthesize delegate delegate 声明被留下了 该代码可以编译 大
  • 如何在 App Store Connect 上 AB 测试您的 iOS 应用程序图标?

    根据文档 您现在应该能够在 iOS 上对应用程序图标进行 AB 测试 但是 我不知道该怎么做 在这里 它说您需要包含一个支持上传备用图标的资产目录 https help apple com app store connect devb53f
  • 防止 iOS 上的反射(objc/运行时)

    我正在开发一个处理敏感数据的静态库 使用该库的开发人员必须不能在该库上使用反射 在Android上 我们通过开发一个来解决这个问题aar文件与service并运行service进入单独的进程 当服务运行到另一个进程中时 开发人员不能使用反射
  • 使用 swift 在 WKWebView 上显示活动指示器

    我正在处理以下代码 并尝试在页面加载时在视图中显示活动指示器 我尝试实施WKNavigationDelegate方法 但我失败了 因为没有任何显示 对于如何解决这个问题 有任何的建议吗 我没有设置 SupportWebView 视图dele
  • 在两个应用程序之间通过 url 方案快速传递数据?

    有两个测试应用程序称为发送者和接收者 他们通过 UrlScheme 相互通信 我想从发送者发送一个字符串到接收者 这可能吗 关于字符串的详细信息 我都在发送者和接收者中创建文本字段 我会在发送者文本字段上发送一些字符串 当我单击按钮时 字符
  • Objective-C ARC 只读属性和私有 setter 实现

    在 ARC 之前 如果我希望某个属性对于使用它是只读的 但在类中可写 我可以这样做 Public declaration interface SomeClass NSObject property nonatomic retain read

随机推荐

  • 识别常见模式[重复]

    这个问题在这里已经有答案了 是否有 简单 可能识别两个字符串共享的公共模式 这是一个小例子来阐明我的意思 我有两个包含字符串的变量 两者都包含相同的模式 ABC 以及一些 噪音 a lt xxxxxxxxxxxABCxxxxxxxxxxxx
  • 逻辑 AND、OR:是否保证从左到右求值? [复制]

    这个问题在这里已经有答案了 是从左到右计算逻辑运算符 有保证吗 假设我有这个 SDL Event event if SDL PollEvent event if event type SDL QUIT do stuff 这保证和这个一样吗
  • 在map()中,什么时候需要使用波形符和句点。 (〜和。)

    我正在查看以下示例map 来自 R 数据科学 一个例子是 library dplyr library purrr df lt tibble a rnorm 10 b rnorm 10 c rnorm 10 d rnorm 10 df gt
  • JavaScript - 如何检测选择元素(下拉列表)上的编程值更改

    在 JavaScript 中 我需要检测某个 select 元素的值何时发生变化any原因 包括以编程方式 仅当用户手动更改所选值时才会触发 onchange 事件 not当其他 JavaScript 以编程方式更改该值时 这是一个包含各种
  • CSS 背景图像未加载

    我最近在 Chrome 中遇到了一个非常奇怪的错误 那就是当您第一次加载页面时 或者在隐身模式下 没有任何背景图像显示 当您 F5 页面时 背景图像全部加载 当您检查 css 时 它会在 css 面板中显示图像 url 但是当您将鼠标悬停在
  • Firebase google auth 未完全注销

    使用Google提供的非常清晰的简单示例 Firebase Google Auth 我一直无法从google注销 每次我使用按钮调用此方法时 它都允许我登录并将我导航到本地主机 function logGoogle firebase aut
  • 正则表达式匹配 MySQL 注释

    我需要找到并删除 MySQL 查询中的所有注释 我遇到的问题是避免引号或反引号内的注释标记 在 PHP 中 我使用以下代码取消注释 SQL sqlComments 2 R s lt s ms Commented version sqlCom
  • HTML“按钮”是否应该与其他所有内容具有相同的盒子模型?

    参考两者button元素和input元素与一个type of button 我遇到了一个我认为是错误的行为 在 Firefox 和 Chrome 的最新版本中 但考虑到表单元素通常是我认为的 w3 规则的例外 我想在假设我是对的之前我会要求
  • Jquery Spinner 箭头未加载(可见性)

    微调器上的向上和向下箭头没有显示 我不确定为什么 除了这些箭头之外 所有其他 UI 图像似乎都在加载 这是一个网站 网站链接 这些图像不显示的原因是因为在您指定的路径中找不到它们 您可能忘记上传它们 或者您将它们上传到了错误的目录
  • Boost.Spirit 解析可选前缀

    我正在尝试解析一串以空格分隔 可选标记的关键字 例如 descr expense type receivable customer 27 3 其中冒号之前的表达式是标签 并且它是可选的 即假定默认标签 我无法让解析器完成我想要的事情 我对一
  • 为什么对通用函数中特征的引用必须实现“Sized”?

    我有一个函数返回对特征的引用 trait ref 和另一个引用通用特征实现的函数 take trait ref generic 但是 无法将从第一个函数获得的引用传递给第二个函数 Rustc 抱怨说 这个特质std marker Sized
  • 奇怪的 SQL 浪费我的资源

    我在 11 2 0 3 数据库上遇到问题 一个奇怪的查询占整个数据库活动的 47 42 该应用程序是使用 Flex 开发的 前端是 Apache Tomcat 6 0 35 Java 版本为 1 6 0 27 我在几个网站上搜索过 发现其他
  • Powershell 网页抓取 SSL/TLS 问题

    我想在服务器上运行网页抓取脚本 当前脚本收集指定页面上的 html url http websms net httpWebRequest request net webRequest create url net httpWebRespon
  • UITableview ,动态部分和行

    想要动态创建一个 uitableview 其中一个部分有 2 行 我编写了这段代码 但我遇到了所有部分中仅重复前 2 行的问题 现在我有这行 0 1 gt 第 0 节 第 0 1 行 gt 第 1 节 第 0 1 行 gt 第 2 节 想要
  • Magento 购物车/magento 外部的会话数据

    这可能会有点令人困惑 因为我已经尝试了一切来使这项工作成功 我想要的只是我的品牌网站 domain com 中的一个链接 该链接显示我的 magento 1 5 1 购物车 domain com shop 中的数量我很容易提取产品数据和导航
  • Velocity 模板 - 正则表达式

    我刚刚开始在新工作中使用速度 但我真的不喜欢我已经发现的东西 在这一点上 我实际上更喜欢 freemarker X 不管怎样 我正在尝试做一个正则表达式 我看到了这点 搜索 正则表达式 但这并不完全是我正在做的实现 我没有任何对java的访
  • 我想在 ping 主机后获取 ping 执行时间和结果字符串

    我想在 ping 主机后获取 ping 执行时间和结果字符串 我该怎么做 long currentTime System currentTimeMillis boolean isPinged InetAddress getByName se
  • Defer 块未执行

    我在操场上执行以下快速代码 func A print Hello guard 1 2 else return defer print World A 我期待看到 Hello World 相反 只有Hello被打印 为什么是这样 我缺少什么
  • Matlab中两点之间的距离

    我有 2 个向量 一个的尺寸为 200 2 另一个的尺寸为 3 2 它们都是笛卡尔坐标系中的点 我想计算前 200 个点和其他 3 个点之间的距离并将它们存储在向量中 我正在使用这样的函数 for i 1 cur for j 1 200 L
  • 带有 SpriteKit 的 iOS 通用设备应用程序,如何缩放所有视图的节点?

    我想做一个景观 app to be 普遍的 以便精灵节点根据运行应用程序的任何视图大小按比例缩放 我想要一个完全程序化解决方案 因为我不喜欢IB 我的游戏非常简单 我不需要任何类型的滚动或缩放 因此整个游戏将始终存在并占据整个视图 我正在寻