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

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

ただいまの
回答率

90.50%

  • Java

    14049questions

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

  • Android

    6617questions

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

花火プログラム

解決済

回答 1

投稿

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

daichanman123

score 26

先ほどの質問の続きになってすみませんがよろしくお願いします。

コード
public class MainActivity extends Activity implements Runnable{

     Handler mHandler;
     Thread thread;
     FrameLayout frameLayout;

     SampleView sv;
     Hanabi hanabi = new Hanabi();

     int time = 0;    
     double mul = 0.15;    
     double times;


    @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();

        thread = new Thread(this);
        thread.start();
    }


     @Override
     public void run(){

         hanabi.setX();

         for(time = 0; time < 100; time++){
             times = time*mul;

             try{
                 Thread.sleep(50);
             }
             catch(InterruptedException e){
             }

             hanabi.setY(times);

             mHandler.post(new Runnable(){
                 @Override
                 public void run(){
                     sv.invalidate();
                     //tv.setText("y は" + hanabi.getY());
                 }
             });
         }
     }
}
コード
public class SampleView extends View{


    Hanabi hanabi = new Hanabi();
    Paint paint = new Paint();


    public SampleView(Context context) {
        super(context);
    }


    protected void onDraw(Canvas canvas){
        paint.setColor(Color.RED);
        paint.setStrokeWidth(10);
        canvas.drawPoint(hanabi.getX(), hanabi.getY(), paint);
    }
}
コード
public class Hanabi{

    int x;
    int y;

    double V0x = 0.0;
    double V0y = 180.0;

    double Vx;
    double Vy;

    double G = 9.8*2;


    public void setX(){
        this.x = (int)(Math.random()*800) + 50;
    }

    public void setY(double times){
        Vy = V0y - G*times;
        this.y = (int)(1100 - (V0y*times - G*times*times/2));
    }

    public int getX(){
        return this.x;
    }

    public int getY(){
        return this.y;
    }
}

これは花火のプログラムの一部で、花火が打ち上がっている部分だけを描画しているものです。
セッターとゲッターを使って花火の位置を描画しようとしたのですが、これを実行したところx=0、y=0の点で赤点が描画されるだけでした。

canvas.drawPoint(hanabi.getX(), hanabi.getY(), paint);
この部分のhanabi.getX(), hanabi.getY()にちゃんと数字が入っていないと思われるのですが、どこがダメなのでしょうか?

ちなみにコメントアウトしてあるtv.setText("y は" + hanabi.getY());で確認したところ、ここには0.5秒ごとに数字が変化しているのでhanabi.getY();自体にはちゃんと数字が入っていると思います。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

Hanabiさんが2人います(2箇所、newされています)が、setX, setYが1人にしか呼ばれていません。
MainActivityのhanabiさんはsetされていますが、SampleViewのhanabiさんはsetされていません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/08 15:59

    回答ありがとうございます。
    なるほどです!
    SampleViewクラスのHanabi hanabi = new Hanabi();を消して、
    canvas.drawPoint(MainActivity.hanabi.getX(), MainActivity.hanabi.getY(), paint);
    このように書き換えてたら大丈夫だと思うのですが、これはプログラム的に正しい書き方でしょうか?

    キャンセル

  • 2016/04/08 16:13

    正しくないです。たぶんコンパイルが通りません。
    MainActivity.hanabiがクラス変数じゃないので、SampleViewから
    MainActivity.hanabiにアクセスできません。

    SampleViewクラスにMainActivityのhanabiを渡すのが良いかと思います。
    SampleViewにsetHanabi(Hanabi h)のようなメソッドを用意して、SampleView.hanabiにMainActivity.hanagiを代入してあげてください。

    キャンセル

  • 2016/04/08 16:57 編集

    やってきましたので、補足します。
    具体的にはこの3箇所です。

    SampleView
     //Hanabi hanabi = new Hanabi(); // これは消して
     Hanabi hanabi; //こうしておく

     // 以下のメソッドを追加
      public void setHanabi(Hanabi h) {
       hanabi = h; // 引数に渡されたHanabiを保持する
     }

    MainActivity.onCreate()
     (前略)
      sv = new SampleView(this);
      sv.setHanabi(hanabi); // SampleView.hanabiにMainActivity.hanabiを代入
      frameLayout.addView(sv);
     (以下略)

    HanabiにViewを継承させ、Hanabi.onDrawを実装してしまう、という手もあります。

    キャンセル

  • 2016/04/11 16:54

    プログラムまで載せていただいてありがとうございます!
    そのやり方でできました!
    ありがとうございました!

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Java

    14049questions

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

  • Android

    6617questions

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