【问题标题】:How to get subImages from a sprite sheet with different sprite sizes?如何从具有不同精灵大小的精灵表中获取子图像?
【发布时间】:2015-08-23 15:37:11
【问题描述】:

我正在用 Java 做一个格斗游戏,但我在动画方面遇到了一些问题。

问题是当玩家闲置或行走时,我没有问题,因为每个精灵都有固定的宽度(50px),但是当玩家攻击时,只要打得更远,精灵就会变得更宽。并且在游戏中精灵无法正确绘制。

PS:我将每个帧/精灵保存在一个数组列表中,并根据精灵的数量手动更改 MAXFRAMES。 SS 是精灵表。

我正在使用 getSubImage 方法,如下所示。

public void setAnimacionIdleRight(BufferedImage ss) {
    this.animation_idle_right = new ArrayList<BufferedImage>();

    BufferedImage tmp = ss.getSubimage(0, 0, 350, 100);
    BufferedImage subtmp = null;
    int k = 1;
    for(int i = 1; i < MAXFRAMES; i++) {
        subtmp = tmp.getSubimage((CELLWIDTH * i) + k - CELLWIDTH, 1, CELLWIDTH, CELLHEIGHT);            
        this.animation_idle_right.add(subtmp);
        k++;
    }
}

SpriteSheet 示例:

有什么想法吗?还是解决方案蛮力加载img?

【问题讨论】:

  • 两件事:1- 使每个精灵始终具有完全相同的大小或 2- 创建某种查找表,它可以告诉您精灵在给定位置的大小
  • @MadProgrammer 是绝对正确的。没有别的办法。我认为第二个建议是最好的,因为这样可以节省空间,但是创建 LUT 会涉及很多开销。如果你使用第一种方法,你开发会更快。
  • 或者 3- 使用某种类型的图像分析库来分离子图像矩形,那些包含连续图像的矩形......充其量是棘手的。
  • 是的,我正在尝试遍历精灵像素列(从'cellwidth'列开始)寻找像素RBG!= 0,这意味着img更宽,然后移动到下一列,直到它们都为 0,然后将单元格宽度设置为该列的值,但这非常棘手.. =/ 如果我不能完成它,我只是手动裁剪精灵。谢谢你的想法:)

标签: java image animation sprite


【解决方案1】:

按照 MadProgrammer 的建议,您可以手动设置工作表中每个精灵的大小。 由于高度总是相同的,那么您可以简单地拥有一个大小与工作表上精灵数量相同的数组,并且只将精灵宽度放入其中。

为了帮助您,您可以在手动设置值之前执行一个循环,如下所示:

float cellWidths[MAX_FRAMES/CELLNUMBER];
for(int i=0; i<MAX_FRAMES/CELLNUMBER;i++){
    cellWidths[i] = CELLWIDTH;
}
//set non default values manually.

然后你只需要像这样改变你:

for(int i = 1; i < MAXFRAMES; i++) {
    subtmp = tmp.getSubimage((cellWidths[i-1] * i) + k - cellWidths[i-1], 1, cellWidths[i-1], CELLHEIGHT);            
    this.animation_idle_right.add(subtmp);
    k++;
}

但我可能误解了 MAX_FRAMES 的含义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多