swift - SpriteKit 在跨设备的视图框架内生成对象
问题描述
我正在 spriteKit 中创建我的第一个游戏。我遵循了一些教程,因此我能够使游戏以单一尺寸运行。游戏中的对象从屏幕顶部生成并落向位于底部的玩家。
我遇到的问题是玩家和对象的坐标都是相对于场景的,默认情况下是 iPad pro 9.7 尺寸。现在,当我在 iPhone 8 上运行游戏时,对象也会在视图之外生成,并且玩家也可以向左/向右移动一点(我使用 aspectFill 作为缩放模式,所以边被切断了)。
将播放器和对象定位为当前视图的子级的正确方法是什么,以便它们正确缩放并且它们的坐标相对于它?
我只是用它来给玩家一个起始位置(这当然是一个占位符):
player = Player(color: .red, size: CGSize(width: 40, height: 80))
player.position = CGPoint(x: frame.midX, y: frame.size.height/5)
player.zPosition = ZPosition.player
addChild(player)
编辑:澄清一下,问题是 midX 是 384,但在 iPhone8 上视图的 midX 是 160,因此坐标不匹配
这是一张图片来澄清https://imgur.com/a/0I8i5CX 玩家应该只在中心产生,这不是问题,问题是在任何给定时间触摸坐标系都不同于玩家的系统,使其无法被点击。
另外,我在gamescene.sks的中心是0,0
解决方案
在 sprite kit 中开发时,您需要考虑纵横比。如果您真正使用的是“单一尺寸”,那么无论您使用什么设备,您的中心都应该是相同的。(0,0)
从你告诉我的
问题是 midX 是 384,但在 iPhone8 上视图的 midX 是 160
是你从你的视角而不是你的场景中阅读。
这很糟糕,因为您的视图和场景将是两种不同的大小。
您需要做的第一件事是定义您的游戏区域。如果你想让你的桨击中所有设备的侧面,那么你需要以 18:39 的宽高比进行开发(如果你打算在 iphone x 上使用安全区域,则需要 9:16)
这意味着在 Ipad 上,对象将从屏幕顶部被截断,因为剪切将发生在屏幕顶部而不是侧面。
现在,如果您想让球拍击中屏幕的侧面并让对象在屏幕顶部生成,那么您将需要使用 .resizeScale 模式并标准化所有单位(通常在 0 和 1 之间)。
这意味着您最终将在具有不同纵横比的设备上创建不同的游戏体验,而不是仅仅通过剪辑获得不同的观看体验。
推荐阅读
- amazon-web-services - 具有 AWS Lambda 和 API Gateway 未知令牌的 Terraform 无服务器应用程序?
- python - 如何将字符串转换为二维数组?
- php - Laravel 升级到 6 给出错误外观根尚未设置
- mysql - SQL 中的水平计数
- java - 检索 SecureRandom 数生成器的种子/检查种子是否与从 SecureRandom 生成的随机数匹配
- java - java流已关闭
- node.js - 当我使用服务帐户密钥初始化 firebase 时,部署 firebase 云功能失败
- javascript - 如何从父节点访问子组件节点
- git - 我创建了一个私人仓库,但我无法从终端推送到它
- java - 是否可以在自定义 ADT(排序链表)中使用 2 种数据类型?