Привет всем и спасибо за чтение,
У меня карта инициализирована следующим образом:
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;
}