質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Swing

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

Q&A

解決済

2回答

1806閲覧

java AWTスレッド

Launcher

総合スコア19

Java

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

Swing

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

0グッド

0クリップ

投稿2017/02/07 23:58

このソースで

java

1import java.awt.*; 2 3//メインのクラス 4public class SwingIconMove2{ 5 int width, height; //縦横サイズ 6 Frame mainF; //フレーム 7 Canvas mainC; //キャンバス 8 9 public SwingIconMove2(){ 10 //サイズ設定して 11 width = 500; 12 height = 500; 13 14 //キャンバスの大きさと背景色を指定 15 mainC = new MainCanvas(); 16 mainC.setSize(400,400); 17 mainC.setBackground(Color.blue); 18 19 //フレームの大きさと背景色を指定、キャンバスをフレームに載せる 20 mainF = new Frame("moving ball"); 21 mainF.setBackground(Color.white); 22 mainF.setSize(width,height); 23 mainF.setLayout(new FlowLayout()); 24 mainF.add(mainC); 25 26 mainF.setVisible(true); 27 } 28 29 public static void main(String[] args){ 30 //main関数でインスタンス化を行います 31 SwingIconMove2 frame = new SwingIconMove2(); 32 } 33} 34 35 36class MainCanvas extends Canvas implements Runnable{ 37 int x, y; //ボールの位置 38 int vx = 30; //移動量 39 int vy = -20; //移動量 40 Thread thread; //スレッド準備 41 42 //コンストラクタは位置を指定してスレッド開始 43 public MainCanvas(){ 44 x = 170; 45 y = 265; 46 47 thread = new Thread(this); 48 thread.start(); 49 } 50 51 public void paint(Graphics g){ 52 g.setColor(Color.white); 53 g.fillOval(x, y, 30, 30); 54 } 55 56 public void run(){ 57 while (true) { 58 x += vx; 59 y += vy; 60 61 repaint(); 62 63 64 //早すぎて困るのでスリープ 65 try { 66 Thread.sleep(540); 67 } catch (InterruptedException e) { 68 e.printStackTrace(); 69 } 70 } 71 } 72} 73

このように動きます。

イメージ説明
イメージ説明
イメージ説明

イメージとしては
イメージ説明
このようにボールを8個用意して回したいです。
どこをどうすればいいですか・・・?
教えてください!

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

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

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

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

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

masaya_ohashi

2017/02/08 00:10

まず確認ですが、あなたのプログラムは右上に向かって●が進んでいくだけのように見えます。これを「回る動きに変える」、「それを8個同時に」ということがわからないということですか?
Launcher

2017/02/08 00:24

はい、おっしゃる通りです! 後々は●をJButtonにして回したいと思っています! 
guest

回答2

0

ベストアンサー

まず回転のお話をしましょう。
半径が1の円を描くとき、右側から円を上に向かって描くとします。そのとき、xの値は1から始まり0、-1、0、最後にまた1になります。yの値は0から始まり1、0、-1、最後に0になります。さて、こんな数値をどうやって計算するのかということですが、このグラフ、見たことありませんか?
http://www.wolframalpha.com/input/?i=x%3Dcos(t)
http://www.wolframalpha.com/input/?i=y%3Dsin(t)
そう、sin、cosカーブです。これは時間経過tを用いてsinとcosを計算したときのグラフです。cosは1、0、-1、0という周期運動、sinは0、1、0、-1という周期運動をしています。これらを組み合わせると…
http://www.wolframalpha.com/input/?i=x%3Dcos(t),+y%3Dsin(t)
見事な円になりました。つまり、xの座標をcos(t)と考え、yの座標をsin(t)と考えます。ただ、このままだと半径1のパターンしか作れないので、それぞれに半径rを掛けます。

x = cos(t) * r; y = sin(t) * r;

例えば10秒かけて1周するのであれば、sinやcosが1周するのに必要なのは2πですからtの求め方はこうなります。経過時間をpass(ミリ秒)とすると、

t = 2 * 3.1415 * pass / 10000;

さらにこのままですと0、0の座標を中心に回転するので、中心としたい座標を足してずらします。中心点をcenterX、centerYとすると

period = [周期時間]; pass = [経過時間]; centerX = [回転の中心点x]; centerX = [回転の中心点y]; r = [半径]; t = 2 * 3.1415 * pass / period; x = cos(t) * r + centerX; y = sin(t) * r + centerY;

これで円運動する物体の中心点x、yの座標が求められました。ここを中心に●を描画すれば、無事に●が円運動します。

さて、これを8つ描きたいということですが、8つ描くだけならいまある描画処理をfor文で8回やればいいだけです。わざわざボールの個数分のスレッドを回す必要はありません。これら8つの●が常に等間隔、等速で回るのであれば、tに対して8分の1周分プラス(またはマイナス)したtを渡してやればいいだけです。for文のカウントをiとしたとき、tの計算はこうなります。

t = 2 * 3.1415 * (pass + period * i / 8) / period;

あとは自分で組み立ててみてください。

投稿2017/02/08 00:55

編集2017/02/08 01:13
masaya_ohashi

総合スコア9206

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

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

KiyoshiMotoki

2017/02/08 01:05

最後の  t = 2 * 3.1415 * pass / period + (period * i / 8); は  t = 2 * 3.1415 * pass / period + (2 * 3.1415 * i / 8); ではありませんか?
masaya_ohashi

2017/02/08 01:11

あ、ほんとですね、このやり方だとpassに足すのが正しいですね。PIを2回出すのはあんまりやりたくないので経過の方をいじろうとしたんですが、この位置じゃだめですね。ご指摘ありがとうございます!
Launcher

2017/02/08 02:42

分かりやすい説明ありがとうございます! 早速組み立ててみます。
guest

0

「回る動きに変える」のほうだけ。

現在の実装では、ループ1回ごとに x に vx を足して、y に vy を足していますね。つまり

java:

1 x = 170; 2 y = 265; 3 4 while (true) { 5 x += vx; 6 y += vy;

ここをこんなかんじにすればいいでしょう:

java:

1 static int[] xarray = new int[] {170, 212, 230, 212, 170, 128, 110, 127}; 2 static int[] yarray = new int[] {265, 253, 225, 197, 185, 197, 225, 253}; 3 int t = 0; 4 while (true) { 5 t = (t+1) % 8; 6 x = xarray[t]; 7 y = yarray[t];

ちりばめられている数字は適当に作っただけなので、やりたいことに応じて変えてください。

投稿2017/02/08 00:53

編集2017/02/08 03:15
matobaa

総合スコア2493

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

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

Launcher

2017/02/08 02:43

回答、ありがとうございました! 変えて実装してみたのですがうまくいきませんでした・・・
matobaa

2017/02/08 03:17

お、おぅ……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問