首页 > 解决方案 > 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

标签: swiftsprite-kitcoordinates

解决方案


在 sprite kit 中开发时,您需要考虑纵横比。如果您真正使用的是“单一尺寸”,那么无论您使用什么设备,您的中心都应该是相同的。(0,0)

从你告诉我的

问题是 midX 是 384,但在 iPhone8 上视图的 midX 是 160

是你从你的视角而不是你的场景中阅读。

这很糟糕,因为您的视图和场景将是两种不同的大小。

您需要做的第一件事是定义您的游戏区域。如果你想让你的桨击中所有设备的侧面,那么你需要以 18:39 的宽高比进行开发(如果你打算在 iphone x 上使用安全区域,则需要 9:16)

这意味着在 Ipad 上,对象将从屏幕顶部被截断,因为剪切将发生在屏幕顶部而不是侧面。

现在,如果您想让球拍击中屏幕的侧面并让对象在屏幕顶部生成,那么您将需要使用 .resizeScale 模式并标准化所有单位(通常在 0 和 1 之间)。

这意味着您最终将在具有不同纵横比的设备上创建不同的游戏体验,而不是仅仅通过剪辑获得不同的观看体验。


推荐阅读