【问题标题】:2D Zoom: Adjusting Distances Between Sprites2D 缩放:调整精灵之间的距离
【发布时间】:2015-08-17 20:27:36
【问题描述】:

我正在尝试为基本游戏实现 2d 缩放。我有图像缩放。我也有一个基本的缩放有时会失败。就像...在您开始大量测试之前,它看起来几乎是合法的。有时,当我放大并将两个对象移近,然后再缩小时,这些对象现在会重叠,尽管放大后的版本显示不同。

zoom_level 从 1 开始。

zoomIn():
    zoom_level *=1.2;
    for sprite in sprites:
        //make sprites 1.2 times their current size 
        sprite.x *= (zoom_level * zoom_level);
        sprite.y *= (zoom_level * zoom_level);

【问题讨论】:

  • 你用相同的缩放系数缩放精灵?否则,当它们的距离减小时,它们自然会重叠。如果您也缩放它们并且它们仅重叠几个像素,这可能是舍入错误。然后你可以尝试使用 floor() 而不是 round() 来对精灵的大小进行四舍五入。
  • 精灵是鸟瞰图。我想放大窗口的一部分(然后四处滑动以查看当前上下文之外的精灵),所以我希望它们按相同的大小缩放并相应地调整距离的比例。
  • 如何调整我的代码以使在一个缩放级别中不重叠的精灵在其他缩放级别中仍然不重叠?
  • 如果你把两张截图(缩小而不重叠,放大重叠)放在某个地方可能会更容易理解这个问题。但我猜这是一个标准解的标准问题,但我自己的知识在那里真的很差。
  • 当我放大时,可能有两个对象不重叠。我一缩小,它们就会重叠。在短期内,我缩放精灵大小比放大时的距离更大。

标签: 2d zooming game-engine scaling


【解决方案1】:

真的很难给出正确的答案,因为没有给出引擎/平台/语言。

一般解释:

您将希望按与缩放其尺寸相同的因子缩放精灵的 x/y 坐标。最靠近“缩放点”的角落应该是缩放的锚点。 [意思是如果你放大到你的精灵的 x/y 坐标,它就足以缩放宽度/高度。但如果你想放大精灵的中心,x/y 坐标也会发生变化,因为它们会被推向屏幕边缘。]

但大多数情况下,您不应该通过更改精灵的实际世界位置/尺寸来处理缩放/变换。大多数引擎使用“相机”或“视口”将对象的世界坐标投影到屏幕坐标。这意味着它们在渲染时缩放/转换所有图像,保持世界坐标不变。你应该在你的引擎中使用任何等效的东西。

例如,给定 (1,1) 处的正方形,尺寸为 1x1,如果我们使用坐标原点作为锚点放大 2 倍(实际上是所有内容的两倍),我们最终会渲染一个正方形在 (2,2) 处,屏幕空间的尺寸为 2x2。

特定于您给定的代码 sn-p:

你为什么要把你的缩放级别放在这条线上?

sprite.x *= (zoom_level * zoom_level); 

好像错了,你确定是简单的

sprite.x *= zoom_level;

还不够吗? 据我所知,这只会缩放精灵的位置而不是它们的尺寸,您可能也应该缩放它们的宽度/高度。 OTOH,如果您的引擎已经处理了相机/视口缩放,您可能根本不想更改精灵的 x/y 坐标,否则您可能会双重变换它们。

无论如何,我建议您阅读特定于您的引擎的文档/教程。

【讨论】: