2012-01-12 57 views
3

我想弄清楚如何通過給它框架的寬度,高度,行數,列數和frameCount來獲取動畫精靈表的框架的X和Y座標。然後,我希望它給出frameNumber中幀的行號和列號。 (從上數到底部從右到左)Java Game Dev:Sprite sheet frame by row and column?

我意識到,我可以得到列號(如果我考慮的行和列由int[][]來表示)只是做frameNumber % rows但我難倒如何獲取行號。有任何想法嗎?

回答

4

如果你的cols列,您可以簡單地使用:

用途:

row = Math.floor(frameNumber/cols); 
col = frameNumber % cols; 

所以如果你有1000米的cols和希望幀數3989它將給你:

行= 3; col = 989;

+0

我想過這個,但我不確定,即使數字接近下一個最大的整數,Math.floor操作是否舍入到最接近的整數?像1.99999一樣是1? – 2012-01-12 09:15:23

+0

是的,它總是樓層。這就是爲什麼你在這種情況下需要它。 (實際上只在/不在模) – Niko 2012-01-12 11:37:55

1

如果你知道你想要的幀,多少幀每行有寬度和高度,以及其幀,比獲得的X和Y座標是相當簡單:

frameX = ((frameNumber - 1) % columns) * frameWidth; 

    frameY = ((frameNumber - 1)/columns) * frameHeight; 

注意, 「/」操作必須是INT,或字節師,因爲你需要的剩餘部分進行四捨五入,以獲得X和Y座標在開始幀的,而不是某個地方在中間。

這些公式適用於sprite工作表,其中幀從左到右,然後從上到下。如果你想它周圍的其他方法,不僅僅是切換「%」和「/」經營者,並改變「列」到「行」:

frameX = ((frameNumber - 1)/rows) * frameWidth; 

    frameY = ((frameNumber - 1) % rows) * frameHeight; 

這也假設你將引用您的幀從1開始,但是如果你不是對其進行索引從0開始,比「 - 1」部分可以刪除:

frameX = (frameNumber % columns) * frameWidth; 

    frameY = (frameNumber/columns) * frameHeight; 
    //assuming that frameNumber indexes from 0; 

另外,如果你只是想知道這列或行的框架是,比只需刪除'* frameWidth'和'* frameHeight'部分,它將返回從0開始的行和列索引:

frameX = (frameNumber - 1) % columns; 

    frameY = (frameNumber - 1)/columns; 

希望這會有所幫助。
Zistack

+0

我不認爲找到frameY的部分是正確的,我只是結束了一個小數。 – 2012-01-12 09:14:09

+0

就像我說過的,它必須是一個int,byte或long除法,以便小數被截斷。如果您仍然遇到問題,請將整個表達式轉換回上述類型之一。 – Zistack 2012-02-12 23:32:24

+0

對不起,但我認爲這個答案很混亂,所以我不得不放棄它。 – 2012-08-21 14:37:34