【问题标题】:How to make applyImpulse equal on all screens如何在所有屏幕上使 applyImpulse 相等
【发布时间】:2018-05-01 21:38:46
【问题描述】:

您在使用 SpriteKit 时可能知道,applyImpulse 并非在所有屏幕上都能正常工作。

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

有没有一种方法可以让所有屏幕上的值都相等,比较类似于屏幕的宽度?

例如,我希望我的球在 每个 设备上在 5 秒内穿过屏幕,我会使用什么公式?

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

注意: 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

    }
}

【问题讨论】:

  • 如果您在除 resizeFill 之外的任何 scaleMode 下工作,您不必担心这一点,因为 scaleMode 的重点是设计 1 个尺寸。否则 150 points == 1 meter 在 spritekit 中
  • 我使用的是.aspectFill,加载场景的代码是let scene = GameScene(size: view.frame.size)...有趣的是,您之前已经评论了我的很多问题????
  • 将游戏场景设置为 view.frame.size 与场景的工作方式相反,它完全忽略了缩放模式,而这正是 Sprite Kit 的一大便利之处。此外,没有什么好笑的,我是 SO 上 SK 框架最活跃的贡献者之一
  • @Knight0fDragon 我正在努力做到这一点,以便我可以通过编程方式创建我的场景 - 你有什么建议以便我可以通过编程方式创建场景保持比例因子呢?跨度>
  • 我不确定您所说的以编程方式创建场景并保持比例因子是什么意思。首先我要问,你打算为你的客户提供什么样的体验,你想让他们尽可能地接近体验吗?或者您是否计划让 4:3 设备的行为不同于 16:9 设备?

标签: ios swift sprite-kit skphysicsbody


【解决方案1】:

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

“屏幕”的概念不应该真的存在,你的场景就是你的屏幕,你的屏幕就是你观看它的方式。

正如我们在聊天中所讨论的,您希望有一个 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 用户获得优势,因为你给了他们更大的游戏区域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多