Разработка игры. Многократное копирование изображения - 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); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д