実現したいこと
現在,javaswingでの描画処理の勉強をしてテストプログラムを作っています。
コントローラークラスで、描画するオブジェクトの計算をし、imageインスタンスにグラフィックの情報を代入しています。そして、frameにそれを引数としてわたし、repaintメソッドを呼び出しています。
実行すると描画自体はされているのですが、
これまでに描画していた、画像をがrepaintメソッドを呼び出しても、
描画されてしまっています。
適切に実装するにはどのようにすればよいのでしょうか。
該当のソースコード
java
1package TestRpgWalk; 2 3public class TestArpgWalk { 4public static void main(String[] args) { 5 new GameController(); 6} 7}
java
1package TestRpgWalk; 2 3import java.awt.Color; 4import java.awt.Graphics; 5import java.awt.Image; 6import java.awt.Point; 7 8public class GameController { 9 MainJFrame mainJFrame = null; 10 Image image = null; 11 Enemy enemy = new Enemy(); 12 Hero hero = new Hero(); 13 14 public GameController() { 15 mainJFrame = new MainJFrame(); 16 image = mainJFrame.createImage(mainJFrame.getWidth(), mainJFrame.getHeight()); 17 Thread thread = new Thread(new GameLoop()); 18 thread.start(); 19 } 20 21 class GameLoop implements Runnable { 22 boolean isGame = true; 23 24 @Override 25 public void run() { 26 init(); 27 while (isGame == true) { 28 logic(); 29 draw(); 30 try { 31 Thread.sleep(20); 32 } catch (InterruptedException e) { 33 // TODO 自動生成された catch ブロック 34 e.printStackTrace(); 35 } 36 } 37 } 38 39 public void init() { 40 enemy.init(); 41 hero.init(); 42 } 43 44 public void logic() { 45 enemy.move(); 46 hero.move(); 47 } 48 49 public void draw() { 50 Graphics g = image.getGraphics(); 51 g.setColor(Color.blue); 52 g.fillOval(enemy.point.x, enemy.point.y, 30, 30); 53 mainJFrame.draw(image); 54 } 55 56 } 57} 58 59class Character { 60 Point point = new Point(); 61 62 public void move() { 63 point.x++; 64 point.y++; 65 } 66} 67 68class Hero extends Character { 69 public void init() { 70 point.setLocation(20, 20); 71 } 72} 73 74class Enemy extends Character { 75 public void init() { 76 point.setLocation(50, 50); 77 } 78}
java
1package TestRpgWalk; 2 3import java.awt.Graphics; 4import java.awt.Image; 5 6import javax.swing.JFrame; 7 8public class MainJFrame extends JFrame { 9 Image image =null; 10 public MainJFrame() { 11setDefaultCloseOperation(EXIT_ON_CLOSE); 12setSize(600,600); 13setLocationRelativeTo(null); 14setTitle("Title"); 15setVisible(true); 16 } 17 public void paint(Graphics graphics) { 18 graphics.drawImage(image, 0, 0, this); 19 } 20 public void draw(Image image) { 21 this.image = image; 22 repaint(); 23} 24}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。