2015-06-09 41 views
0

我正在做一个Java游戏,我在动画方面遇到了一些麻烦。当玩家闲置或行走时,我没有问题,因为每个精灵都有一个固定的宽度(50px),但是当玩家攻击精灵时,只要打得更远,精灵就会变得更宽。在游戏中,精灵不能正确绘制。 PS:我将每帧/精灵保存在一个数组列表中,并根据精灵的数量手动更改MAXFRAMES。 SS是spritesheet。如何从不同精灵尺寸的精灵图表中获取子图像?

我正在使用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例如:

example

什么想法?或者是解决方案蛮力img加载?

+2

两件事情:1-使每个精灵始终大小完全相同或2-创建某种查询表,它可以告诉你在给定位置的精灵大小 – MadProgrammer

+0

@MadProgrammer是绝对正确的。没有别的办法。我认为第二个建议是最好的,因为您可以节省空间,但创建LUT需要很多开销。如果您使用第一种方法,开发速度会更快。 –

+0

或者3-使用某种类型的图像分析库来分离出子图像矩形,那些保存连续图像的矩形......最多只有一点棘手。 –

回答

0

由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的含义。