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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

2596閲覧

花火プログラム

daichanman123

総合スコア32

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/04/07 08:03

コード private Handler mHandler; private FrameLayout frameLayout; SampleView sv; Thread thread, thread2, thread3; double G = 9.8*2; //重力加速度×2 int time = 0; //時間 double mul = 0.15; //timeの任意倍数 double times; // = time*mul; double V0y = 180.0; //y軸初速度 double Vy; //y軸速度 static int hanabiball = 1000; //花火が分散する数 int hanabi[] = new int[hanabiball]; //分散した花火1つ1つを格納した配列 double angle[] = new double[hanabiball]; //分散したものの各角度(ランダムで決定) double speed[] = new double[hanabiball]; //分散したものの各スピード(ランダムで決定) V0x2とV0y2の合成 int speedx = 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軸速度 tは任意の整数 double Vy2[] = new double[hanabiball]; //y軸速度 tは任意の整数 @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); frameLayout = new FrameLayout(this); setContentView(frameLayout); sv = new SampleView(this); frameLayout.addView(sv); mHandler = new Handler(); for(int i = 0; i < hanabiball; i++){ angle[i] = Math.random()*360; //全方向(0~360°) ランダムで決める speed[i] = Math.random()*speedx; //スピードの設定 ランダムで決める } thread = new Thread(this); thread.start(); } @Override public void run(){ //while(true){ sv.x = (int)(Math.random()*500) + 100; for(int roop = 0; roop < 2; roop++){ for(time = 0; time < 1000; time++) { times = time*mul; try { Thread.sleep(50); } catch (InterruptedException e) { } if(sv.n == 1){ Vy = V0y - G*times; sv.y = (int)(1100 - (V0y*times - G*times*times/2)); mHandler.post(new Runnable() { @Override public void run(){ sv.invalidate(); } }); if(Vy <= 0.1){ sv.n = 3; break; } } else if(sv.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 sv.x2[i] = sv.x + (int)(V0x2[i]*times); //等速運動なので初速度×時間 sv.y2[i] = sv.y - (int)(V0y2[i]*times - G*times*times/2); //鉛直上投げ?なので V0t - at2/2 } mHandler.post(new Runnable() { @Override public void run(){ sv.invalidate(); } }); if(time == 25){ sv.n = 4; break; } } } } //} } }

上のプログラムは自分で作ったみた花火のプログラムです。
これを実行すると花火が1発だけ打ちあがります。
コメントアウトしてあるwhile文を元に戻すと、花火が1発打ちあがって、それが終わったあとにまた打ちあがってというようにループします。

これを同時に2発打ち上げたり、時間差で例えば2秒だけずらして打ち上げたりしたいです。
画面上に2発以上の花火を時間差で描画するにはどうすればいいのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

ざっくり概要だけ指摘するなら…
今一つの花火の描写に必要な情報をすべてActivityクラスに書いていると思いますが、これをまとめて「花火クラス」というべきクラスをまず作ります。
そしてActivityで「今空中にある花火」だけ管理するListなどを作成し、そこに花火クラスのオブジェクトを詰め、ActivityではそのListにある花火全てについて描写する必要があるかと思います。

投稿2016/04/07 14:43

swordone

総合スコア20649

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

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

daichanman123

2016/04/08 02:08

回答ありがとうございます。 新しく花火クラスを作ったとして、runメソッドの中身を花火クラスにしたらいいと思うのですが、ActivityクラスのonCreateメソッドのmHandler = new Handler();やthread = new Thread(this);  thread.start();といった記述は必要なくなるように思うのですがどうすればいいのでしょうか?
swordone

2016/04/08 02:11

それらのコードはActivity内で画面描写を指示するために必要です。 花火クラスはあくまで「打ち上がっている花火の情報」を管理するためのクラスであって、 Activityがその情報を元に描写できるようにすればいいわけです。 もっと言うなら、その描写のための計算を今runの中で行っているわけですが、その計算も花火クラスに一任してしまえばActivityのコードがすっきりするのではないでしょうか。
daichanman123

2016/04/08 06:26

回答ありがとうございます。 それでやってみたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問