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

Posted

技术标签:

【中文标题】在 Java 中读取精灵表的最佳方法是啥?【英文标题】:What's the best way of reading a sprite sheet in Java?在 Java 中读取精灵表的最佳方法是什么? 【发布时间】:2010-09-22 18:48:00 【问题描述】:

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

你怎么知道一个精灵在哪里 开始,下一个开始 您如何处理透明度问题

这里可能还有其他我没有想到的因素,所以我可能会根据我的想法或人们提出的建议添加到上面的列表中(请在 cmets 中这样做)。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

“自定义”是什么意思?大多数是香草位图。如果我有一个 .jpg 或 .png 格式的精灵表,你如何在不使用隐写术或其他东西的情况下将元数据编码到其中? 它们是“自定义”的,因为它们是您的,因此您可以决定文件中的内容。是的,内容可能是一个简单的位图,但您可以在包含精灵大小的位图中制作自定义文件格式或自定义信息。【参考方案2】:

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

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

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

【讨论】:

@Artifact 这只是我编写的一个自定义 .Net 工具。你可以找到它here【参考方案3】:

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

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

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

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

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

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

在 google 上搜索 java 图像 TYPE_INT_ARGB

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于在 Java 中读取精灵表的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

保持从文件中读取的字符串值列表的最佳java方法是啥[关闭]

用于在 Java 中读取文件的最佳/最简单的类是啥?

在 Perl 中打开和读取文件的最佳方法是啥?

管理 GUI 状态(创建、编辑、读取模式...)的最佳方法是啥

使用 Javascript 直接在浏览器中读取 Sqlite3 的最佳方法是啥?

以编程方式读取 ildasm 输出的最佳方法是啥