我正在使用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
}
这很好用。但这似乎是浪费资源(考虑到每帧会做两次)。
是否有一些高效的方式(位掩码等)这样做?
答案 0 :(得分:2)
我认为你正在寻找
brokenX = xOffset % getTileSize();
我认为上面的内容也适用于否定但如果xOffset可以更大,那么你可以做到
好的..好的。我想只需在最后一行添加一个支票即可解决问题。hiddenTiles = xOffset / getTileSize();
xOffset -= hiddenTiles * getTileSize();
if(xOffset < 0) {
brokenX= -(-xOffset % getTileSize());
}
else {
brokenX = xOffset % getTileSize();
}
或者杰森建议: 只有一行...
brokenX= (xOffset + getTileSize())% getTileSize());
我真的认为,这也适用于负补偿。因此不需要进行任何更改。
答案 1 :(得分:1)
以下是在没有条件的情况下克服模数中的负面问题的常用方法:
int tileSize = tileSet.getTileSize();
int brokenX = ((xOffset % tileSize) + tileSize) % tileSize;
int brokenY = ((yOffset % tileSize) + tileSize) % tileSize;
这是有效的:
答案 2 :(得分:1)
我建议使用库函数。显然,对于这项任务来说,这是一个巨大的过度杀伤力,但是在一个好的图书馆中还有更多。我最喜欢的是Guava和mod
int result = x % m;
return (result >= 0) ? result : result + m;
方法:
13, 3, -7, -17
一个例子应该说清楚。我正在尝试使用10
模数13 % 10 = 3
,这些数字应该返回相同的结果。
3 % 10 = 3
,没关系-7 % 10 = -7
,还可以。-7 % 10 + 10 = 3
为负数且无法用作索引,但使用-17 % 10 + 10 = 3
则没问题。result < 0
也很好。因此,对于m < 0
或等效m
,您需要添加{{1}}才能获得正面结果。
答案 3 :(得分:0)
如果瓷砖尺寸是2的幂,那么
brokenX = xOffset & (tileSize - 1);
答案 4 :(得分:0)
if (brokenX < 0)
brokenX = tileSizeX - (Math.abs(brokenX) % tileSizeX);