【问题标题】:SpriteKit : Keep consistent sizes and speeds across devicesSpriteKit:跨设备保持一致的大小和速度
【发布时间】:2017-01-06 01:11:25
【问题描述】:

TL;DR : 我想找到一种方法来给一个物体一个脉冲,使这个物体的速度与场景大小成正比。

我目前正在构建一个可以在许多不同屏幕尺寸上使用的 SpriteKit 游戏,当我在除我开发的一个,我注意到:

  • 节点尺寸太小

  • 物体的速度太低(我给物体速度的方法是在它们的物理体上调用applyImpulse(:_))。

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

对于物体的速度,它更棘手......
我首先认为这是由于物体本身更大,因此物理质量更高,但因为我通过直接将它们的质量归因于物体它们的质量属性,无论它们的大小如何,物体都将具有完全相同的质量。

我终于明白,只是因为屏幕大小不同,所以一个物体,即使以相同的速度移动,在更大的屏幕上似乎移动得更慢。 p>

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

force = sqrt(area) * k

其中 k 也是比例系数,我无法在面积上做比例,否则速度会呈指数增长(所以我用面积的平方根来代替)。

虽然这种方法有效,但我只能凭直觉找到这种计算方法。虽然我知道物体区域与场景大小成正比,但我真的不知道速度是否可以在所有屏幕尺寸上被视为相同

您知道我应该怎么做才能确保所有设备上的速度始终相同吗?

【问题讨论】:

  • 嗯,我有一个问题,你为什么要手动进行缩放?只需制作 3 个 sks 文件(一个纵横比为 16:9,一个纵横比为 4:3,一个纵横比为 3:2),然后使用 .AspectFill scaleMode 选择正确的一个

标签: swift math sprite-kit


【解决方案1】:

不要这样做

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

物理世界应该绝对不可知它的图形表示。无论屏幕如何,它都应该具有相同的属性(大小、质量、距离……)。

我知道当游戏在 iPad Pro 而不是 iPhone 5 上运行时,您不希望场景比屏幕更小,但您需要通过其他方式解决此问题。

我建议您尝试另一个scaleMode,例如aspectFill(如果您使用的是Xcode 7,则大写:AspectFill)。通过这种方式,场景被缩放,所有的精灵都会显得更大。


另一种观点

在下面的 cmets 中,@Knight0fDragon 指出了一些场景,在这些场景中,您可能实际上想要根据 UI 制作物理世界的某些属性。我建议这个答案的读者看看下面的 cmets,以获得与我不同的观点。

【讨论】:

  • 如果你想支持每个设备和每个方向(并且你不希望你的游戏在多个设备上的信箱中运行)你需要裁剪你的部分场景(所以aspectFill )。我不了解您的游戏,但根据您提供的信息,没有更好的解决方案。会不会有什么大不了的?
  • 好的,我明白了。再次感谢您对物理世界的建议,我会看看我能对不同的 scaleModes 做些什么!
  • 他所做的并没有“错”,物理世界应该知道它的指标是什么,并且有充分的理由这样做。 (OP 不是以这些方式之一)在处理 ResizeFill 时,不同的场景大小意味着从边缘到边缘的距离不同,并且需要更多的力来保持一致。如果他期望一个物体移动相同的屏幕距离。
  • @Knight0fDragon:在 Cocos2D 中,您可以明确定义每米像素的关系。不过我认为 SpriteKit 中的scaleMode 选项提供了更高级别的工具。
  • 这不是 Cocos2D,所以即使提到它也无关紧要,除非你的答案是切换到它。 scaleMode 是懒人的方法。 9 / 10 倍,效果很好,因为像素太小,很难注意到。有 1 / 10 的时间,但是当你有那些知道如何利用每个像素的了不起的艺术家时,scaleMode 就会成为一个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
相关资源
最近更新 更多