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

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

ただいまの
回答率

90.47%

  • Java

    14116questions

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

  • Android

    6632questions

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

花火プログラム

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 851

daichanman123

score 26

コード
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発以上の花火を時間差で描画するにはどうすればいいのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/08 11:08

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

    キャンセル

  • 2016/04/08 11:11

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

    キャンセル

  • 2016/04/08 15:26

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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Java

    14116questions

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

  • Android

    6632questions

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