2015-06-09 177 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的含義。