我想弄清楚如何通过给它框架的宽度,高度,行数,列数和frameCount来获取动画精灵表的框架的X和Y坐标。然后,我希望它给出frameNumber中帧的行号和列号。 (从上数到底部从右到左)Java Game Dev:Sprite sheet frame by row and column?
我意识到,我可以得到列号(如果我考虑的行和列由int[][]
来表示)只是做frameNumber % rows
但我难倒如何获取行号。有任何想法吗?
我想弄清楚如何通过给它框架的宽度,高度,行数,列数和frameCount来获取动画精灵表的框架的X和Y坐标。然后,我希望它给出frameNumber中帧的行号和列号。 (从上数到底部从右到左)Java Game Dev:Sprite sheet frame by row and column?
我意识到,我可以得到列号(如果我考虑的行和列由int[][]
来表示)只是做frameNumber % rows
但我难倒如何获取行号。有任何想法吗?
如果你的cols列,您可以简单地使用:
用途:
row = Math.floor(frameNumber/cols);
col = frameNumber % cols;
所以如果你有1000米的cols和希望帧数3989它将给你:
行= 3; col = 989;
如果你知道你想要的帧,多少帧每行有宽度和高度,以及其帧,比获得的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
我不认为找到frameY的部分是正确的,我只是结束了一个小数。 – 2012-01-12 09:14:09
就像我说过的,它必须是一个int,byte或long除法,以便小数被截断。如果您仍然遇到问题,请将整个表达式转换回上述类型之一。 – Zistack 2012-02-12 23:32:24
对不起,但我认为这个答案很混乱,所以我不得不放弃它。 – 2012-08-21 14:37:34
我想过这个,但我不确定,即使数字接近下一个最大的整数,Math.floor操作是否舍入到最接近的整数?像1.99999一样是1? – 2012-01-12 09:15:23
是的,它总是楼层。这就是为什么你在这种情况下需要它。 (实际上只在/不在模) – Niko 2012-01-12 11:37:55