Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在swing中拆分Tilemap图像_Java_Image Processing_Drawimage - Fatal编程技术网

Java 在swing中拆分Tilemap图像

Java 在swing中拆分Tilemap图像,java,image-processing,drawimage,Java,Image Processing,Drawimage,我在尝试拆分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()

我在尝试拆分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“瓷砖宽度”(32px)。这是我得到的输出:

这或多或少是它应该看起来的样子,除了瓷砖在x轴上都是32px

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

修订守则:

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);

}
private void drawTile(图形g、地图控制器mc、int gid){
int cols=mc.getMap().getTileset().getColumns();
int x=(gid%cols)-1;

如果(x“只需从我的x值中减去1”-为什么不从
gid
中选择主题
1
?更改gid也会影响Y轴。只有x轴处于禁用状态。gid与CSV文件中的内容匹配。(我在alread上尝试过)也许你将一个东西画在另一个上面,然后一些东西就不再可见了。