2

私はこの方法に本当に混乱しています。主な理由は、彼が一部でビットシフトする理由が混乱しているためです。

なぜマップ幅マスクが使用されているのか、またはここですべてが非常に混乱しているのかわかりませんが、誰かが私のためにこれをすべて分析できますか?

public static final int MAP_WIDTH = 64;
public static final int MAP_WIDTH_MASK = MAP_WIDTH - 1;

public int[] tiles = new int[MAP_WIDTH * MAP_WIDTH];
public int[] colours = new int[MAP_WIDTH * MAP_WIDTH * 4];

public int xOffSet = 0;
public int yOffSet = 0;

public int width;
public int height;

public void render(int[] pixels, int offset, int row) {
    for(int yTile = yOffSet >> 3; yTile <= (yOffSet +height) >> 3; yTile++) {
        int yMin = yTile * 8 - yOffSet;
        int yMax = yMin + 8;
        if(yMin <0) yMin = 0;
        if(yMax > height) yMax = height;

        for(int xTile = xOffSet >> 3; xTile <= (xOffSet + width) >> 3; xTile++) {
            int xMin = xTile * 8 - xOffSet;
            int xMax = xMin + 8;
            if(xMin <0) xMin = 0;
            if(xMax > width) xMax = width;

            int tileIndex = (xTile & (MAP_WIDTH_MASK)) + (yTile & (MAP_WIDTH_MASK)) * MAP_WIDTH;

            for(int y= yMin; y<yMax; y++) {
                int sheetPixel = ((y + yOffSet) & 7) * sheet.width + ((xMin + xOffSet) & 7 );
                int tilePixel = offset + xMin + y * row;
                for(int x = xMin; x < xMax; x++) {
                    int colour = tileIndex * 4 + sheet.pixels[sheetPixel++];
                    pixels[tilePixel++] = colours[colour];
                }
            }
        }
    }
}
4

2 に答える 2

0

どうやら、xOffset >> 3彼は 8 で割ろうとしているだけのようです (そして、読み取り可能なコードを作成する方法を知りません)。彼が最後の 3 つを除くすべてのビットをマスクしている理由については、コードについて詳しく知らなければわかりません。

于 2012-11-10T03:08:49.533 に答える
0

これはおそらく役立ちます:

  • y >> 3y / 8切り捨てに相当します。すべてを移動して、最後の 3 ビットを消去します。
  • y * 8と同等y << 3です。なぜ彼が2人の間で一貫性を保たなかったのか、私には理解できません。
  • y & 7と同等y % 8です; 最後の 3 ビットのみが保持されます。

説明には触れていませんがsheet、64 ピクセル x 64 ピクセルのマップ上で 8 ピクセル x 8 ピクセルの「タイル」を操作しているようです。役立つかもしれないことの 1 つは、リファクタリング ツールです。意味のあるメソッドをいくつか抽出できるかどうかを確認してください。

于 2012-11-10T03:10:53.633 に答える