我想存储一个二维世界,其中包括按块(具有x和y坐标)分组的块(具有x和y坐标)。
此代码显示了块如何将某些块分组:
public class Chunk {
Block[][] blocks = new Block[GameProperties.MAP_SIZE_CHUNK][GameProperties.MAP_SIZE_CHUNK];
int xpos, ypos;
public Chunk(int posx, int posy){
this.xpos = posx;
this.ypos = posy;
for (int x = 0; x < blocks.length; x++) {
for (int y = 0; y < blocks.length; y++) {
int blockx = xpos*GameProperties.MAP_SIZE_CHUNK + x;
int blocky = ypos*GameProperties.MAP_SIZE_CHUNK + y;
blocks[x][y] = new Block(blockx, blocky);
}
}
}
}
目前GameProperties.MAP_SIZE_CHUNK = 8,因此每个块表示8x8 = 64个块,但这是可以更改的内容,我必须动态地进行操作!
坐标是整数,可以是正数,也可以是负数。
-100> = y> MAXINT
-MAXINT> x> MAXINT
块坐标具有相同的规则,但从左上角的块开始计数:
块(0 | 0)= 0 块(-1 | 0)= -8
这是我根据块坐标计算块和相对块的方法:
public int modulo(int a, int b){
if(a < 0){
return (a % b + b) % b;
}
return a % b;
}
public Block getBlock(int x, int y){
int chunkx;
int blockx;
if(x < 0){
int xn = x-GameProperties.MAP_SIZE_CHUNK;
if(xn > GameProperties.MAP_SIZE_CHUNK){
xn--;
}
chunkx = (xn)/GameProperties.MAP_SIZE_CHUNK;
blockx = modulo((xn),GameProperties.MAP_SIZE_CHUNK);
}else{
chunkx = x/GameProperties.MAP_SIZE_CHUNK;
blockx = modulo(x,GameProperties.MAP_SIZE_CHUNK);
}
int chunky;
int blocky;
if(y < 0){
chunky = y/GameProperties.MAP_SIZE_CHUNK;
if(chunky == 0){
chunky = -1;
}
blocky = modulo(y,GameProperties.MAP_SIZE_CHUNK);
}else{
chunky = y/GameProperties.MAP_SIZE_CHUNK;
blocky = modulo((y),GameProperties.MAP_SIZE_CHUNK);
}
Chunk c = getChunk(chunkx, chunky);
Block b = c.getRelativeBlock(blockx, blocky);
System.out.println("<<< " + x + " | " + b.getxPos() + " = " + (x-b.getxPos()));
return b;
}
公平地说,这是一个真正的烂摊子,因为我已经尽一切努力让模在负数上工作...
有时,块(-1 | 0)到达位置(0 | 0),有时x
GetChunk和Chunk.getRelativeBlock具有全部功能,并且仅从Map / Array返回放置的块/块。
编辑
由于不清楚我在问什么:
我在Java中遇到否定模的问题。但是即使最终结果出了点问题,也可能是模函数,也可能在其他地方。
有人知道我的代码在哪里吗?
最佳答案
也许你可以使用这个:
public int modulo(int a, int b){
if(a < 0){
return (a + b) % b;
}
return a % b;
}
代替这个:
public int modulo(int a, int b){
if(a < 0){
return (a % b + (1 + (Math.abs(a) / b)) * b) % b;
}
return a % b;
}
另一个问题:您如何知道b为正?
关于java - 访问数据时对负索引进行模数运算出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14280791/