Java静态地图不会在其他类中更新

时间:2018-11-26 12:31:16

标签: java image static maps

你好,谢谢阅读,

我的地图初始化如下:

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

0 个答案:

没有答案