我正在使用Java为一款游戏制作基于贴图的渲染方法。
有可能第一行(和列)的贴图部分绘制在屏幕上,我想知道这些贴图在屏幕上有多少像素。
我想出了这个(用于检查破碎瓷砖的最大X坐标):
int brokenX = xOffset; //xOffset can be any number
while (brokenX < 0){
brokenX += tileSet.getTileSize(); //corrects if the number is negative
}
while (brokenX >= tileSet.getTileSize()){
brokenX -= tileSet.getTileSize(); //corrects if the number is too big
}
这很好。但这似乎是在浪费资源(考虑到每帧要做两次)。
是否有一些有效的方法(位掩码等)做到这一点?
我想你在找
brokenX = xOffset % getTileSize();
我认为上面应该也适用于负数,但如果xOffset可以更大,那么你可以使用
好吧. .好。我认为只要在最后一行添加一个check就可以解决这个问题。
hiddenTiles = xOffset / getTileSize();
xOffset -= hiddenTiles * getTileSize();
if(xOffset < 0) {
brokenX= -(-xOffset % getTileSize());
}
else {
brokenX = xOffset % getTileSize();
}
或者像Jason建议的那样:只有一行…
brokenX= (xOffset + getTileSize())% getTileSize());
我真的认为,这应该也适用于负偏移。因此不需要任何更改。
我建议使用库函数。显然,对于这项任务来说,这是一个巨大的杀戮,但是在一个好的库中有更多。我最喜欢的是Guava,这是mod
方法:
int result = x % m;
return (result >= 0) ? result : result + m;
一个例子应该能说清楚。我正在尝试数字13, 3, -7, -17
模10
,它们都应该返回相同的结果。
-
13 % 10 = 3
,没问题 -
3 % 10 = 3
,仍然OK -
-7 % 10 = -7
是负的,不能作为索引,但-7 % 10 + 10 = 3
是好的。 -
-17 % 10 + 10 = 3
也可以。
所以对于result < 0
,或者等价的m < 0
,你需要加上m
才能得到一个正的结果。
下面是克服无条件模负问题的常用方法:
int tileSize = tileSet.getTileSize();
int brokenX = ((xOffset % tileSize) + tileSize) % tileSize;
int brokenY = ((yOffset % tileSize) + tileSize) % tileSize;
- 第一个模确保数字小于tileSize
- 添加确保数字是正的,因为它小于tileSize,并且添加了tileSize
- 第二个模确保数值为正且小于tileSize
如果tile的大小是2的幂,那么
brokenX = xOffset & (tileSize - 1);
if (brokenX < 0)
brokenX = tileSizeX - (Math.abs(brokenX) % tileSizeX);