【发布时间】:2023-03-02 22:07:01
【问题描述】:
我正在寻找有关如何在等距游戏世界中移动(和制作动画)2D 精灵的信息,但要让它们在从一个块到块的移动时平滑地动画化,而不是让它们从一个区域跳出瓷砖,到下一个的范围内。
运输大亨游戏就是一个例子,其中火车和马车通常一半在一块,一半在另一块。
【问题讨论】:
我正在寻找有关如何在等距游戏世界中移动(和制作动画)2D 精灵的信息,但要让它们在从一个块到块的移动时平滑地动画化,而不是让它们从一个区域跳出瓷砖,到下一个的范围内。
运输大亨游戏就是一个例子,其中火车和马车通常一半在一块,一半在另一块。
【问题讨论】:
在正确的位置绘制精灵并不难。投影公式为:
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 版添加一辆停在车道上的法拉利,因为那是他用版税买的车。
【讨论】:
查看如何进行线性插值(这是一个非常简单的公式)。然后,您可以使用它来参数化单个 [0, 1] 范围内的转换。然后,您只需在 sprite 中有一个状态来存储事实:
然后您可以使用从起点到终点的插值将每一帧绘制在正确的位置。一旦超过了持续时间,精灵就会被更新为不动并定位在终点/图块中。
【讨论】:
你为什么认为它会从一个瓷砖跳到另一个瓷砖?您可以将您的精灵定位在任何 x,y 坐标。
首先创建你的背景屏幕缓冲区,然后将你的精灵放在它上面。
【讨论】: