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

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

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

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

Q&A

解決済

2回答

1468閲覧

繰り返しを直す方法

kisaragizinzin7

総合スコア90

Java

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

0グッド

0クリップ

投稿2016/01/06 08:47

以前こちらで質問させていただいた、花火のプログラムは完成したのですが、
今の段階では、花火が打ちあがって破裂して花火が消えてから次の花火が打ちあがるようになっています。
これを1つの花火が打ちあがっているときに2発目3発目と次々に打ちあがらせるようにしたいです。

コード Thread th; //スレッド作成 double G = 9.8*2; //重力加速度×2 int time; //時間 double mul = 0.1; //timeの任意倍数 double times; /*花火作成(打ち上がり段階)で使う定数*/ double V0y = 120.0; //y軸初速度 double Vy; //y軸速度 int X; //x軸変位 int Y = 800; /*花火作成(爆発段階)で使う*/ int hanabiball = 1000; //花火が分散する数 double angle[] = new double[hanabiball]; //分散したものの各角度(ランダムで決定) double speed[] = new double[hanabiball]; //分散したものの各スピード(ランダムで決定) V0x2とV0y2の合成 float color; //分散したものの色(ランダムで決定) int speedx = 50; //スピードの定数倍 50は適当 int colorx = 50; //色の定数倍 50は適当 double V0x2[] = new double[hanabiball]; //x軸初速度(time = 0) speedのx軸成分 double V0y2[] = new double[hanabiball]; //y軸初速度(time = 0) speedのy軸成分 double Vx2[] = new double[hanabiball]; //x軸速度(time = t) tは任意の整数 double Vy2[] = new double[hanabiball]; //y軸速度(time = t) tは任意の整数 int X2[] = new int[hanabiball]; //x軸変位(time = 0) 花火作成(打ち上がり段階)が終了した時の値Xから時間とともに変化 int Y2[] = new int[hanabiball]; //y軸変位(time = 0) 花火作成(打ち上がり段階)が終了した時の値Yから時間とともに変化 float num = 0; //明度を減らすために使う変数 float num2; //明度を減らすために使う変数 int n = 1; //打ち上がり段階と爆発段階を区別する変数(1.打ち上がり段階 2.爆発段階) /*初期設定*/ public void init(){ setSize(800, 800); //アプレットサイズ(最初のウィンドウサイズ)を800×800に設定 setBackground(Color.black); } public void start(){ th = new Thread(this); th.start(); } /*メインプログラム*/ public void run(){ while(true){ //繰り返し //花火作成(爆発段階)で使う角度とスピードと色を設定 for(int i = 0; i < hanabiball; i++){ angle[i] = Math.random()*360; //全方向(0~360°) ランダムで決める speed[i] = Math.random()*speedx; //スピードの設定 ランダムで決める } color = (float)Math.random()*colorx; //色の設定 ランダムで決める X = (int)(Math.random()*400) + 200; //Xの位置を200~600の間でランダムで決める //花火作成(打ち上がり段階) for(time = 0; time < 1000; time++){ //1000秒間(1000回)繰り返す 1000は適当 times = time*mul; repaint(); //再描画する try{ //0.05秒間をあける Thread.sleep(50); //50は適当 } catch(InterruptedException e){ } if(Vy <= 0.2){ //速さVyが0.2以下になったら繰り返し終了 0.2は適当 n = 2; //爆発段階に移行 break; } } //花火作成(爆発段階) for(time = 0; time < 30; time++){ //30秒間(30回)繰り返す 30は適当 times = time*mul; repaint(); //再描画する try{ //0.05秒間をあける Thread.sleep(50); //50は適当 } catch(InterruptedException e){ } } n = 1; //打ち上がり段階に戻す num = 0; //明度変数を初期値に戻す } } /*描画メソッド*/ public void paint(Graphics g){ //花火作成(打ち上がり段階) if(n == 1){ Vy = V0y - G*times; //鉛直上投げなので V0 - at Y = (int)(700 - (V0y*times - G*times*times/2)); //鉛直上投げなので V0t - at2/2 g.setColor(Color.white); g.fillRect(X, Y, 2, 2); //花火描画(time = tのときの変位を点で描画) } //花火作成(爆発段階) else if(n == 2){ for(int i = 0; i < hanabiball; i++){ //分散した分だけ繰り返す(作る) V0x2[i] = speed[i]*Math.cos(angle[i]*(Math.PI/180)); //speedのx軸成分 V0y2[i] = speed[i]*Math.sin(angle[i]*(Math.PI/180)); //speedのy軸成分 Vx2[i] = V0x2[i]; //等速運動なので初速度で一定 Vy2[i] = V0y2[i] - G*times; //鉛直上投げ?なので V0 - at X2[i] = X + (int)(V0x2[i]*times); //等速運動なので初速度×時間 Y2[i] = Y - (int)(V0y2[i]*times - G*times*times/2); //鉛直上投げ?なので V0t - at2/2 if(0 <= time && time <= 10){ //0秒~10秒 適当に区切った g.setColor(Color.getHSBColor(color, 1f, 1f)); //明度を一番明るい状態 } else if(11 <= time && time <= 25){ //11秒~25秒 適当に区切った num = num + 1; //徐々に暗くしていく num2 = num/hanabiball; g.setColor(Color.getHSBColor(color, 1f, (float)(1-0.066*num2))); //0.066は25-11+1=15 1/15=0.066 } else if(26 <= time){ //26秒以降 適当に区切った g.setColor(Color.getHSBColor(color, 1f ,0)); //黒にして花火を消す } g.fillRect(X2[i], Y2[i], 1, 1); //花火描画(time = tのときの変位を点で描画) } } }

上記が花火のプログラムです。
花火を次々に打ち上げるようにするにはメインプログラムのrunメソッドをいじればいいと思うのですが、どう直したらよいのでしょうか?
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

作ってみたのでこんな感じでどうでしょうか。
ざっくりとしか作っていないので、描画など花火の処理などはしていません。
基盤的なもの
Listを使って管理するのが一番楽かと思われます。
所々抜けているので、自分で入れてみてください。
ソースが汚いかもしれませんが、参考になれば、と思います。

投稿2016/01/06 11:23

編集2016/01/06 13:12
PineCandy

総合スコア83

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

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

kisaragizinzin7

2016/01/09 05:07

回答ありがとうございます^^ 教えていただいたプログラムですが、 import java.io.BufferedReader; import java.io.InputStreamReader; はどこで使えばいいのでしょうか? またmainメソッドの内容もよくわかりません。 すみませんが、説明をお願いしてもいいでしょうか?
guest

0

ベストアンサー

花火1つにつき、1つのインスタンスを作るようにしてみてください。
初期値はクラスフィールドまたは定数にしましょう。

花火1つにつき、その状態を変更するスレッドを1つ起動します。

実際に描画を行うクラスがCanvasクラス、花火クラスがHanabiだとしたら、
Canvasクラスは1つで、そこに同時に打ち上げたい数だけHanabiインスタンスを配列で持たせます。
HanabiクラスにRunnableインターフェイスを実装させます。

そして、Canvasクラスのpaintメソッドで、すべてのHanabiインスタンスの情報元に描画を行います。

できれば、paintメソッド内では計算を避けて、状態を変更する側で計算を終わらせるようにしたほうが、たぶん描画もスムーズになります。

投稿2016/01/06 09:00

argius

総合スコア9388

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

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

kisaragizinzin7

2016/01/06 09:12

回答ありがとうございます。 同時に打ち上げたい数だけHanabiインスタンスを配列で持たせます。とありますが、同時ではなく時間差で次から次に花火を打ち上げたいです。 教えていただいた方法で時間差で打ち上げることも可能でしょうか?
argius

2016/01/06 09:21

スレッドを起動するタイミングを遅らせるか、 スレッドが開始するところでスリープさせてみるのはどうでしょうか。 例えばHanabiクラスのコンストラクターにdelayTimeを持たせて、何秒遅らせるか(=何秒スリープするか)を指定できるようにするとか。 起動するタイミングを遅らせる方法としては、Timerクラスや、ScheduledExecutorServiceなどを使います。 8. java.util.concurrentパッケージ2 | TECHSCORE(テックスコア) http://www.techscore.com/tech/Java/JavaSE/Thread/8/ (schedule()という項目を見てください。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問