如何使 applyImpulse 在所有屏幕上都相等
How to make applyImpulse equal on all screens
您可能知道,在使用 SpriteKit 时,applyImpulse
并非在所有屏幕上都能正常工作。
在 iPhone SE
上,我的球移动得非常快,但在 iPad Pro 2nd gen
上,球移动得非常慢。
有什么方法可以使它在所有屏幕上都相等,与 与屏幕宽度之类的东西相比?
例如,我希望我的球在 每个 设备上在 5 秒内穿过屏幕,我会使用什么公式?
我测试了屏幕尺寸和我的 applyImpulse
使球移动到屏幕边缘的时间之间的关系:
注:Points per second
的计算方法是Half screen size
除以Time to move
。该图显示 pixels per second
随着屏幕尺寸的增大而减小。
如何更改我的 applyImpulse
以在所有屏幕上工作? (不包括专门为每个设备制作它,因为我希望它在未来可持续发展)
如果可行,请展示一个小的 swift
功能,如果无法实现,请给我任何建议(链接到文档、论坛等)。
感谢任何人的帮助。
编辑: 我的 GameViewController.swift
加载场景覆盖:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Layout guides
guide = UIApplication.shared.keyWindow?.safeAreaInsets
if let view = self.view as! SKView? {
// Load scene
let scene = GameScene(size: view.frame.size)
// Set the scale mode to scale to fit the window
scene.scaleMode = .aspectFill
// Set (0, 0) as the centre of the screen
scene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
// Present the scene
view.presentScene(scene)
view.ignoresSiblingOrder = true
view.showsFPS = true
view.showsNodeCount = true
view.showsPhysics = true
}
}
Sprite 套件的设计方式让您只需创建一次游戏。
"Screen"这个概念不应该真的存在,你的场景就是你的屏幕,你的屏幕就是你所看到的。
正如我们在聊天中讨论的那样,您想要一个 7:9 的游戏区域,并且您希望场景沿着它的两侧齐平。
为此,请选择一个比宽高的场景尺寸。我建议使用 375:812,因为那是 iPhone X .@1x。然后在其中放置一个大小为 375:482 的节点,因为那是 7:9.
在常规 9:16 设备上会发生什么,顶部和底部区域将被裁剪,但它仍会显示整个运动场,因为 9:16 设备的高度为 667 .
这意味着将从您的主要游戏区域垂直裁剪 145 个点。
现在我们遇到了 iPad 的问题,它比 9:16 设备更胖。
我们的可见场景区域变为 375:500,我们的游戏区域几乎无法容纳。
我们只有 18 个点可以用于 HUD 或其他。
为了解决这个问题,我们需要进入故事板并更改视图的约束。
我们基本上需要强制视图不超过一定的纵横比。
通过限制视图的大小,我们可以控制 iPad 上的裁剪量。然后我们可以在 SKView 后面添加另一个视图来控制我们希望用户看到的任何图形。
我们现在的游戏设置可以将所有游戏区域内容放置在 375:482 游戏区域节点中。
这些维度将适用于所有设备,硬件将为您进行缩放,这意味着您将需要更少的代码和更少的数学运算。更少的代码和更少的数学意味着更少的错误进入你的游戏的机会,加上游戏在游戏玩法方面完全相同,这意味着 iPad 用户不会比 iPhone 用户获得优势,因为你给了他们一个更大的游乐区。
您可能知道,在使用 SpriteKit 时,applyImpulse
并非在所有屏幕上都能正常工作。
在 iPhone SE
上,我的球移动得非常快,但在 iPad Pro 2nd gen
上,球移动得非常慢。
有什么方法可以使它在所有屏幕上都相等,与 与屏幕宽度之类的东西相比?
例如,我希望我的球在 每个 设备上在 5 秒内穿过屏幕,我会使用什么公式?
我测试了屏幕尺寸和我的 applyImpulse
使球移动到屏幕边缘的时间之间的关系:
注:Points per second
的计算方法是Half screen size
除以Time to move
。该图显示 pixels per second
随着屏幕尺寸的增大而减小。
如何更改我的 applyImpulse
以在所有屏幕上工作? (不包括专门为每个设备制作它,因为我希望它在未来可持续发展)
如果可行,请展示一个小的 swift
功能,如果无法实现,请给我任何建议(链接到文档、论坛等)。
感谢任何人的帮助。
编辑: 我的 GameViewController.swift
加载场景覆盖:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Layout guides
guide = UIApplication.shared.keyWindow?.safeAreaInsets
if let view = self.view as! SKView? {
// Load scene
let scene = GameScene(size: view.frame.size)
// Set the scale mode to scale to fit the window
scene.scaleMode = .aspectFill
// Set (0, 0) as the centre of the screen
scene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
// Present the scene
view.presentScene(scene)
view.ignoresSiblingOrder = true
view.showsFPS = true
view.showsNodeCount = true
view.showsPhysics = true
}
}
Sprite 套件的设计方式让您只需创建一次游戏。
"Screen"这个概念不应该真的存在,你的场景就是你的屏幕,你的屏幕就是你所看到的。
正如我们在聊天中讨论的那样,您想要一个 7:9 的游戏区域,并且您希望场景沿着它的两侧齐平。
为此,请选择一个比宽高的场景尺寸。我建议使用 375:812,因为那是 iPhone X .@1x。然后在其中放置一个大小为 375:482 的节点,因为那是 7:9.
在常规 9:16 设备上会发生什么,顶部和底部区域将被裁剪,但它仍会显示整个运动场,因为 9:16 设备的高度为 667 .
这意味着将从您的主要游戏区域垂直裁剪 145 个点。
现在我们遇到了 iPad 的问题,它比 9:16 设备更胖。
我们的可见场景区域变为 375:500,我们的游戏区域几乎无法容纳。
我们只有 18 个点可以用于 HUD 或其他。
为了解决这个问题,我们需要进入故事板并更改视图的约束。
我们基本上需要强制视图不超过一定的纵横比。
通过限制视图的大小,我们可以控制 iPad 上的裁剪量。然后我们可以在 SKView 后面添加另一个视图来控制我们希望用户看到的任何图形。
我们现在的游戏设置可以将所有游戏区域内容放置在 375:482 游戏区域节点中。
这些维度将适用于所有设备,硬件将为您进行缩放,这意味着您将需要更少的代码和更少的数学运算。更少的代码和更少的数学意味着更少的错误进入你的游戏的机会,加上游戏在游戏玩法方面完全相同,这意味着 iPad 用户不会比 iPhone 用户获得优势,因为你给了他们一个更大的游乐区。