前提・実現したいこと
簡単なレースゲーム(と言ってもまだレの字もないですが)を作成している途中です。
View.java内のfillRectの位置に自分のPCのデスクトップにある画像を表示させたいです。
次のサイトを参考にして以下のようにView.javaを書きました。しかし、表示されません。
【Java】ウィンドウに画像を描画する
なぜこの書き方だとうまくいかないのでしょうか?またどのように直せば良いのでしょうか?
MVCモデルを元に作成しています。
よろしくお願いします。
作成したコード
ビュー
Java
1/*--- View.java ---*/ 2import javax.swing.*; 3import java.awt.*; 4import java.awt.event.*; 5import java.util.*; 6 7// ビュー(モデルが変化したら自動で画面を書き換える) 8class View extends JPanel implements Observer { 9 private Model model; 10 11 public View(Model model, Controller cont) { 12 this.model = model; 13 this.model.addObserver(this); 14 this.addKeyListener(cont); 15 this.setFocusable(true); //キー入力を受け付けるため 16 } 17 public void paintComponent(Graphics g) { 18 super.paintComponent(g); 19 model.draw(g); // 車を描画 20 drawItem(g); 21 } 22 public void update(Observable o, Object arg) { 23 this.repaint(); 24 } 25 26 private void drawItem(Graphics g) { 27 String item; 28 Image img; 29 g.setColor(Color.BLUE); 30 g.fillRect(400, 0, 100, 100); 31 g.fillOval(99, 99, 4, 4); // アイテムの表示切り替わりの目印 32 g.fillOval(400, 400, 50, 50); // ワープポイントの目印 33 int n = model.return_item(model.getX(), model.getY()); 34 if(n == 0) { 35 item = "0"; 36 img = Toolkit.getDefaultToolkit().getImage("ダッシュキノコ.jpeg"); 37 Font font = new Font("Arial", Font.BOLD, 30); 38 g.setColor(Color.RED); 39 g.setFont(font); 40 } else { 41 item = "1"; 42 img = Toolkit.getDefaultToolkit().getImage("ダッシュキノコ.jpeg"); 43 Font font = new Font("Arial", Font.BOLD, 30); 44 g.setColor(Color.RED); 45 g.setFont(font); 46 } 47 g.drawString(item, 420, 50); 48 //g.drawImage(img, 400, 0, 100, 100, this); 49 } 50} 51 52
コントローラ
Java
1/*---Controller.java ---*/ 2import javax.swing.*; 3import java.awt.*; 4import java.awt.event.*; 5 6// コントローラ(キー入力) 7class Controller implements KeyListener { 8 protected Model model; 9 protected boolean fwd = false; // Fキー(前進)の入力履歴 10 11 public Controller(Model model) { 12 this.model = model; 13 } 14 15 CarController carcontroller = new CarController(); 16 UseItem useitem = new UseItem(); 17 public void keyPressed(KeyEvent e) { 18 carcontroller.keyPressed(e); 19 useitem.keyPressed(e); 20 } 21 public void keyTyped(KeyEvent e) { 22 carcontroller.keyTyped(e); 23 useitem.keyTyped(e); 24 } 25 public void keyReleased(KeyEvent e) { 26 carcontroller.keyReleased(e); 27 useitem.keyReleased(e); 28 } 29 30 class CarController implements KeyListener{ 31 public void keyPressed(KeyEvent e) { 32 /* この記述だとカーブ後にFキーを押し直さないと前進できない */ 33 int key = e.getKeyCode(); 34 35 if(key == KeyEvent.VK_F) { 36 model.accel(10, 10); 37 model.warp(-100, -100); // ワープに入ると移動する 38 fwd = true; 39 } 40 else if(key == KeyEvent.VK_RIGHT) { 41 model.right(); // 右に方向転換 42 if(fwd == true) { 43 model.right(); 44 model.accel(10, 10); // アクセルを踏みながら右に曲がる 45 } 46 } else if(key == KeyEvent.VK_LEFT) { 47 //model.new CarMovement().left(); // 左に方向転換 48 model.left(); 49 if(fwd == true) { 50 model.left(); 51 model.accel(10, 10); // アクセルを踏みながら左に曲がる 52 } 53 } 54 } 55 public void keyReleased(KeyEvent e) { 56 int key = e.getKeyCode(); 57 58 if(key == KeyEvent.VK_F) { 59 fwd = false; // Fキーの入力が止まったら前進の履歴をfalseに 60 } 61 } 62 public void keyTyped(KeyEvent e) {} 63 } 64 65 class UseItem implements KeyListener { 66 public void keyPressed(KeyEvent e) { 67 68 int key = e.getKeyCode(); 69 int item = model.return_item(model.getX(), model.getY()); // item[ 0:ダッシュ, 1:弾 70 boolean canuse = true; 71 72 if(key == KeyEvent.VK_A) { 73 canuse = false; 74 if(item == 0) { 75 model.dash(30, 30); 76 } else if(item == 1) { 77 //model.launcher(); //まだない 78 } 79 } 80 81 } 82 83 public void keyReleased(KeyEvent e) {} 84 public void keyTyped(KeyEvent e) {} 85 86 } 87}
モデル
Java
1/*--- Model.java ---*/ 2 3import javax.swing.*; 4import java.awt.*; 5import java.awt.geom.*; // 図形の回転に必要 6import java.util.*; 7 8// モデル(車の位置・角度の管理) 9class Model extends Observable { 10 private int w, h; // 画面の大きさ 11 private int x = 25; // 車の中心のX座標 12 private int y = 25; // 車の中心のY座標 13 private int angle = 0; // 車の角度(0:右、正の値:右回転) 14 protected int speed_x = 0, speed_y = 0; 15 private Road road = new Road(); 16 17 public Model(int w, int h) { 18 this.w = w; 19 this.h = h; 20 } 21 22 23 /*--------------- 車の動きの制御 -------------------*/ 24 25 public void moveFwd(int fwd_x, int fwd_y) { 26 // 角度に応じてちょっと進む 27 double x2 = x + fwd_x * Math.cos(Math.toRadians(angle)); 28 double y2 = y + fwd_y * Math.sin(Math.toRadians(angle)); 29 // 当たり判定 30 if (road.inside(x2, y2)) { 31 // 移動後の車が道路上だったら状態を更新 32 x = (int)x2; 33 y = (int)y2; 34 setChanged(); 35 notifyObservers(); 36 } 37 } 38 39 public void right() { 40 angle += 10; // 右回転 41 if (angle > 180) {angle -= 360;} 42 setChanged(); 43 notifyObservers(); 44 } 45 46 public void left() { 47 angle -= 10; // 左回転 48 if (angle <= -180) {angle += 360;} 49 setChanged(); 50 notifyObservers(); 51 } 52 public void accel(int accel_x, int accel_y) { 53 speed_x = accel_x; 54 speed_y = accel_y; 55 moveFwd(speed_x, speed_y); 56 } 57 58 public int getX() { return x; } 59 public int getY() { return y; } 60 61 /*----------------- アイテムまわり --------------------*/ 62 63 public int return_item(int x, int y) { // とりあえず、100 <= x, 100 <= y の場所にいる時にコロコロ変わる 64 int n = 0; 65 if((x >= 100) && (y >= 100)) { 66 n = item(); 67 } 68 return n; 69 } 70 71 private int item() { 72 double r = Math.random(); 73 if((0 <= r) && (r <= 0.5)) { 74 return 1; 75 } else { 76 return 0; 77 } 78 } 79 80 public void dash(int x, int y) { 81 accel(x, y); 82 } 83 84 85 /*-------------------- ギミックまわり ------------------------*/ 86 87 public void warp(int warp_x, int warp_y){ 88 if(x >= 400 && x <= 450 && y >= 400 && y <= 450){ 89 moveFwd(warp_x, warp_y); 90 } 91 } 92 93 94 95 96 public void draw(Graphics g) { 97 // 図形を回転させる処理 98 Graphics2D g2 = (Graphics2D)g; 99 AffineTransform at = g2.getTransform(); 100 at.setToRotation(Math.toRadians(angle), x, y); 101 g2.setTransform(at); 102 g2.setColor(Color.red); 103 g2.fillRect(x - 10, y - 5, 20, 10); 104 105 at.setToIdentity(); 106 g2.setTransform(at); 107 108 road.draw(g); // 道路を描画 109 } 110 public int getW() {return w;} 111 public int getH() {return h;} 112}
Java
1//Road.java 2 3import javax.swing.*; 4import java.awt.*; 5import java.util.*; 6 7class Road { 8 private ArrayList<Shape> shapes; // 図形の集合 9 // Shapeインターフェイスを実装している図形を登録可能 10 11 public Road() { 12 shapes = new ArrayList<Shape>(); 13 // 図形を追加 14 shapes.add(new Rectangle( 10, 10,250, 30)); 15 shapes.add(new Rectangle(230, 10, 30,250)); 16 shapes.add(new Rectangle(230,230,250, 30)); 17 shapes.add(new Rectangle(450,230, 30,250)); 18 shapes.add(new Rectangle( 10,450,470, 30)); 19 shapes.add(new Rectangle( 10, 10, 30,470)); 20 } 21 public void draw(Graphics g) { 22 g.setColor(new Color(100, 100, 100, 50)); 23 Graphics2D g2 = (Graphics2D)g; 24 25 for (Shape shape: shapes) { 26 g2.fill(shape); 27 } 28 } 29 public boolean inside(double x, double y) { 30 for (Shape shape: shapes) { 31 if (shape.contains(x, y)) { 32 return true; 33 } 34 } 35 return false; 36 } 37}
###参考にさせてもらったコード
Java
1import java.awt.*; 2import javax.swing.*; 3 4public class Test{ 5 public static void main(String[] args) { 6 GameWindow gw = new GameWindow("テストウィンドウ",400,300); 7 DrawCanvas dc = new DrawCanvas(); 8 gw.add(dc); 9 gw.setVisible(true); 10 } 11} 12class GameWindow extends JFrame{ 13 14 public GameWindow(String title, int width, int height) { 15 super(title); 16 setDefaultCloseOperation(EXIT_ON_CLOSE); 17 setSize(width,height); 18 setLocationRelativeTo(null); 19 //gw.setResizable(false); // この記述がコンパイル通らないのでコメントアウトしました 20 } 21} 22class DrawCanvas extends JPanel{ 23 Image img = Toolkit.getDefaultToolkit().getImage("ダッシュキノコ.jpeg"); 24 public void paintComponent(Graphics g) { 25 super.paintComponent(g); 26 //画像の表示 27 g.drawImage(img, 0, 0, 100, 100, this); 28 } 29}
モデルなど気にせず、まず最低限必要な機能・クラスを設計して作成しては如何でしょうか。
ざっくり見る限り、"モデル" を意識する以前に構造なりクラス(オブジェクト)関係なりをもう少し意識されたほうが良いように思えます。
回答2件
あなたの回答
tips
プレビュー