このサイトの質問の回答などを調べて、とりあえず花火の打ち上がっている部分のプログラムを作ってみました!
コード public class MainActivity extends Activity{ private Handler handler; private FrameLayout frameLayout; CanvasView cv; Hanabi h; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); frameLayout = new FrameLayout(this); setContentView(frameLayout); cv = new CanvasView(this); frameLayout.addView(cv); handler = new Handler(); h = new Hanabi(((Math.random()*600) + 50), ((Math.random()*50) + 150), 2000); cv.setHanabi(h); h.start(); handler.post(new Runnable() { @Override public void run(){ cv.invalidate(); } }); } }
コード public class CanvasView extends View{ Paint paint = new Paint(); Hanabi hanabi; public CanvasView(Context context){ super(context); } public void setHanabi(Hanabi h) { hanabi = h; } protected void onDraw(Canvas canvas){ paint.setColor(Color.RED); paint.setStrokeWidth(10); canvas.drawPoint((float)hanabi.X, (float)hanabi.Y, paint); } }
コード public class Hanabi extends Thread{ double X0; //初期のX座標 double Y0 = 1000; //初期のY座標(1000で固定) double X; //t = time時のX座標 double Y; //t = time時のY座標 double V0x = 0; //初速度のX成分(0で固定) double V0y; //初速度のY成分 double Vx; //t = time時の速度のX成分 double Vy; //t = time時の速度のY成分 double G = 9.8*2; //重力加速度 double t; //経過時間(0.1秒毎) int time; //発射時刻 /*Hanabiクラスのコンストラクタ*/ public Hanabi(double X0, double V0y, int time){ this.X0 = X0; this.V0y = V0y; this.time = time; X = X0; Vx = V0x; } public void run(){ try{ Thread.sleep(time); } catch(InterruptedException e){ } for(int T = 0; T < 100; T++){ t = T * 0.15; Vy = (V0y - G*t); Y = (Y0 - (V0y*t - G*t*t/2)); try{ Thread.sleep(50); } catch(InterruptedException e){ } Log.d("TAG", "Yは" + Y); } } }
これは
h = new Hanabi(((Math.random()*600) + 50), ((Math.random()*50) + 150), 2000);
なのでX座標50650でランダム、初速度150200でランダム、発射時間2秒後の花火になります。
今MainActivityクラスの
public void run(){
cv.invalidate();
}
この部分でCanvasViewクラスのonDrawメソッドを呼び出して描画をしているのですが、このプログラムを実行すると、X座標はちゃんとランダムになっていますが、Y座標はずっと0でした。
HanabiクラスのLog.d("TAG", "Yは" + Y);で確認したところYの値はちゃんと0.05秒ごとに変化していたので、描画のときにYにちゃんと代入されていないんだと思います。
たぶん今のままだと開始時にcv.invalidate();と書いているだけなので開始時のYの値を描画しているだけで、for文でYを上書きしているのが反映できていないのだと思います。
このfor文で0.05秒間隔で上書きされているYを全て読み取って描画させるにはどうしたらいいのでしょうか?
長文になりましたがよろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。