Разработка игры. Многократное копирование изображения - Java

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Проблема следующая: при перемещении изображения оно оставляет след из своих многочисленных копий наложенных друг на друга. При этом вместе с этим компонентом перемещаются все изображения на экране и также оставляют за собой многочисленные копии наложенные друг на друга. Ниже привожу код:
Листинг программы
  1. package viewPG;
  2. import java.awt.image.*;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. import java.io.File;
  6. import javax.imageio.ImageIO;
  7. import modelPG.mapPG.MapObject;
  8. import modelPG.Model;
  9. class Map extends JPanel{
  10. private int width;
  11. private int height;
  12. private int countCellInRow;
  13. private int countCellInColumn;
  14. private Image[][] images;
  15. private Model model;
  16. Map(Model model) {
  17. this.model = model;
  18. this.width = model.getWidthMap();
  19. this.height = model.getHeightMap();
  20. this.countCellInRow = model.getCountCellInRow();
  21. this.countCellInColumn = model.getCountCellInColumn();
  22. setSize(width, height);
  23. images = new Image[countCellInColumn][countCellInRow];
  24. assembleMap();
  25. }
  26. //Часть кода пропущена
  27. public void paintComponent(Graphics g) {
  28. for(int y = 0; y < countCellInColumn; y++) {
  29. for(int x = 0; x < countCellInRow; x++) {
  30. if(images[y][x] != null) {
  31. int pozX = model.getCellInRowAndColumn(x, y).CENTER_X
  32. - images[y][x].getWidth(null) / 2;
  33. int pozY = model.getCellInRowAndColumn(x, y).CENTER_Y
  34. - images[y][x].getHeight(null);
  35. g.drawImage(images[y][x], pozX, pozY, null);
  36. }
  37. }
  38. }
  39. }
  40. }
Перемещаю я вот этот компонент:
Листинг программы
  1. package viewPG;
  2. import java.awt.image.*;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. import java.io.File;
  6. import javax.imageio.ImageIO;
  7. import modelPG.IMove;
  8. import modelPG.Model;
  9. class Person extends JPanel implements IMove{
  10. private Image image;
  11. Person(Model model) {
  12. try {
  13. image = ImageIO.read(new File(View.path + "wizard.png"));
  14. } catch(Exception e) {
  15. }
  16. setSize(model.getWidthPerson(), model.getHeightPerson());
  17. model.addMoveListener(this);
  18. }
  19. public void paintComponent(Graphics g) {
  20. g.drawImage(image, 0, 0, null);
  21. }
  22. //метод ниже вызывается из другого потока. Он и ответственен за перемещение компонента.
  23. public void newPoz(int x, int y) {
  24. setLocation(x, y);
  25. }
  26. }
Листинг программы
  1. package viewPG;
  2. import java.awt.image.*;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. import java.io.File;
  6. import javax.imageio.ImageIO;
  7. import modelPG.Model;
  8. public class View extends JPanel{
  9. private Model model;
  10. private Container container;
  11. private Map map;
  12. private Person person;
  13. static String path = "D:/JAVA/myExperiments/graphicsPG/mapPG/src/graphicsPG/";
  14. public View(Model model, Container container) {
  15. this.model = model;
  16. this.container = container;
  17. map = new Map(model);
  18. person = new Person(model);
  19. container.add(map);
  20. container.add(person);
  21. }
  22. }
Думал, что причина ошибки в в том, что метод
Листинг программы
  1. public void newPoz(int x, int y) {
  2. setLocation(x, y);
  3. }
делает обновление компонента не из swing потока. Переписал так:
Листинг программы
  1. public void newPoz(int x, int y) {
  2. SwingUtilities.invokeLater(new Runnable() {
  3. public void run() {
  4. setLocation(x, y);
  5. }
  6. });
  7. }
Однако проблемы остались, ничего не изменилось. Скажите пожалуйста - что я ещё не учёл?
Решил проблему с перемещением всех объектов: убрал менеджер компоновки. Теперь перемещается только экземпляр класса Person. Однако проблема с остающимся после него следа из наслоенных копий осталась.

Решение задачи: «Разработка игры. Многократное копирование изображения»

textual
Листинг программы
  1.     public void paintComponent(Graphics g) {
  2.         super.paintComponent(g);
  3.         g.drawImage(image, 0, 0, null);
  4.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.214 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут