你好,谢谢阅读,
我的地图初始化如下:
static HashMap<Point, Tile> map = new HashMap<Point, Tile>();
Tile是一个小类,其中包含一个图像和一个名为addFloor(int tileCode)
的函数:
class Tile {
BufferedImage img;
int imgHeight, imgWidth;
public Tile(BufferedImage img) {
this.img = img;
imgHeight = img.getHeight();
imgWidth = img.getWidth();
}
public Tile addFloor(int tileCode) {
BufferedImage newImg = Helper.joinBufferedImageFloor(this.img, Map.buildings.get(tileCode).img);
Tile newTile = new Tile(newImg);
return newTile;
}
}
addFloor(int tileCode)
函数只是将由另一张地图通过tileCode
获得的图像作为键(Map只是保存Tiles地图和资产图像地图的另一个类,还有一些不重要的函数暂时)在平铺图片(this.img
)上并带有偏移量。
(您是否仍在我身边,还是我需要提供更多信息?)
现在:
Tile tileDebug = Map.map.get(new Point(10, 10));
Map.map.replace(new Point(10, 10), Map.map.get(new Point(10, 10)).addFloor(tileCode)); //I've also tried map.put()
tileDebug = Map.map.get(new Point(10, 10)); //MARK 1
panel.repaint();
我通过eclipse调试器进行了检查,并检查了addFloor(int tileCode)
函数是否分开:
-addFloor(int tileCode)
函数可完美运行。它会创建一个新图像,并返回带有正确图像的全新Tile。
-使用调试器,我看到Tile进行了更新,它更改了其图像,并且现在具有另一个哈希(与addFloor(int tileCode)
返回的哈希相同)。
-当前paintComponent(Graphics g)
函数仅对drawMap(Graphics2D g2d)
进行了一次调用,从而逐块绘制Tile。
-自map.replace()
调用以来,地图尚未编辑。
private void drawMap(Graphics2D g2d) {
if (map != null) {
for (int y = 1; y <= 100; y++) {
for (int x = 1; x <= 100; x++) {
Tile currentTile = Map.map.get(new Point(x, y)); //MARK 2
if (x == 10 && y == 10) {
//This line is just so I can add a breakpoint to debug the tile currentTile
System.out.println("");
} //Unimportant from here, just positioning and drawing, that works perfectly
int dx = 350, dy = 0;
dx += Main.viewX;
dy += Main.viewY;
int posX, posY;
posX = (int) ((x * 64 + y * -64));
posY = (int) ((x * 32 + y * 32));
posX -= currentTile.imgWidth;
posY -= currentTile.imgHeight;
g2d.drawImage(currentTile.img, posX + dx, posY + dy, this);
}
}
}
}
问题在于绘制的图块不是旧的图块,不是addFloor(int tileCode)
返回的图块。绘制的图块是一个新的图块,具有自己的哈希值和图像。绘制的图像是传递到joinBufferedImageFloor(BufferedImage img1, BufferedImage img2)
的第二张图像(通过tileCode
中的addFloor(int tileCode)
获得的图像。
我从//MARK 1
到//MARK 2
都遵循了整个程序,但是地图从未得到明确编辑,而是返回值
Map.map.get(new Point(10, 10))
从正确的图块(MARK 1)更改为第三个图块(MARK 2)
是因为地图是静态的吗? (注意:只有2个线程显式地编辑Map,Main Thread和KeyListener Thread,但是在此用例中不涉及该线程) 怎么了 我对Java Map是否有误?
任何帮助先感谢您
发布1分钟后进行编辑: 我认为我在这里和那里描述的有点混乱,因此请提出任何可能在此描述中未回答的问题。 希望我也可以为您提供完整的项目设置等...
几个小时后编辑: 根据StackOverflow的“如何提问”部分编辑了问题
编辑对joinBufferedImageFloor(BufferdImage img1, BufferedImage img2)
函数感兴趣的人:
public static BufferedImage joinBufferedImageFloor(BufferedImage img1, BufferedImage img2) {
int offsetX = 16;
int offsetY = -32;
int width = img1.getWidth();
int height = img1.getHeight() - offsetY;
BufferedImage newImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = newImage.createGraphics();
Color oldColor = g2.getColor();
g2.setColor(Color.BLACK);
g2.fillRect(0, 0, width, height);
g2.setColor(oldColor);
g2.drawImage(img1, null, 0, -offsetY);
g2.drawImage(img2, null, offsetX, 0);
g2.dispose();
return newImage;
}