off和offseting / Bit shift

时间:2012-11-10 02:29:40

标签: java

我真的对这种方法很困惑,主要是因为我很困惑为什么他会在某些部分发生变化。

我不知道为什么使用地图宽度掩码或者其中的任何东西都令人困惑,有人可以为我解剖这一切吗?

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];
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

对于xOffset >> 3种类的东西,似乎他只是试图除以8(并且不知道如何制作可读代码)。至于他为什么要掩盖除了最后3个以外的所有比特,我不能不知道更多关于代码的事情。

答案 1 :(得分:0)

这可能会有所帮助:

  • y >> 3相当于y / 8向下舍入;它会将所有内容移动到最后三位。
  • y * 8相当于y << 3。打败我为什么他们两人之间没有保持一致。
  • y & 7相当于y % 8;它只保留最后三位。

您在说明中未提及sheet,但看起来您正在使用64像素乘64像素的地图上的8像素×8像素的“图块”。有一点可能有帮助的是重构工具 - 看看你是否可以提取一些有意义的方法。