コード public class MainActivity extends Activity{ FrameLayout frameLayout; CanvasView canvasview; int hanabiNum = 5; //花火の数 Hanabi hanabi[] = new Hanabi[hanabiNum]; //Hanabiクラスのインスタンスの配列 @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); frameLayout = new FrameLayout(this); frameLayout.setBackgroundColor(Color.BLACK); setContentView(frameLayout); canvasview = new CanvasView(this); frameLayout.addView(canvasview); for(int i = 0; i < hanabiNum; i++){ hanabi[i] = new Hanabi(((Math.random()*600) + 50), //Hanabiのインスタンス化 ((Math.random()*50) + 150), (int)((Math.random()*10000) + 500), (int)(Math.random()*255), (int)(Math.random()*255), (int)(Math.random()*255)); hanabi[i].setCanvasView(canvasview); hanabi[i].start(); } canvasview.setNumAndHanabi(hanabiNum, hanabi); } }
コード public class CanvasView extends View{ int hanabiNum; Hanabi hanabi[] = new Hanabi[hanabiNum]; /*CanvasViewクラスのコンストラクタ*/ public CanvasView(Context context){ super(context); } public void setNumAndHanabi(int hanabiNum, Hanabi hanabi[]){ this.hanabiNum = hanabiNum; this.hanabi = hanabi; } /*描画メソッド*/ protected void onDraw(Canvas canvas){ for(int i = 0; i < hanabiNum; i++){ canvas.drawPoint((float)hanabi[i].X, (float)hanabi[i].Y, hanabi[i].paint); //paintで座標(x,y)点描画 for(int j = 0; j < 1000; j++){ canvas.drawPoint((float)hanabi[i].X2[j], (float)hanabi[i].Y2[j], hanabi[i].paint); //点描画 } } } }
コード public class Hanabi extends Thread{ private Handler handler = new Handler(); Paint paint = new Paint(); CanvasView cv; double G = 9.8*2; //重力加速度 double t; //経過時間(0.1秒毎) int time; //発射時刻 int red; //赤色成分 int green; //緑色成分 int blue; //青色成分 /*打ち上がり段階で使う定数*/ double X0; //初期のX座標 double Y0 = 1000; //初期のY座標(1000で固定) double X; //時刻t時のX座標 double Y; //時刻t時のY座標 double V0x = 0; //初速度のX成分(0で固定) double V0y; //初速度のY成分 double Vx; //時刻t時の速度のX成分 double Vy; //時刻t時の速度のY成分 /*爆発段階で使う定数*/ int hanabiball = 1000; //花火の拡散弾数 double angle[] = new double[hanabiball]; //発射する角度 double X02[] = new double[hanabiball]; //初期のX座標 double Y02[] = new double[hanabiball]; //初期のY座標 double X2[] = new double[hanabiball]; //時刻t時のX座標 double Y2[] = new double[hanabiball]; //時刻t時のY座標 double V02[] = new double[hanabiball]; //V0x2とV0y2の合成 double V0x2[] = new double[hanabiball]; //初速度のX成分 double V0y2[] = new double[hanabiball]; //初速度のY成分 double Vx2[] = new double[hanabiball]; //時刻t時の速度のX成分 double Vy2[] = new double[hanabiball]; //時刻t時の速度のY成分 /*Hanabiクラスのコンストラクタ*/ public Hanabi(double X0, double V0y, int time, int red, int green, int blue){ this.time = time; this.red = red; this.green = green; this.blue = blue; this.X0 = X0; this.V0y = V0y; X = X0; Vx = V0x; for(int i = 0; i < hanabiball; i++){ angle[i] = Math.random()*360; //拡散弾のアングル設定(0~360°) V02[i] = Math.random()*50; //拡散弾の初速度の設定(0~50) V0x2[i] = V02[i]*Math.cos(angle[i]*(Math.PI/180)); //V02のX成分 V0y2[i] = V02[i]*Math.sin(angle[i]*(Math.PI/180)); //V02のY成分 } } public void run(){ Y = 5000; //最初枠外に置いて隠しておく Arrays.fill(Y2, 5000); //Yと配列Y2の全てに5000代入 try{ Thread.sleep(time); //発射する時間を設定 } catch(InterruptedException e){ } /*打ち上がり段階*/ for(int T = 0; T < 1000 ; T++){ t = T * 0.1; Vy = (V0y - G*t); Y = (Y0 - (V0y*t - G*t*t/2)); try{ Thread.sleep(50); //0.05秒間隔 } catch(InterruptedException e){ } paint.setStrokeWidth(5); paint.setColor(Color.WHITE); viewStart(); if(Vy < 0.2){ break; } } /*爆発段階*/ Arrays.fill(X02, X); Arrays.fill(Y02, Y); for(int T = 0; T < 30; T++){ t = T * 0.1; for(int i = 0; i < hanabiball; i++){ Vx2[i] = V0x2[i]; Vy2[i] = (V0y2[i] - G*t); X2[i] = (X02[i] + (Vx2[i]*t)); Y2[i] = (Y02[i] - (V0y2[i]*t - G*t*t/2)); } try{ Thread.sleep(50); //0.05秒間隔 } catch(InterruptedException e){ } paint.setStrokeWidth(2); paint.setColor(Color.rgb(red, green, blue)); paint.setAlpha(240-(8*T)); viewStart(); } } public void viewStart(){ handler.post(new Runnable() { @Override public void run(){ cv.invalidate(); //onDrawメソッド呼び出し } }); } public void setCanvasView(CanvasView cv) { this.cv = cv; } }
上のプログラムは花火のプログラムで一応完成しました。
MainActivityクラスの花火の打ち上げる数int hanabiNumが1発の場合は綺麗な花火になっているのですが10発や20発と増やしていくと描画の点と点の間隔が広がっていき、綺麗な花火を描けません。
Hanabiクラスに点を描画する座標や時間を書いてインスタンスごとに持たしているのに、このようになる理由がわかりません。
この原因はなぜなのでしょうか?
また改善方法も教えていただきたいです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー