如何使 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 用户获得优势,因为你给了他们一个更大的游乐区。