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

3

你可能知道在使用SpriteKit时,applyImpulse在所有屏幕上的表现并不理想。

在上,我的球移动得非常快,但在上,球移动得非常慢。

有没有办法使这在所有屏幕上都相等,与屏幕宽度相比

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

我已经测试了屏幕大小和时间之间的关系,以便使用applyImpulse将球移动到屏幕边缘:

enter image description here

注意:每秒点数是通过半屏幕大小除以移动时间计算的。图表显示,随着屏幕尺寸变大,每秒像素数会减少。
我该如何更改我的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的目的是在一个尺寸上进行设计。否则,在SpriteKit中,150点 == 1米 - Knight0fDragon
我正在使用.aspectFill,并且我的加载场景的代码是let scene = GameScene(size: view.frame.size)... 有趣的是,你之前已经评论了我很多问题。 - George
我不确定您所说的“以编程方式创建场景并保持比例因子”的意思。首先,我需要问一下,您计划为客户提供什么样的体验?您希望他们尽可能接近这种体验吗?还是您计划让4:3设备的行为与16:9设备不同? - Knight0fDragon
@Knight0fDragon 我正在尝试创建一个仅由编程创建的场景,不使用.sks文件。我希望对象能够适应大小。 - George
让我们在聊天中继续这个讨论 - Knight0fDragon
显示剩余2条评论
1个回答

0

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

"屏幕"的概念实际上不应该存在,您的场景就是您的屏幕,而您的屏幕只是您查看它的方式。

正如我们在聊天中讨论的那样,您想要一个 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用户不会因为您给他们一个更大的游戏区域而获得优势。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接