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

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

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

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

Android

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

Q&A

解決済

1回答

1506閲覧

花火プログラム

daichanman123

総合スコア32

Java

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

Android

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

0グッド

0クリップ

投稿2016/04/08 06:43

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

コード 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();自体にはちゃんと数字が入っていると思います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

投稿2016/04/08 06:48

tnd-.-b

総合スコア247

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

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

daichanman123

2016/04/08 06:59

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

2016/04/08 07:13

正しくないです。たぶんコンパイルが通りません。 MainActivity.hanabiがクラス変数じゃないので、SampleViewから MainActivity.hanabiにアクセスできません。 SampleViewクラスにMainActivityのhanabiを渡すのが良いかと思います。 SampleViewにsetHanabi(Hanabi h)のようなメソッドを用意して、SampleView.hanabiにMainActivity.hanagiを代入してあげてください。
tnd-.-b

2016/04/08 07:58 編集

やってきましたので、補足します。 具体的にはこの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を実装してしまう、という手もあります。
daichanman123

2016/04/11 07:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問