0

チャンク (x 座標と y 座標を持つ) にグループ化されたブロック (x 座標と y 座標を持つ) で構成される 2 次元の世界を格納したいと考えています。

このコードは、チャンクがいくつかのブロックをグループ化する方法を示しています。

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 <= x/y < 8 チャンク (-1|0) = -8 <= x/y < 0

これは、ブロック座標からチャンクと相対ブロックを計算する方法です。

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<-のチャンク1ブロック移動。私はそれについてかなり長い間考えていましたが、問題が見えなくなってしまいました。助けてもらえますか?

GetChunk と Chunk.getRelativeBlock は完全に機能し、マップ/配列から配置されたブロック/チャンクを返すだけです。

編集

私が何を求めているのか不明だったので、Java の負のモジュロに問題がありました。しかし、それでも最終結果には何か問題があります。それはモジュロ関数である可能性があり、別の場所にある可能性があります。 誰かが私のコードのどこに問題があるか知っていますか?

4

1 に答える 1

1

多分あなたはこれを使うことができます:

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 が正であることはどのようにわかりますか?

于 2013-01-11T15:20:58.490 に答える