前提・実現したいこと
javaでウインドウの端に当たると反射する丸のアニメーションを表示するプログラム(古いwindowsで、ロゴが画面内を反射しながら動くスクリーンセーバーがありましたが、丁度あの感じです)を作成したいのですが、狙い通りに動作しません。
最初に丸が左から斜め右下に動くことはいいとして、その後反射せずそのまま進んでいき、最終的には画面外に出ます。
発生している問題・エラーメッセージ
エラーメッセージの類は表示されませんでした。
該当のソースコード
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class R6_1a extends JPanel {
ArrayList<Figure> figs = new ArrayList<Figure>();
Circle c1 = new Circle(Color.BLUE, 100, 100, 20);
Text t1 = new Text(20, 40, "?", new Font("serif", Font.BOLD, 36)); //テキストのオブジェクト
public R6_1a() { setOpaque(false); figs.add(t1); figs.add(c1); final long tm0 = System.currentTimeMillis(); //開始時刻の取得 new javax.swing.Timer(50, new ActionListener() { //タイマーの設定.50ミリ秒間隔で繰り返す. public void actionPerformed(ActionEvent evt) { double tm = 0.001 * (System.currentTimeMillis() - tm0); //経過時間を計算 t1.setText(String.format("%5.2f", tm)); //経過時間の表示 int dx = 100, dy = 50; for (int i = 0; i < 1000; ++i) { if (tm * dy > getHeight() || tm * dy <= 0) { //フレームの下辺あるいは上辺にぶつかると反射する c1.moveTo(20 + (int)(tm * dx) , 20 + (int)(tm * -dy)); //円の移動 } if (tm * dx > getWidth() || tm * dx <= 0) { //フレームの横辺にぶつかると反射する c1.moveTo(20 + (int)(tm * -dx) , 20 + (int)(tm * dy)); //円の移動 } else{ c1.moveTo(20 + (int)(tm * dx) , 20 + (int)(tm * dy)); } } repaint(); } }).start(); //タイマーの開始 } public void paintComponent(Graphics g) { for (Figure f : figs) { f.draw(g); } } public static void main(String[] args) { JFrame app = new JFrame(); app.add(new R6_1a()); app.setSize(400, 400); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); app.setVisible(true); } interface Figure { public void draw(Graphics g); } static class Circle implements Figure { Color col; int xpos, ypos, rad; public Circle(Color c, int x, int y, int r) { col = c; xpos = x; ypos = y; rad = r; } public boolean hit(int x, int y) { return (xpos - x) * (xpos - x) + (ypos - y) * (ypos - y) <= rad * rad; } public void setColor(Color c) { col = c; } public void moveTo(int x, int y) { xpos = x; ypos = y; } public void draw(Graphics g) { g.setColor(col); /*int dypos = 100; int dxpos = 80;*/ g.fillOval(xpos - rad, ypos - rad, rad * 2, rad * 2); /*for (int i = 0; i < 1000; ++i) { if (ypos - rad > 400 || ypos <= 0) { //フレームの下辺あるいは上辺にぶつかると反射する dypos = -dypos; g.setColor(new Color(35, 185, 15)); } if (xpos - rad > 400 || xpos <= 0) { //フレームの横辺にぶつかると反射する dxpos = -dxpos; g.setColor(new Color(220, 70, 240)); } ypos = ypos + dypos; xpos = xpos + dxpos; }*/ } } static class Text implements Figure { int xpos, ypos; String txt; Font fn; public Text(int x, int y, String t, Font f) { xpos = x; ypos = y; txt = t; fn = f; } public void setText(String t) { txt = t; } public void draw(Graphics g) { g.setColor(Color.BLACK); g.setFont(fn); g.drawString(txt, xpos, ypos); } }
}
試したこと
補足情報(FW/ツールのバージョンなど)
java初心者です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/20 07:23
2020/06/20 07:54 編集
2020/06/22 01:54