限制Spritekit游戏中GUI元素的比例

2023-11-27

GUI elements example image

由于帖子太大,我提前道歉,但是每个尝试过制作某种通用应用程序的人都知道这是一个相当有问题的东西,所以请对我宽容一些......

The goal

我想要实现的目标(如上图所示)是在 iPhone 5 和 6 上使用 @2x 资源,并保持应用程序的相同外观。如果可能的话,无需根据检测到的设备手动计算节点的比例和位置属性即可完成所有这一切...简而言之,如何实现该应用程序自动约束元素(和场景)的比例和元素之间的比例?另外,我希望使用 @3x 资源在 iPhone 6+ 上拥有与应用程序相同的外观,但为了简单起见,我只专注于 iPhone 5 和 6。

我在网上发现有些人说这个(下采样)是由 iOS 自动完成的,例如他们建议这样做:

“以 iPhone 6 的大小制作 @2x 资源,然后 iOS 就可以了 针对 iPhone 5" 自动缩小尺寸。

但当涉及到 Spritekit 场景时,这显然不是真的,或者我错过了一些东西。

问题

尽管 iPhone 6 和 iPhone 5 具有相同的宽高比和相同的 PPI,但与场景大小相比,使用相同的资源看起来并不相同(与场景大小相比,查看第一张和第二张图像上的菜单精灵),因为 PPI 与像素密度,iPhone 6 有更多的空间(更大的对角线,更多的英寸),这意味着它比 iPhone 5 有更多的像素。这就是我的问题所在,我不知道什么是有效的处理方法。

到目前为止我做了什么

第二张图片对于 GUI 来说不是问题,但对于游戏玩法来说是问题,就我而言是这样,因为我希望在不同的设备上具有相同的外观和感觉。只需看第一张和第三张图片即可。

谢谢斯凯勒·劳伦的建议我已经设法在 7.1 或 8.1 系统以及 iPhone 6 上的所有 iPhone 5 设备上拥有相同的应用程序外观。所以现在的问题是如何使用 @3x 调整此代码以与 iPhone 6+ 一起使用纹理,以及 iPhone 4s 上的情况。以下是 iPhone 5 和 6 的解决方案:

查看控制器.m

GameScene *scene = [GameScene sceneWithSize:CGSizeMake(375,677)];//fixed instead of view.bounds.size
 scene.scaleMode = SKSceneScaleModeAspectFill;

因此,在 iPhone 6 尺寸下,场景始终具有固定大小,并且视图大小会根据设备而变化。我使用资产目录作为启动图像而不是 xib 文件。图像尺寸为建议尺寸 - 4s 为 640x960px,5 为 640x1136px,6 为 750x1334px,6+ 模型为 1242x2208。资源的大小适用于 iPhone 6,因此对于该型号,根本没有缩放。

与4s模型相关,当我使用上述方法时,每侧都有两个黑条......

到目前为止,我仅在模拟器和 iPhone 6 设备上对此进行了测试(我在设备或模拟器上看到的内容看起来像第一张图片)。

Question

现在,正如我所说,一切都可以在 iPhone 4s(由于宽高比不同而有两个黑条)、5、6 上使用 @2x 资源,但是如何让一切都可以在使用 @3x 资源的 iPhone 6+ 上工作? 如果我对场景使用 375x667 尺寸,则所有内容都位置正确且比例良好,但质量会受到影响(因为放大 @2x)


统一的 GUI 和游戏玩法

据我所知,处理统一 GUI 和游戏的最佳方法是设置场景大小(无论设备如何)并让 SpriteKit 从那里扩展。

GameScene *scene = [GameScene sceneWithSize:CGSizeMake(375,677)];//fixed instead of view.bounds.size
scene.scaleMode = SKSceneScaleModeAspectFill;

这是 iPhone 6 的点。因为 SpriteKit 以点为单位工作,但设备以像素为单位显示,因此 @2x 设备的场景大小将为 750px x 1354px 像素,对于 iPhone 6+ 为 1125px x 2031px(以像素为单位的设备实际为 1080 x 1920)。

这如何与资产一起使用?

它对于 .atlas 文件夹中的 1x 和 2x 资源效果相当好。同样,因为所有内容都转换为点,所以您可以拥有 button.png 和[电子邮件受保护]在纹理图集中,所有 iPhone 的定位和外观都相同。

@3x 怎么样?

对于苹果来说,这是一个更好的问题。显然 SpriteKit 不支持纹理图中的 @3x 图像。 SO 上已经有一些问题试图解决这个问题。

一个例子...

Spritekit - 不从 SKTextureAtlas 加载 @3x 图像

Xcode 6.2 中似乎也没有修复这个问题。如果您正在阅读本文并想要 @3x,那么可能值得向 Apple 提交雷达。需要注意的一件事是,我没有在文档中看到任何地方声称纹理图集应该支持@3x(甚至@2x)当它们受到支持时,您不必对代码进行任何更改。只需将 @3x 资源放入您的 .atlas 文件夹即可。

我可以/应该对 @3x 资产做什么?

我的建议是不要担心它并运行 @2x 资产。 SpriteKit 在缩放图像方面做得不错,而且有很多应用程序不支持 @3x。作为一名 iPhone 6+ 用户,我现在已经学会忍受这一点了。我希望 Apple 很快支持 .atlas 文件夹中的 @3x 图像。

Warnings

您要求所有设备缩小尺寸,但 iPhone 6 除外(并放大 iPhone 6+)。在大多数情况下,您不应该注意到您的艺术(或我的测试的性能)有很大差异,但正如您所知,如果缩小图像后它们看起来可能略有不同。另外4s也有黑屏的问题,暂时没有解决办法。

结束点

如果您设置场景大小并将场景设置为,您将在所有设备上的应用程序中获得完全相同的外观和感觉SKSceneScaleModeAspectFill但是您要求旧设备缩小规模。据我所知,它节省了大量的时间和计划,但也有一些小缺点。

希望这对您有所帮助,并祝您的应用程序好运。

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

限制Spritekit游戏中GUI元素的比例 的相关文章

  • 在 iPad 上使用 OpenCV 避免碰撞

    我正在开展一个项目 需要使用 OpenCV 实现碰撞避免 这是在 iOS 上完成的 iOS 5 及以上版本即可 项目目标 这个想法是将 iPad 安装在汽车仪表板上并启动应用程序 应用程序应该从相机中抓取帧并进行处理 以检测汽车是否会与任何
  • Firebase 的 Xcode 编译错误

    我刚刚将 Firebase 框架安装到 Xcode 由于存在其他无法解决的问题 没有使用 CocoaPods 我按照 Firebase 替代设置说明进行操作here https www firebase com docs ios alter
  • 使用 addObserverForName:usingBlock 时删除观察者

    我有以下代码 在视图加载中添加观察者 void viewDidLoad super viewDidLoad NSNotificationCenter defaultCenter addObserverForName com app live
  • 如何使用 GPUImageHarrisCornerDetectionFilter 获取角点

    我正在尝试使用以下方法从静态图像中获取角点GPUImageHarrisCornerDetectionFilter 我查看了项目中的示例代码 查看了文档 还查看了这篇文章 内容大致相同 GPUImage 现有 UIImage 上的 Harri
  • 无法加载资源,因为应用程序传输安全策略要求使用安全连接

    当我将 Xcode 更新到 7 0 或 iOS 9 0 时 我遇到了这个问题 不知怎的 它开始给我标题错误 无法加载资源 因为应用程序传输安全性 策略要求使用安全连接 网络服务方法 void ServiceCall NSString Ser
  • 如何处理 UICollectionView CompositionalLayout 中的空项目部分

    我正在尝试使用具有多个部分的组合布局制作集合视图 但如果部分中有空项目我该如何处理 如果项目为空 我不想显示该部分 UICollectionViewCompositionalLayout section env gt NSCollectio
  • 可以使用UIAppearance设置UINavigationItem的titleview吗?

    我目前使用此代码来设置导航项的 titleView void viewDidLoad UIImage navbarTitle UIImage imageNamed navbartitleview1 UIImageView imageView
  • SpriteKit:如何使用混合模式在图层中打孔

    我有一个简单的场景 添加了一些元素 现在我想专注于一个带有遮罩的特定元素 在与我想要关注的元素相同的位置切割整个元素 与我们在某些游戏第一次启动时看到的显示某种教程非常相似 基本上我添加了一个全屏层alpha 0 7 因此用户仍然可以看到所
  • 永远不应该触发嵌套优化。这可能是由于 NSISVariable 委托回调内部发生自动布局工作

    应用程序崩溃了 日志给了我这条消息 永远不应该触发嵌套优化 这可能是由于自动布局工作发生在 NSISVariable 委托回调内 这是不允许的 如何解决这个问题 认为我正在后台线程中更新 UI 尝试放置 if NSThread isMain
  • Cordova 插件不适用于 Ionic

    我正在 Angular 中构建一个 Ionic 应用程序 但一直无法让插件工作 例如 我尝试使用状态栏插件 如下所述 http ionicframework com tutorials fullscreen apps http ionicf
  • 获取经典蓝牙连接设备列表(无BLE)[EAAccessoryManager]

    我需要制作一个应用程序 能够判断我当前是否连接到经典蓝牙设备 实际上 它将是蓝牙汽车设备 我的第一步是了解当前连接的经典蓝牙设备是什么 我无法使用 CoreBluetooth 因为它仅适用于 LE 我尝试使用外部附件框架 这是代码 一个按钮
  • 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar中?

    我怎样才能添加2个按钮到UINavigationBar没有XIB 2 个按钮应在右侧对齐UINavigationBar 我知道如何添加一个按钮 但是添加两个怎么样 使用 iOS 5 就这么简单 UIBarButtonItem btnShar
  • 反应本机无法解析模块“warnOnce”

    我的英语有点生疏 对此我很抱歉 当我在 iOS 模拟器上启动 React Native 项目时 出现错误 为了排除与我的代码的任何冲突 我开始了一个新项目 react native init demo react native start
  • 如何测试包含应用程序是否授予“允许完全访问”权限?

    我正在开发一个键盘扩展项目 在应用程序代码的某些点 我需要测试用户是否已授予键盘扩展的 允许完全访问 权限 协议是我需要从应用程序端进行这些测试 并在此基础上让用户访问键盘设置或在未授予权限的情况下提醒他 问题是这里提供的方法如下 func
  • Xcode 6 自适应故事板每个设备有不同的 Segues

    我对 Xcode 6 中新引入的自适应故事板遇到了一些麻烦 iPhone 应用程序已经完成 现在我想用它创建一个通用应用程序 假设我有一个viewcontroller显示一些单元格和详细信息viewcontroller其中显示单元格的详细信
  • 更改流程布局的 itemSize 后单元格大小未更新

    在我的应用程序中 我有一个全屏分页集合视图 每个单元格也需要全屏 因此集合视图布局的项目大小需要与视图控制器的视图边界大小相同 为此 在viewDidLayoutSubviews我只是设置了项目大小 它就按预期工作了 当我呈现这个屏幕时 v
  • 使用 swift 在 WKWebView 上显示活动指示器

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

    有两个测试应用程序称为发送者和接收者 他们通过 UrlScheme 相互通信 我想从发送者发送一个字符串到接收者 这可能吗 关于字符串的详细信息 我都在发送者和接收者中创建文本字段 我会在发送者文本字段上发送一些字符串 当我单击按钮时 字符
  • iPhone 中的视频过滤速度很慢

    我正在尝试在 iPhone 中过滤视频 这是我的程序结构和源代码 AppDelegate h AppDelegate m ViewController h ViewController m AppDelegate 文件与默认文件相同 这是我
  • 如何在 SwiftUI 中导航到另一个视图时消除动画故障

    当导航到 SwiftUI 中包含列表的视图时 模拟器和真实设备上都会出现动画故障 就在导航动画结束时 列表项似乎 跳 了几个像素到其指定位置 请参阅以下简单示例 内容视图 struct ContentView View var body s

随机推荐

  • 使用 Mysql 检索最后插入的 id

    再会 我愿意检索 Mysql 中新插入的行的 id 值 我知道有 mysqli insert id 函数 但是 我无法指定表格 如果同时进行查询 可能会存在检索到错误 id 的风险 我正在使用 Node js MySQL 我不想冒险查询最高
  • 从 applicationContext.xml 读取环境变量

    我需要读取 web xml 中定义的环境变量
  • 静态方法中的局部变量也是静态的吗?

    我想知道如果我们在静态方法中声明它们 所有局部变量都会变成静态吗 例如 public static void A int x 3 2 changeX x for int i 0 i lt x length i System out prin
  • 如何在 Sympy 中进行函数组合?

    我想做类似的事情h f g x 并能够对 h 进行微分 例如h diff x 仅针对一个功能 例如h cos x 这实际上是可能的 并且文档说得很清楚 但对于函数组合则不太清楚 如果您已经这样做了 请向我展示一个示例或将我链接到相关文档 如
  • Guice 在 UI 线程之外创建 Swing 组件有问题吗?

    我正在使用 Google Guice 作为 IOC 容器开发 Java Swing 应用程序 一切进展顺利 存在一些用户界面问题 当标准 L F 替换为推送像素时 由于 Guice 的 Swing 组件在 UI 线程之外创建 因此 Subs
  • 何时使用socket.io以及何时使用ajax

    我一直在nodejs 中编程 研究了如何使用socket io 和ajax 调用节点服务器 socket io 是为了取代 ajax 而设计的吗 我很想知道在哪些情况下使用 socket io 比较好 哪些 ajax 更好 感谢您的意见 嗯
  • 没有可用的事务性 EntityManager

    我是 jpa 和 spring 世界的新手 目前正在对一个简单的方法进行一些单元测试 但仅当我在单元测试模式下运行测试类时才会收到此错误消息 java lang IllegalStateException No transactional
  • 如何使用poi在java中读取excel(.xlsx)?

    我正在尝试用java读取excel 我有以下代码 import java io FileInputStream import java io IOException import java io InputStream import jav
  • PHP 中的 MACTripleDES

    我正在尝试获得与 C 等效的 MAC TripleDESMACTripleDES class 我尝试过以下mcrypt 但这只是 TripleDES 中的编码 我需要获取与 C 中生成的字符串等效的 MACTripleDES 字符串来验证消
  • Google OAuth 2 授权 - 将代码交换为令牌

    我正在尝试实施 Google OAuth 2 以访问 Google API 我跟随this指南 使用服务器端场景 我获取代码没有问题 服务器重定向到 localhost 这是目前重定向 URI 中允许的唯一服务器 为了实现这一目标 我去ht
  • 如何使用Tkinter模仿这个表?

    如何开始使用 Tkinter 创建类似的表 使用 Ttk TkinterTreeview小部件 这提供了一个树型布局或listview带有标题布局的样式列 As the Treeview小部件来自 Tk 的主题图标集 它在 Windows
  • 在prepareForSegue方法中防止segue?

    是否可以取消segueprepareForSegue method 我想在转场之前执行一些检查 如果条件不成立 在这种情况下 如果某些UITextField为空 显示错误消息而不是执行 segue 在 iOS 6 及更高版本中这是可能的 你
  • 用于 mysql 的开源 ER 图表工具 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想对我拥有的数据库的数据库定义转储进行逆向工程 导入到图表形式 然后由于在这个特定数据库中没有定义外键 我希望能够手动创建表到表键映射 使用 cr
  • 将动态 JSON 对象传递到 Web API - Newtonsoft 示例

    我需要将动态 JSON 对象传递到我的 Web API 控制器 以便我可以根据它的类型对其进行处理 我尝试过使用 JSON NET 示例可以在这里看到但是当我使用Fiddler时 我可以看到传入的JObect始终为空 这是粘贴到 Fiddl
  • 来自嵌套字典的 Pandas 数据框

    我的字典看起来像这样 x b 10 c 20 y b 33 c 44 我想获得一个如下所示的数据框 index col1 col2 val 0 x b 10 1 x c 20 2 y b 33 3 y c 44 我尝试调用 pandas f
  • 以编程方式设置时 UITextView selectedRange 不显示

    我的问题是以编程方式设置 UITextView 的 selectedRangeselects文字 但是does not直观地表明它已被选中 这听起来像是 OS 3 0 3 1 中的错误吗 更重要的是 有什么解决方案或建议可以显示选择 示例项
  • 单击按钮后使用 Selenium 切换到新窗口

    我正在开发一个非常简单的网页项目 但遇到了一些困难 我正在使用一个网站 填写表格并单击按钮后 我会在新窗口中打开 XML 文档 从而获得所需的数据 但是 我不知道如何访问它 因为没有给出窗口名称 browser Browser firefo
  • 如何从SQL Server查询数据?

    我在从数据库查询数据以在 VB NET 中制作报告时遇到问题 我使用业务对象来制作报告 这是我的示例数据 Id Item Unit Unit Price Quantity Amount
  • Python:与 list.remove 混淆

    我对 Python 很陌生 很抱歉这个可能很简单的问题 虽然我现在花了2个小时才找到答案 我简化了代码来说明问题 side 5 eva side print str side side before print str eva eva be
  • 限制Spritekit游戏中GUI元素的比例

    由于帖子太大 我提前道歉 但是每个尝试过制作某种通用应用程序的人都知道这是一个相当有问题的东西 所以请对我宽容一些 The goal 我想要实现的目标 如上图所示 是在 iPhone 5 和 6 上使用 2x 资源 并保持应用程序的相同外观