🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Q&A

解決済

1回答

2544閲覧

複数のボールのアニメーションを作ろうとしたが一つしか表示されない

Ryuuse

総合スコア27

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

0グッド

0クリップ

投稿2021/01/11 05:14

編集2021/01/11 05:16

二個のボールを同時に動かすアニメーションのプログラムを作ってみたのですが、実行しても一つしか表示されず、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Panel4GameBoardクラス

java

1 2 @Override 3 public void paintComponent(Graphics graphics) { 4 super.paintComponent(graphics); 5 ball.draw(graphics); 6 ballEx.draw(graphics);  // ←追加 7 } 8 9 10------------------ 11 12 @Override 13 public void actionPerformed(ActionEvent event) { 14 ball.next(); 15 ballEx.next(); // ← 追加 16 repaint(); 17 if(event.getSource() == button){ 18 ball.setY(0); 19 ballEx.setY(0); 20 } 21 } 22 23

投稿2021/01/11 06:01

umau

総合スコア831

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryuuse

2021/01/11 06:07

回答ありがとうございます。その部分に追加するのを忘れていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問