如何在所有屏幕上使applyImpulse相等

时间:2018-05-01 21:38:47

标签: ios swift sprite-kit skphysicsbody

正如您在使用 SpriteKit 时所知,applyImpulse在所有屏幕上都无效。

iPhone SE上,我的球移动得非常快,但在iPad Pro 2nd gen球上的速度非常慢。

有没有办法让我在所有屏幕上都相同,比较到类似屏幕的宽度?

比如说,我想让我的球在每个设备上在5秒内移动到屏幕上,我会使用什么公式?

我已经测试了我的applyImpulse屏幕尺寸与时间之间的关系,以使球移动到屏幕边缘:

enter image description here

注意: Points per secondHalf 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

    }
}

1 个答案:

答案 0 :(得分:0)

Sprite套件的设计方式只需要创建一次游戏。

"屏幕的概念"不应该存在,你的场景就是你的屏幕,而你的屏幕就是你的观看方式。

正如我们在聊天中所讨论的那样,你想要一个7:9的游戏区域,你希望场景沿着它的两侧齐平。

要执行此操作,请选择比较宽的场景大小。我推荐使用375:812,因为那是iPhone X. @ 1x。然后将一个节点放在其中,大小为375:482,因为那是7:9。

在常规的9:16设备上会发生什么,顶部和底部区域将被裁剪,但它仍将显示整个比赛场地,因为9:16设备的高度为667。

这意味着将从主游戏区垂直裁剪145个点。

现在我们遇到了iPad的问题,它比9:16设备更胖。

我们的可见场景区域变为375:500,我们的游戏区域几乎不适合。

我们只有18分可以合作,或者没有。

为了解决这个问题,我们需要进入故事板并更改视图的约束。

我们基本上需要强制视图不超过某个宽高比。

通过限制视图的大小,我们可以控制在iPad上进行多少裁剪。然后我们可以在SKView后面添加另一个视图来控制我们希望用户看到的任何图形。

我们现在的游戏设置方式可以将所有游戏区域内容放在375:482游戏区域节点内。

这些维度将贯穿所有设备,硬件将为您进行扩展,这意味着您将拥有更少的代码和更少的数学运算。更少的代码和更少的数学意味着错误进入你的游戏的机会更少,而且游戏完全相同的游戏玩法,这意味着iPad用户没有比iPhone用户更有优势,因为你给了他们更大的游戏区域。