【问题标题】:Moving sprites between tiles in an Isometric world在等距世界中的瓷砖之间移动精灵
【发布时间】:2023-03-02 22:07:01
【问题描述】:

我正在寻找有关如何在等距游戏世界中移动(和制作动画)2D 精灵的信息,但要让它们在从一个块到块的移动时平滑地动画化,而不是让它们从一个区域跳出瓷砖,到下一个的范围内。

运输大亨游戏就是一个例子,其中火车和马车通常一半在一块,一半在另一块。

【问题讨论】:

    标签: 2d isometric


    【解决方案1】:

    在正确的位置绘制精灵并不难。投影公式为:

    screen_x = sprite_x - sprite_y
    screen_y = (sprite_x + sprite_y) / 2 + sprite_z
    

    sprite_x 和 sprite_y 是定点值(如果需要,也可以是浮点值)。通常,固定点的精度是图块上的像素数 - 因此,如果您的图块图形是 32x16(投影的 32x32 正方形),您将有 5 位精度,即图块的 1/32。

    真正困难的部分是将精灵排序成正确渲染的顺序。如果您使用 OpenGL 进行绘图,则可以使用 z-buffer 使这变得非常容易。使用 GDI、DirectX 等,真的很难。 Transport Tycoon 不会在所有实例中正确渲染精灵。最初的运输大亨拥有你见过的最可怕的渲染引擎。它实现了三个缩放级别,是大规模 masm 宏的三个实例。 TT 完全用汇编程序编写。我知道,因为我多年前将它移植到 Mac 上(并且还为 PS1 开发套件做了一个很酷的版本,不过它需要 6Mb)。

    附:游戏中的一个小型平房图形基于克里斯·索耶当时居住的房子。我们很想为 Mac 版添加一辆停在车道上的法拉利,因为那是他用版税买的车。

    【讨论】:

      【解决方案2】:

      查看如何进行线性插值(这是一个非常简单的公式)。然后,您可以使用它来参数化单个 [0, 1] 范围内的转换。然后,您只需在 sprite 中有一个状态来存储事实:

      1. 他们正在移动
      2. 起点和终点
      3. 开始和结束时间(或开始时间和持续时间

      然后您可以使用从起点到终点的插值将每一帧绘制在正确的位置。一旦超过了持续时间,精灵就会被更新为不动并定位在终点/图块中。

      【讨论】:

        【解决方案3】:

        你为什么认为它会从一个瓷砖跳到另一个瓷砖?您可以将您的精灵定位在任何 x,y 坐标。

        首先创建你的背景屏幕缓冲区,然后将你的精灵放在它上面。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-19
          • 1970-01-01
          • 2021-05-23
          • 2019-11-20
          • 1970-01-01
          • 2016-06-28
          • 2021-10-22
          • 1970-01-01
          相关资源
          最近更新 更多