0

我正在编写一个基本的 sprite 引擎,以供自己娱乐并更好地熟悉 Java 的 2d API。目前,我正在使用大量具有透明背景的单独 .png 文件来表示我需要的各种精灵和不同的动画帧。大多数“现实世界”游戏开发项目似乎都在使用“精灵表”,其中在单个文件中包含多个精灵或动画帧。此外,人们通常不使用原生图像透明度支持,而是将精灵调色板中没有出现的任意颜色指定为透明颜色。如何以编程方式管理这样的文件?

  • 你怎么知道一个精灵从哪里开始,下一个从哪里开始
  • 你如何处理透明度

可能还有其他我没有想到的因素,所以我可能会在我想到事情或人们提出建议时添加到上面的列表中(请在评论中这样做)。

4

4 回答 4

1

我目前使用由一个简单的精灵编辑器生成的 XML 文件,该文件将精灵存储为(可选动画)姿势的集合,这些姿势又是帧或单元格的集合。框架存储每帧信息,例如框架在工作表中的 x 和 y 偏移量、单元格宽度和高度以及任何转换(调整大小/旋转/色调/等)。姿势存储单个帧和动画信息(例如速度),以及一个姿势名称,以便在程序中轻松识别它们(hero.pose = sprite.pose["standing_right"])。Sprites 用作文档根来保存多个姿势,例如每个朝向的姿势。

我之前使用的一个不太灵活的替代方法是为单元格和工作表指定固定大小,并根据这些值计算帧偏移和大小(例如,宽度始终为 32 像素,因此第三个精灵为 32 * 2)。后来我开始在文件名(例如 sprite_name_32x64.png)中为不适合固定单元尺寸的精灵指定这些尺寸。我更喜欢这种新方法,尤其是使用一个简单的编辑器,它为我填充了大多数值并允许我将精灵用作其他精灵的模板。

我直接使用存储在 PNG 图像中的 alpha 和透明度信息,因此我不必担心将其存储在其他地方,尽管其他方法是为每个精灵选择一个固定值并存储在某处,如果你使用姿势中最左边的像素知道它总是空的,如果你正在使用那些,精灵面具,或者你有什么,请使用特定的调色板条目。

于 2008-11-18T07:44:12.240 回答
0

让您的精灵表知道每个序列的大小和数量。

获取工作表的缓冲图像并使用以下内容:

currentframe=spritesheet.getSubimage(x, y, w, h); 

您的 x 和 y 将根据您所在的框架而变化。保持宽度和高度相同,以方便您自己。

忘记尝试将整个游戏保持在一张纸上。这很疯狂,很难管理。为每个动画序列使用一个新的 png。如果您对节省空间感兴趣,请仅创建向右移动的动画,然后实时翻转缓冲图像以向左移动。

Java 将读取带有 alpha 的 png 文件,因此不必担心透明度颜色。用png画出所有东西。使用 Photoshop 或 Gimp。

在 google 上搜索 java 图像 TYPE_INT_ARGB

于 2010-05-03T19:50:09.863 回答
0

与java无关,但通常您可以使所有精灵都具有相同的大小。因此,您将能够使用简单的 for 循环在游戏(或应用程序)中生成精灵。

但是对于不同大小的精灵,精灵表的大小可能会出现问题(它可能比预期的大)。因此,您必须为您的 spritesheet 定义一个 xml 或 json 文件,以便在您的代码中找到您的 sprite 图像。您可以使用精灵表编辑器(有很多,我正在使用Sprite Master)来快速简便地生成精灵表和坐标数据。

于 2012-01-08T20:24:51.493 回答
-1

好吧,由于它们中的大多数都是自定义的,因此这些细节取决于实现者。您通常会让文件以包含高度/宽度和编码、透明度等详细信息的标题信息开头。

很多时候事情都在一个文件中,因为与打开/读取一个文件相比,打开/读取多个文件非常昂贵。许多游戏引擎使用压缩为 0 的 zip 或“类似 zip”的文件来将单个文件视为文件系统。

于 2008-11-18T00:55:55.870 回答