статическая карта Java не обновляется в другом классе - PullRequest
0 голосов
/ 26 ноября 2018

Привет всем и спасибо за чтение,

У меня карта инициализирована следующим образом:

    static HashMap<Point, Tile> map = new HashMap<Point, Tile>();

a 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 - это просто еще один класс, который содержит карту плиток и карты изображений активов, а такженекоторые неважные функции на данный момент) поверх изображения Tile (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) работает отлично.Он создает новое изображение и возвращает совершенно новую плитку с правильным изображением.

- используя отладчик, я увидел, что плитка обновлена, она изменила свой образ и теперь имеет другой хэш (такой же, как и в addFloor(int tileCode)).

-В настоящее время функция paintComponent(Graphics g) имеет только один вызов drawMap(Graphics2D g2d), который рисует Tile by 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 потока явно редактируют карту, основной поток и поток KeyListener, но в этом случае использования этот поток не участвовал) Что здесь не так? Я получаю что-то не так в Java Maps?

Спасибо за любую помощь, спасибо заранее

Отредактируйте 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...