在Java中读取精灵表的最佳方法是什么?

时间:2008-11-18 00:04:27

标签: java io 2d sprite-sheet

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

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

我可能还有其他一些因素没有在这里考虑过,所以我可能会在上面的列表中添加内容,或者在人们提出建议时(请在评论中这样做)。

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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

您的x和y会根据您所在的框架而改变。保持宽度和高度相同,以使自己容易。

忘记尝试将整个游戏保持在一张纸上。它很坚固,很难管理。为每个动画序列使用新的png。如果你是节省空间的肛门,只需创建移动右动画,只需实时翻转缓冲图像向左移动。

Java将使用alpha读取png文件,因此不必担心透明度颜色。在png中绘制所有内容。使用Photoshop或Gimp。

在Google上搜索java图片TYPE_INT_ARGB

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

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

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