2012-01-12 56 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