用于检查像素坐标中的偏移量的有效代码



我正在使用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, -1710,它们都应该返回相同的结果。

  • 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;

  1. 第一个模确保数字小于tileSize
  2. 添加确保数字是正的,因为它小于tileSize,并且添加了tileSize
  3. 第二个模确保数值为正且小于tileSize

如果tile的大小是2的幂,那么

brokenX = xOffset & (tileSize - 1);
if (brokenX < 0)
    brokenX = tileSizeX - (Math.abs(brokenX) % tileSizeX);

最新更新