在屏幕上绘制图块的算法

时间:2015-06-08 21:04:42

标签: java algorithm graphics 2d

我几天来一直在努力解决这个问题,而我自己也无法解决这个问题。

我有一个Minecraft 2D游戏。块被分为64 * 64块的块。

我有这个绘图功能:

@Override
protected void gameDraw(Graphics2D g) {
    g.drawImage(Texture.getImage("background"), 0, 0, 800, 600, 0, 0, 800, 600, null);

    int pixelXMin = (int) (screenX);
    int pixelYMin = (int) (screenY);
    int pixelXMax = (int) (canvas.getWidth() + screenX);
    int pixelYMax = (int) (canvas.getHeight() + screenY);

    int blockXMin = pixelXMin / Block.BLOCK_PIXEL_WIDTH;
    int blockYMin = pixelYMin / Block.BLOCK_PIXEL_HEIGHT;
    int blockXMax = pixelXMax / Block.BLOCK_PIXEL_WIDTH;
    int blockYMax = pixelYMax / Block.BLOCK_PIXEL_HEIGHT;

    int diffX = pixelXMin % Block.BLOCK_PIXEL_WIDTH;
    int diffY = pixelYMin % Block.BLOCK_PIXEL_HEIGHT;

    for (int bx = blockXMin; bx < blockXMax; bx++) {
        for (int by = blockYMin; by < blockYMax; by++) {

            int chunkNum = bx / Chunk.COLUMNS_IN_CHUNK;
            int blockX = bx % Chunk.COLUMNS_IN_CHUNK;
            int blockY = by % Chunk.COLUMNS_IN_CHUNK;

            Chunk chunk = level.loadChunk(chunkNum);
            Block block = chunk.getBlock(blockX, blockY);

            if (block == null) { continue; }
            BlockData blockData = block.getBlockData();
            if (blockData.getType().getTextureName().equals("")) { continue; }

            int blockPosX = canvas.getWidth() - (bx * Block.BLOCK_PIXEL_WIDTH + diffX);
            int blockPosY = canvas.getHeight() - (by * Block.BLOCK_PIXEL_HEIGHT + diffY);

            BufferedImage image = Texture.getImage(blockData.getType().getName());

            g.drawImage(image, blockPosX, blockPosY, Block.BLOCK_PIXEL_WIDTH, Block.BLOCK_PIXEL_HEIGHT, null);
        }
    }
}

在这里,我尝试使用变量screenXscreenY作为“摄像机位置”来计算屏幕上的最大和最小像素数。然后我循环遍历这些像素内的每个块。

其余的有点自我解释。

现在出现问题: enter image description here 正如您所看到的,游戏画得很好,但是当您更改screenXscreenY的值时,块的“框”会移动到屏幕上,但块会保持在同一位置。

我该如何解决这个问题?谢谢!

链接到.jar文件和完整源代码的Dropbox下载。 gameDraw()位于CubeExplorer.java中 https://www.dropbox.com/sh/madienlwmhjt2wh/AADA83aKa00j5UFowhotfmmaa?dl=0

这是我的解决方案:

@Override
protected void gameDraw(Graphics2D g) {
    g.drawImage(Texture.getImage("background"), 0, 0, 800, 600, 0, 0, 800, 600, null);

    int x = (int) (screenX / Block.BLOCK_PIXEL_WIDTH);
    int y = (int) (screenY / Block.BLOCK_PIXEL_HEIGHT); 

    int blockXMin = x;
    int blockYMin = y;

    int blockXMax = x + canvas.getWidth() / Block.BLOCK_PIXEL_WIDTH + 2;
    int blockYMax = y + canvas.getWidth() / Block.BLOCK_PIXEL_WIDTH + 2;

    System.out.println(x + "," + y + "    " + blockXMax + "," + blockYMax);

    for(int blockX = blockXMin; blockX < blockXMax; blockX++) {
        for(int blockY = blockYMin; blockY < blockYMax; blockY++) {

            int chunkX = blockX / Chunk.COLUMNS_IN_CHUNK;
            Chunk chunk = level.loadChunk(chunkX);

            int blockChunkPosX = blockX % Chunk.COLUMNS_IN_CHUNK;
            int blockChunkPosY = blockY % Chunk.ROWS_IN_CHUNK;
            Block block = chunk.getBlock(blockChunkPosX, blockChunkPosY);

            if (block == null) { continue; }
            BlockData blockData = block.getBlockData();
            if (blockData.getType().getTextureName().equals("")) { continue; }

            int blockScreenLocX = (int) ((int) + blockX * Block.BLOCK_PIXEL_WIDTH - screenX);
            int blockScreenLocY = 600 - (int) ((int) + blockY * Block.BLOCK_PIXEL_HEIGHT - screenY);

            BufferedImage image = Texture.getImage(blockData.getType().getName());
            g.drawImage(image, blockScreenLocX, blockScreenLocY, Block.BLOCK_PIXEL_WIDTH, Block.BLOCK_PIXEL_HEIGHT, null);

        }    
    }
}

0 个答案:

没有答案