Разработка игры. Многократное копирование изображения - Java
Формулировка задачи:
Доброго времени суток.
Проблема следующая: при перемещении изображения оно оставляет след из своих многочисленных копий наложенных друг на друга. При этом вместе с этим компонентом перемещаются все изображения на экране и также оставляют за собой многочисленные копии наложенные друг на друга. Ниже привожу код:
Перемещаю я вот этот компонент:
делает обновление компонента не из swing потока. Переписал так:
Однако проблемы остались, ничего не изменилось. Скажите пожалуйста - что я ещё не учёл?
package viewPG;
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
import java.io.File;
import javax.imageio.ImageIO;
import modelPG.mapPG.MapObject;
import modelPG.Model;
class Map extends JPanel{
private int width;
private int height;
private int countCellInRow;
private int countCellInColumn;
private Image[][] images;
private Model model;
Map(Model model) {
this.model = model;
this.width = model.getWidthMap();
this.height = model.getHeightMap();
this.countCellInRow = model.getCountCellInRow();
this.countCellInColumn = model.getCountCellInColumn();
setSize(width, height);
images = new Image[countCellInColumn][countCellInRow];
assembleMap();
}
//Часть кода пропущена
public void paintComponent(Graphics g) {
for(int y = 0; y < countCellInColumn; y++) {
for(int x = 0; x < countCellInRow; x++) {
if(images[y][x] != null) {
int pozX = model.getCellInRowAndColumn(x, y).CENTER_X
- images[y][x].getWidth(null) / 2;
int pozY = model.getCellInRowAndColumn(x, y).CENTER_Y
- images[y][x].getHeight(null);
g.drawImage(images[y][x], pozX, pozY, null);
}
}
}
}
}package viewPG;
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
import java.io.File;
import javax.imageio.ImageIO;
import modelPG.IMove;
import modelPG.Model;
class Person extends JPanel implements IMove{
private Image image;
Person(Model model) {
try {
image = ImageIO.read(new File(View.path + "wizard.png"));
} catch(Exception e) {
}
setSize(model.getWidthPerson(), model.getHeightPerson());
model.addMoveListener(this);
}
public void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, null);
}
//метод ниже вызывается из другого потока. Он и ответственен за перемещение компонента.
public void newPoz(int x, int y) {
setLocation(x, y);
}
}package viewPG;
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
import java.io.File;
import javax.imageio.ImageIO;
import modelPG.Model;
public class View extends JPanel{
private Model model;
private Container container;
private Map map;
private Person person;
static String path = "D:/JAVA/myExperiments/graphicsPG/mapPG/src/graphicsPG/";
public View(Model model, Container container) {
this.model = model;
this.container = container;
map = new Map(model);
person = new Person(model);
container.add(map);
container.add(person);
}
}
Думал, что причина ошибки в в том, что метод
public void newPoz(int x, int y) {
setLocation(x, y);
} public void newPoz(int x, int y) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setLocation(x, y);
}
});
}
Решил проблему с перемещением всех объектов: убрал менеджер компоновки. Теперь перемещается только экземпляр класса Person. Однако проблема с остающимся после него следа из наслоенных копий осталась.
Решение задачи: «Разработка игры. Многократное копирование изображения»
textual
Листинг программы
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, null);
}