代码之家  ›  专栏  ›  技术社区  ›  ninesided

在Java中读取sprite工作表的最佳方法是什么?

  •  0
  • ninesided  · 技术社区  · 17 年前

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

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

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

    4 回复  |  直到 17 年前
        1
  •  1
  •   Firas Assaad    17 年前

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

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

    我直接使用存储在PNG图像中的阿尔法和透明度信息,所以我不需要担心将其存储在其他地方,尽管其他方法是为每个精灵选择一个固定值并存储在某个地方,如果你知道它总是空的,则使用姿势中最左侧的像素,如果你使用这些,则使用特定的调色板条目,精灵蒙版,或者你有什么。

        2
  •  0
  •   bateristt    14 年前

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

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

        3
  •  0
  •   kleopatra Aji kattacherry    13 年前

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

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

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

    你的x和y会根据你所在的框架而变化。保持宽度和高度不变,让你自己更轻松。

    忘记试图将整个比赛保持在一张纸上。这很疯狂,很难管理。为每个动画序列使用新的png。如果你不想节省空间,只创建向右移动的动画,并实时翻转缓冲图像向左移动。

    Java会读取带有alpha的png文件,所以不用担心透明度颜色。用PNG格式绘制所有内容。使用Photoshop或Gimp。

    在谷歌上搜索java图像TYPE_INT_ARBB

        4
  •  -1
  •   John Gardner    17 年前

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

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