在 swing 中拆分 Tilemap 图像

Splitting Tilemap Image in swing

我在尝试拆分 tilemap 以绘制到 JPanel 时遇到了一些奇怪的事情。首先这是一段相关的代码:

private void drawTile(Graphics g,MapController mc,int gid){
    int cols = mc.getMap().getTileset().getColumns();
    int x = (gid % cols);

    int y = gid / cols;
    int tilewidth = mc.getTilewidth();
    int tileheight = mc.getTileheight();
    int dx1 = 0;
    int dx2 = dx1+tilewidth;
    int dy1 = 0;
    int dy2 = dy1+tileheight;
    int sx1 = (x)*tilewidth;
    int sx2 = sx1+tilewidth;
    int sy1 = y*tileheight;
    int sy2 = sy1+tileheight;
    g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null);

}

这是在遍历地图上的图层并将每个图块绘制到面板的循环内。当我 运行 我的程序时,它大部分工作正常,但我意识到 x 轴偏离了 1 "tile width" (32px)。这是我得到的输出:

除了瓷砖在 x 轴上全部偏离 32 像素之外,这或多或少应该是这样的

我很确定这是因为我正在将 CSV 转换为 int[] 并且索引从 0 开始,但我的网格从 1 开始。容易解决吗?只需从我的 x 值中减去 1,即可将我的源图像的 sx1 向左移动 32px。

修改后的代码:

private void drawTile(Graphics g,MapController mc,int gid){
    int cols = mc.getMap().getTileset().getColumns();

    int x = (gid % cols)-1; //notice the -1

    int y = gid / cols;
    int tilewidth = mc.getTilewidth();
    int tileheight = mc.getTileheight();
    int dx1 = 0;
    int dx2 = dx1+tilewidth;
    int dy1 = 0;
    int dy2 = dy1+tileheight;
    int sx1 = x*tilewidth;
    int sx2 = sx1+tilewidth;
    int sy1 = y*tileheight;
    int sy2 = sy1+tileheight;
    g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null);

}

现在当我 运行 它时,我得到了这个:

我输入了一些故障排除行,看起来我为源图像发送的坐标是正确的。我什至尝试过:

g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1-32, sy1, sx2, sy2,     null);

我尝试过的所有方法都得到了相同的结果。 这里有什么我想念的吗?

解决了! CSV 中的一些 GID 为 0 到透明图块。当您对 sx1 位置进行数学运算然后减去 1 时,您最终得到 -1 作为 sx1。显然 awt Graphics 不喜欢这样,所以它不渲染任何东西,而不是渲染透明的图块。那是事情开始变得不稳定的时候。有趣的是,我使用 JavaFX 开始这个项目,但决定改用 swing。我在 FX 中使用相同的逻辑进行绘图,但没有出现此问题。这是有效的代码:

private void drawTile(Graphics g,MapController mc,int gid){
    int cols = mc.getMap().getTileset().getColumns();

    int x = (gid % cols)-1; 
    if(x<0){x=0};
    int y = gid / cols;
    int tilewidth = mc.getTilewidth();
    int tileheight = mc.getTileheight();
    int dx1 = 0;
    int dx2 = dx1+tilewidth;
    int dy1 = 0;
    int dy2 = dy1+tileheight;
    int sx1 = x*tilewidth;
    int sx2 = sx1+tilewidth;
    int sy1 = y*tileheight;
    int sy2 = sy1+tileheight;
    g.drawImage(mc.getSpriteImage(), dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2,      null);

}