二個のボールを同時に動かすアニメーションのプログラムを作ってみたのですが、実行しても一つしか表示されず、ballExが反映されていないようです。なぜ一つだけしか動かないのか、もし分かれば教えてください。
PinBall
1import java.awt.BorderLayout; 2import java.awt.FlowLayout; 3import java.awt.Graphics; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6import java.awt.Container; 7 8import javax.swing.JFrame; 9import javax.swing.JPanel; 10import javax.swing.Timer; 11import javax.swing.JButton; 12import javax.swing.JLayeredPane; 13 14public class PinBall { 15 public static void main(String[] args) { 16 JFrame window = new JFrame("PinBall"); 17 window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 18 window.setSize(650, 400); 19 20 21 Panel4GameBoard panel = new Panel4GameBoard(); 22 window.add(panel); 23 window.setVisible(true); 24 25 panel.animationStart(); 26 27 28 } 29} 30 31class PanelGameBoard extends JPanel implements ActionListener { 32 private final Ball ball; 33 private final Timer timer; 34 private Ball ballEx; 35 36 JButton button = new JButton("上から落とす"); 37 // 再描画タイミング 38 private static final int INTERVAL = 50; 39 40 public Panel4GameBoard() { 41 timer = new Timer(INTERVAL, this); 42 ball = new Ball(this); 43 ballEx = new Ball(this); 44 ballEx.setX(200); 45 ballEx.setY(100); 46 this.add(button); 47 button.addActionListener(this); 48 } 49 50 public void animationStart() { 51 ball.goHome(); 52 timer.start(); 53 } 54 55 @Override 56 public void paintComponent(Graphics graphics) { 57 super.paintComponent(graphics); 58 ball.draw(graphics); 59 } 60 61 @Override 62 public void actionPerformed(ActionEvent event) { 63 ball.next(); 64 repaint(); 65 if(event.getSource() == button){ 66 ball.setY(0); 67 ballEx.setY(0); 68 } 69 } 70 71 72}
ball
1import java.awt.Color; 2import java.awt.Graphics; 3 4import javax.swing.JPanel; 5 6public class Ball { 7 // ボールの半径 8 private double r = 10.0; 9 10 // ボールの中心座標 11 private double x = 0.0; 12 private double y = 0.0; 13 14 // ボールの速度(1フレーム当たりの移動距離) 15 private double vx = 15.0; 16 private double vy = -15.0; 17 18 // ボールの色 19 private Color color = Color.BLACK; 20 21 // y軸 正の方向の加速度(1フレーム当たりの上記「速度」の変化量) 22 private double g = 0.5; 23 24 // 反発係数 25 private double e = 0.8; 26 27 // ボールを描画するパネル 28 private JPanel panel; 29 30 public Ball(JPanel panel) { 31 this.panel = panel; 32 } 33 34 public Ball(double r, double x, double y, double vx, double vy, Color color, JPanel panel) { 35 this.r = r; 36 this.x = x; 37 this.y = y; 38 this.vx = vx; 39 this.vy = vy; 40 this.color = color; 41 this.panel = panel; 42 } 43 44 /*--- アクセサメソッド ---*/ 45 // getter 46 public double getR() { return r; } 47 48 public double getX() { return x; } 49 public double getY() { return y; } 50 51 public double getVx() { return vx; } 52 public double getVy() { return vy; } 53 54 // setter 55 public void setR(double r) { this.r = r; } 56 57 public void setX(double x) { this.x = x; } 58 public void setY(double y) { this.y = y; } 59 public void setXY(double x, double y) { this.x = x; this.y = y; } 60 61 public void setVx(double vx) { this.vx = vx; } 62 public void setVy(double vy) { this.vy = vy; } 63 public void setVxVy(double vx, double vy) { this.vx = vx; this.vy = vy; } 64 65 public void setG(double g) { this.g = g; } 66 public void setE(double e) { this.e = e; } 67 public void setColor(Color color) { this.color = color; } 68 69 // ボールを描画 70 public void draw(Graphics graphics) { 71 Color prevColor = graphics.getColor(); 72 graphics.setColor(color); 73 graphics.fillOval((int) (x - r), (int) (y - r), (int) (2 * r), (int) (2 * r)); 74 graphics.setColor(prevColor); 75 } 76 77 // ボールを左下隅へ移動 78 public void goHome() { 79 x = r; 80 y = panel.getHeight() - r; 81 } 82 83 // 座標、速度更新 84 public void next() { 85 // 画面の幅と高さ取得 86 int width = panel.getWidth(); 87 int height = panel.getHeight(); 88 89 x = x + vx; 90 y = y + vy; 91 92 /*--- 衝突判定 ---*/ 93 if (x < r) { 94 x = r; 95 vx = -vx * e; 96 } 97 98 if (x + r > width) { 99 x = width - r; 100 vx = -vx * e; 101 } 102 103 if (y < r) { 104 y = r; 105 vy = -vy * e; 106 } 107 108 if (y + r > height) { 109 y = height - r; 110 vy = -vy * e; 111 } 112 113 // 画面下向きの加速度 114 vy = vy + g; 115 } 116} 117
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/11 06:07