SpriteKit:在各种设备上保持一致的大小和速度

Tre*_*vör 5 math sprite-kit swift

TL; DR:我想找到一种给物体提供脉冲的方法,这样物体的速度就与场景大小成正比.

我目前正在构建一个SpriteKit游戏,可以在许多不同的屏幕尺寸上使用scene.scaleMode = .ResizeFill,当我在其他设备上启动我的游戏而不是我开发的游戏时,我的场景调整大小与其视图()相同.,我注意到:

  • 节点的大小太小

  • 物体的速度太低(我给物体加速的方式是调用applyImpulse(:_)它们的物理体).

我想用一个简单的比例操作来修正大小问题:我查看了具有正确对象大小的场景的objectArea/sceneArea比率,而不是给我的对象提供固定尺寸,我只是给它们尺寸以便无论场景区域如何,比率始终相同.

对于物体速度来说,它比较棘手......
我首先想到的是物理体质量较高,因为物体本身较大,但由于我直接通过它们的质量属性将物质归结为物体,物体将具有完全相同的质量,无论其大小.

我终于弄清楚这只是因为屏幕尺寸不同,因此,即使以相同的速度移动,对象也会在更大的屏幕上移动得更慢.

我的问题是,我不知道如何调整我的冲动强度,以便它在不同的场景大小上保持一致,我目前的方法就是这样:

force = sqrt(area) * k
Run Code Online (Sandbox Code Playgroud)

其中k也是比例系数,我不能在该区域上做比例,否则,速度会呈指数增长(所以我用区域的平方根代替).

虽然这种方法有效,但我只是用这种直觉来计算它.虽然我知道对象区域与场景大小正确成比例,但我无法确定在所有屏幕尺寸上是否可以将速度视为等效

你知道我应该做些什么来确保所有设备上的速度始终相同吗?

Luc*_*tti 5

不要这样做

改变与设备屏幕相关的物理世界是错误的.

物理世界应该对其图形表示绝对不可知.并且最终它应该具有相同的属性(大小,质量,距离......),无论屏幕如何.

我知道你不希望当游戏在iPad Pro而不是iPhone 5上运行时,场景会变小,但你需要以另一种方式解决这个问题.

我建议你尝试另一个scaleModeaspectFill(大写如果你在Xcode中7 AspectFill).通过这种方式缩放场景,所有精灵都会显得更大.


另一个角度来看

在下面的评论中,@ Knight0fDragon指出了一些场景,你可能真的想根据用户界面制作物理世界的一些属性.我建议这个答案的读者看看下面的评论,以寻找与我不同的观点.

  • 如果您想支持每个设备和每个方向(并且您不希望您的游戏在多个设备上的信箱中运行),您将需要裁剪部分场景(因此“aspectFill”)。我不知道你的游戏,但根据你提供的信息,没有更好的解决方案。这会是一个大问题吗? (2认同)