javaアプレットで花火を作ろうと考えています!
調べたところ、サンプルコードはいくつか出てきたのですが、詳しい解説がないため、理解できない部分がありました。
コード public class hanabi2 extends Applet implements Runnable, MouseListener{ int MaxRocketNumber=2; int MaxRocketExplosionEnergy=800; int MaxRocketPatchNumber=80; int MaxRocketPatchLength=80; int Gravity=40; Rocket rocket[]; Thread launcher=null; boolean fg = true; int mx, my; int speed = 50; AudioClip don; public void init() { mx=450;//getSize().width; my= 350;//getSize().height; don = getAudioClip(getDocumentBase(), "don.au"); rocket = new Rocket[MaxRocketNumber]; for (int i = 0; i < MaxRocketNumber; i++) rocket[i] = new Rocket(mx, my, Gravity); addMouseListener(this); } public void start() { if(launcher ==null){ fg = true; launcher =new Thread(this); launcher.start(); } } public void run() { int i,e=0, p=0, l=0; long s =0; int mg = 0; Graphics g =getGraphics(); while (fg == true) { try { launcher.sleep(speed); } catch(InterruptedException x) { } e = (int)(Math.random()*MaxRocketExplosionEnergy*3/4)+ MaxRocketExplosionEnergy / 4 + 1; p = (int)(Math.sqrt(Math.random())*MaxRocketPatchNumber*3/4)+MaxRocketPatchNumber/4+1; l = (int)(Math.random()*MaxRocketPatchLength*3/4)+ MaxRocketPatchLength/4+1; s = (long)(Math.random()*1); for (i=0;i<MaxRocketNumber;++i) { if (rocket[i].sleep && Math.random()*Math.random()* MaxRocketNumber*l<1 && fg){ if(++mg % 7 == 0)repaint(); rocket[i].init(e, p, l, s, my); rocket[i].start(); } rocket[i].show(fg, g, don); } } } class Rocket { public boolean sleep = true,fire=false; private int energy,patch,length; private int wx,hy,x,y,ox,oy,vx[],vy[]; private int t,h,red,blue,green; private int a,b,gravity; private int ly; private int time; private Random random; private AudioClip don; Thread launcher; private double cosA; private double sinA; public Rocket(int a,int b,int g) { wx=a; hy=b; gravity=g; } public void init(int e,int p,int l,long seed, int my) { int i; ly=my-50; double qx,qy,qz,ux,uy,uz; energy=e; patch=p; length=l; h=0; random=new Random(seed); vx =new int[patch]; vy =new int[patch]; red =(int)(random.nextDouble() * 128) + 128; blue =(int)(random.nextDouble() * 128) + 128; green =(int)(random.nextDouble() * 128) + 128; ox=(int)(Math.random()*wx/2)+wx/4; oy=(int)(Math.random()*hy/2)+hy/4; for(i=0;i<patch;++i) { qx=Math.random(); qy=Math.random(); ux=qx-0.5; uy=qy-0.5; if((ux*ux+uy*uy)<0.25){ vx[i]=(int)(qx*energy)-energy/2; vy[i]=(int)(qy*energy*7/8)-energy/8; }else --i; } } public void start() { t=0; sleep=false; } public void line(Graphics g){ if(h<=(ly-oy)){ g.setColor(new Color(0,0,0)); g.drawLine(ox,(ly-h)-3,ox,(ly-h)+5); if (h <(ly-oy)){ g.setColor(new Color(160,180,255)); g.drawLine(ox,(ly-h),ox,(ly-h)-3); } } h=h+4; if(h>=(ly-oy)) fire=true; else fire=false; } public synchronized void show(boolean fg,Graphics g,AudioClip don) { if (!sleep) { if(fg){ line(g); if(fire){ if (t<length*4/5) { int i,c; int tb =6; if(length < tb) tb =length ; if(t == tb) don.play(); double s; Color color; c =(int)(random.nextDouble()*64)-32+red; if (c >= 0 && c <256) red=c; c =(int)(random.nextDouble()*64)-32+blue; if (c >= 0 && c <256) blue=c; c =(int)(random.nextDouble()*64)-32+green; if (c >= 0 && c <256) green=c; color = new Color(red,blue,green); for (i=0;i<patch;++i) { s = (double)t/100; x = (int)(vx[i]*s); y = (int)(vy[i]*s-gravity*s*s); g.setColor(color); g.drawLine(ox+x,oy-y,ox+x,oy-y); if (t>=length/2) { for (int j=0;j<2;++j){ s = (double)((t-length/2)*2+j)/100; x = (int)(vx[i]*s); y = (int)(vy[i]*s-gravity*s*s); g.setColor(new Color(0,0,0)); g.drawLine(ox+x,oy-y,ox+x,oy-y); } } } ++t; } else sleep=true; } } } } }
このプログラムが載っていたサイトはこちらになります。
http://club.pep.ne.jp/~k.sindou/myprog/Firework2/Firework.java
このプログラムのrunメソッドにあるe,p,l,sが何を求めているのかがわかりません。
花火の数や、打ち出し角度などだと思いますが、3/4倍や+1にはどんな理由があるのかも知りたいです。
このコードがわかる方がいましたら教えていただきたいです。
よろしくお願いします!
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。