Java 在swing中拆分Tilemap图像
我在尝试拆分tilemap以绘制JPanel时发生了一些奇怪的事情。首先,这是一段相关的代码: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()
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上尝试过)也许你将一个东西画在另一个上面,然后一些东西就不再可见了。