精灵如何运作?

时间:2010-06-10 16:27:32

标签: animation sprite

精灵如何运作?

我见过超级马里奥兄弟等老式游戏中的精灵,并想知道他们是如何制作游戏的动画。

它们总是呈现为一张大图像地图,所以它们是如何使用的?

对于马里奥(作为一个例子)是否有预先计算的图像坐标轮廓马里奥,并在各种马里奥精灵之间交换产生动画?

或者在游戏初始化期间使用预先计算的图像坐标预先“切割”精灵并将其存储在某个地方的内存中?

显然我对游戏开发一无所知。

6 个答案:

答案 0 :(得分:3)

http://en.wikipedia.org/wiki/Sprite_(computer_graphics)

虽然这篇文章似乎没有谈到你的具体问题,但现在我已经仔细研究了它......

无论如何,它可以以任何一种方式完成,但是如果我必须实现一个精灵处理程序,我可能会使用拆分方法(尽管如另一个答案所述,坐标参考方法可能更容易实现一个简单的动画。)

答案 1 :(得分:3)

在许多较旧的视频游戏和计算机系统中,精灵是一种硬件功能,可以将小图像覆盖到更大的屏幕上。尽管Atari 7800的精灵实现类似于维基百科文章中描述的内容,但在这方面它实际上是独一无二的。大多数子画面系统对扫描线上可能显示的每个子画面使用一组独立的电路,包括水平位置触发器和移位寄存器或其他顺序发送数据的方法。当光栅扫描到达一条线上的适当位置时,电路将开始移出精灵的形状数据。

视频芯片硬件中包含的一些机器(如Odyssey2)可以保存屏幕上所有精灵的形状。 Atari 2600仅为每个精灵保留了8位形状数据,并要求处理器在应该更改的任何地方实时加载数据。然而,最常见的模式是视频芯片自动为内存中的精灵数据提供时钟。通常,硬件会期望数据采用特定格式,或者在某些情况下,采用两种格式之一。

在某些机器上,没有CPU干预的帧上可以同时显示的精灵数等于精灵电路的数量。其他机器有少量的精灵电路,但可以显示更多的精灵;一旦电路完成显示精灵,它就会从内存加载下一个精灵的参数。 NES符合这种模式。

答案 2 :(得分:1)

你可以做到这两点,这取决于开发者。如果将它们存储为单个大图像,则计算所需帧的坐标并将其传输到屏幕,或者将屏幕传输到双屏缓冲屏幕。

或者你可以将大图像预先分割成单独的图像,这需要更多的内存,但在运行时节省一点时间

单个图像中可以有多个精灵。也许是在一行中,或在一个网格中。它们甚至可能被绘制成一个网格,并且只是在一个块中切出。

答案 3 :(得分:1)

图像映射中的精灵通常具有相同的大小,其位置对应于动画中的帧编号。这样,创建动画通常只涉及增加偏移量并剪切位图以显示下一帧。

答案 4 :(得分:1)

第一种技术中的大图像称为atlas,并且通常比为每个精灵帧创建实体更有效。

提到的偏移技术Franci大部分时间都很有效,但对于内存关键的情况,最好使用Zwoptex等纹理打包程序。大多数这些程序会自动为您计算坐标。在init上解析元文件并缓存坐标。

答案 5 :(得分:1)

像NES和DS这样的2D控制台将图像分解为两级层次结构。底部是一个tileset。 tileset是8x8像素图像的索引集合。当关卡加载时,将加载一个tileset,通常加载到专用于图形的内存部分。

然后在此基础上构建精灵和关卡。类似于32x64像素字符的精灵被分成4x8个磁贴。要立即定义sprite,您只需要32个值来标识它使用的tile的索引。内存效率非常高。不同的动画帧和精灵现在可以重复使用相同的磁贴,从而节省大量内存。

现在让游戏绘制一个精灵,它只是在精灵的每个索引处查找拼贴并将它们绘制在屏幕上的正确位置。控制台硬件本身通常会处理这个问题,这就是如何在非常有限的硬件上获得令人惊讶的好图形(最初的NES具有1.67 MHz的CPU和仅4k的RAM)。