import java.awt.*; import java.awt.event.*; import java.util.*; class Screens{ public int x,y; public Screens(int x,int y){ this.x=x; this.y=y; } public Screens(ViewPoint vp,Point3D p){ double j,k; j=((p.z-vp.z)/((p.x-vp.x)*vp.a+(p.y-vp.y)*vp.b+(p.z-vp.z)*vp.c)-vp.c)/(1-vp.c*vp.c); k=((p.x-vp.x)/((p.x-vp.x)*vp.a+(p.y-vp.y)*vp.b+(p.z-vp.z)*vp.c)-vp.a+j*vp.a*vp.c)/vp.b; x=300+(int)(k*Math.sqrt(vp.a*vp.a+vp.b*vp.b)*150); y=300-(int)(j*Math.sqrt(vp.a*vp.a+vp.b*vp.b)*150); } public int distance(Screens s){ return (int)Math.sqrt((s.x-x)*(s.x-x)+(s.y-y)*(s.y-y)); } } class Point3D{ public double x,y,z; public Point3D(){ this(0.0,0.0,0.0); } public Point3D(double x,double y,double z){ this.x=x; this.y=y; this.z=z; } public double distance(Point3D p){ double d; d=Math.sqrt((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y)+(p.z-z)*(p.z-z)); return d; } public double distance(ViewPoint vp){ double d; d=Math.sqrt((vp.x-x)*(vp.x-x)+(vp.y-y)*(vp.y-y)+(vp.z-z)*(vp.z-z)); return d; } } class ViewPoint extends Point3D{ public double a,b,c; public ViewPoint(double x,double y,double z,double a,double b,double c){ this.x=x; this.y=y; this.z=z; this.a=a/Math.sqrt(a*a+b*b+c*c); this.b=b/Math.sqrt(a*a+b*b+c*c); this.c=c/Math.sqrt(a*a+b*b+c*c); } public ViewPoint(Point3D p,double a,double b,double c){ this(p.x,p.y,p.z,a,b,c); } public ViewPoint(double x,double y,double z){ this(x,y,z,0.0,1.0,0.0); } public ViewPoint(Point3D p){ this(p.x,p.y,p.z,0.0,1.0,0.0); } } class Sphere{ public static final int SPHERE1=1,SPHERE2=3,SPHERE3=5,SPHERES=20,SPHEREB=(-2); public double size; public int kind; public boolean appear; public Point3D p; public Image image; public Sphere(double x,double y,double z,double size,int kind){ p=new Point3D(x,y,z); this.size=size; appear=false; this.kind=kind; switch(kind){ case SPHERE1:image=Toolkit.getDefaultToolkit().getImage("sphere1.png");break; case SPHERE2:image=Toolkit.getDefaultToolkit().getImage("sphere2.png");break; case SPHERE3:image=Toolkit.getDefaultToolkit().getImage("sphere3.png");break; case SPHERES:image=Toolkit.getDefaultToolkit().getImage("sphereS.png");break; case SPHEREB:image=Toolkit.getDefaultToolkit().getImage("sphereB.png");break; } } public boolean judge(ViewPoint vp,int mx,int my){ if(appear){ Screens s=new Screens(vp,p); boolean j=(((s.x-mx)*(s.x-mx)+(s.y-my)*(s.y-my))<=(screensize(vp)*screensize(vp))); return j; } else return false; } public int screensize(ViewPoint vp){ double j,k; j=(vp.x-p.x);k=(p.y-vp.y); Screens sc1=new Screens(vp,new Point3D(p.x+size*k/Math.sqrt(j*j+k*k),p.y+size*j/Math.sqrt(j*j+k*k),p.z)); Screens sc2=new Screens(vp,p); return sc2.distance(sc1); } } class MyFrame extends Frame implements Runnable,MouseListener{ private final int TITLE=0,MAIN=1,SCORE=2,OPENING=3,QUIT=4; public int c=0,score=0,scene=OPENING; public double v1=80.0,v2=50.0,v3=100.0,r=0.0,t=0.0; public ViewPoint vp; public Point3D[][] points=new Point3D[411][4]; public Screens[][] sample=new Screens[10][4]; public Vector spV=new Vector(); Image ready,go,goal; public MyFrame(){ super(); try{ vp=new ViewPoint(new Point3D()); for(int i=0;i<101;i++){ points[i][0]=new Point3D(4.0,i*10,2.0); points[i][1]=new Point3D(4.0,i*10,-2.0); points[i][2]=new Point3D(-4.0,i*10,-2.0); points[i][3]=new Point3D(-4.0,i*10,2.0); } for(int i=1;i<11;i++){ points[i+100][0]=new Point3D(4.0,1000+i*9.887,i*1.5+2.0); points[i+100][1]=new Point3D(4.0,1000+i*9.887,i*1.5-2.0); points[i+100][2]=new Point3D(-4.0,1000+i*9.887,i*1.5-2.0); points[i+100][3]=new Point3D(-4.0,1000+i*9.887,i*1.5+2.0); } for(int i=1;i<71;i++){ points[i+110][0]=new Point3D(4.0,1098.87+i*10,15+2.0); points[i+110][1]=new Point3D(4.0,1098.87+i*10,15-2.0); points[i+110][2]=new Point3D(-4.0,1098.87+i*10,15-2.0); points[i+110][3]=new Point3D(-4.0,1098.87+i*10,15+2.0); } for(int i=1;i<16;i++){ points[i+180][0]=new Point3D(95.5-91.5*Math.cos(Math.toRadians(i*6)),1798.87+91.5*Math.sin(Math.toRadians(i*6)),15+2.0); points[i+180][1]=new Point3D(95.5-91.5*Math.cos(Math.toRadians(i*6)),1798.87+91.5*Math.sin(Math.toRadians(i*6)),15-2.0); points[i+180][2]=new Point3D(95.5-99.5*Math.cos(Math.toRadians(i*6)),1798.87+99.5*Math.sin(Math.toRadians(i*6)),15-2.0); points[i+180][3]=new Point3D(95.5-99.5*Math.cos(Math.toRadians(i*6)),1798.87+99.5*Math.sin(Math.toRadians(i*6)),15+2.0); } for(int i=1;i<16;i++){ points[i+195][0]=new Point3D(95.5+99.5*Math.sin(Math.toRadians(i*6)),1989.87-99.5*Math.cos(Math.toRadians(i*6)),15+2.0); points[i+195][1]=new Point3D(95.5+99.5*Math.sin(Math.toRadians(i*6)),1989.87-99.5*Math.cos(Math.toRadians(i*6)),15-2.0); points[i+195][2]=new Point3D(95.5+91.5*Math.sin(Math.toRadians(i*6)),1989.87-91.5*Math.cos(Math.toRadians(i*6)),15-2.0); points[i+195][3]=new Point3D(95.5+91.5*Math.sin(Math.toRadians(i*6)),1989.87-91.5*Math.cos(Math.toRadians(i*6)),15+2.0); } for(int i=1;i<16;i++){ points[i+210][0]=new Point3D(286.5-91.5*Math.cos(Math.toRadians(i*6)),1989.87+91.5*Math.sin(Math.toRadians(i*6)),15+2.0); points[i+210][1]=new Point3D(286.5-91.5*Math.cos(Math.toRadians(i*6)),1989.87+91.5*Math.sin(Math.toRadians(i*6)),15-2.0); points[i+210][2]=new Point3D(286.5-99.5*Math.cos(Math.toRadians(i*6)),1989.87+99.5*Math.sin(Math.toRadians(i*6)),15-2.0); points[i+210][3]=new Point3D(286.5-99.5*Math.cos(Math.toRadians(i*6)),1989.87+99.5*Math.sin(Math.toRadians(i*6)),15+2.0); } for(int i=1;i<16;i++){ points[i+225][0]=new Point3D(286.5+99.5*Math.sin(Math.toRadians(i*6)),2180.87-99.5*Math.cos(Math.toRadians(i*6)),15+2.0); points[i+225][1]=new Point3D(286.5+99.5*Math.sin(Math.toRadians(i*6)),2180.87-99.5*Math.cos(Math.toRadians(i*6)),15-2.0); points[i+225][2]=new Point3D(286.5+91.5*Math.sin(Math.toRadians(i*6)),2180.87-91.5*Math.cos(Math.toRadians(i*6)),15-2.0); points[i+225][3]=new Point3D(286.5+91.5*Math.sin(Math.toRadians(i*6)),2180.87-91.5*Math.cos(Math.toRadians(i*6)),15+2.0); } for(int i=1;i<21;i++){ points[i+240][0]=new Point3D(382+4.0,2180.87+i*10,15+2.0); points[i+240][1]=new Point3D(382+4.0,2180.87+i*10,15-2.0); points[i+240][2]=new Point3D(382-4.0,2180.87+i*10,15-2.0); points[i+240][3]=new Point3D(382-4.0,2180.87+i*10,15+2.0); } for(int i=1;i<41;i++){ points[i+260][0]=new Point3D(382+Math.sqrt(20.0)*Math.cos(Math.toRadians(i*18+26.565)),2380.87+i*10,15+Math.sqrt(20.0)*Math.sin(Math.toRadians(i*18+26.565))); points[i+260][1]=new Point3D(382+Math.sqrt(20.0)*Math.cos(Math.toRadians(i*18+26.565)),2380.87+i*10,15-Math.sqrt(20.0)*Math.sin(Math.toRadians(i*18+26.565))); points[i+260][2]=new Point3D(382-Math.sqrt(20.0)*Math.cos(Math.toRadians(i*18+26.565)),2380.87+i*10,15-Math.sqrt(20.0)*Math.sin(Math.toRadians(i*18+26.565))); points[i+260][3]=new Point3D(382-Math.sqrt(20.0)*Math.cos(Math.toRadians(i*18+26.565)),2380.87+i*10,15+Math.sqrt(20.0)*Math.sin(Math.toRadians(i*18+26.565))); } for(int i=1;i<5;i++){ points[i+300][0]=new Point3D(382+4.0,2780.87+i*9.682,15-i*2.5+2.0); points[i+300][1]=new Point3D(382+4.0,2780.87+i*9.682,15-i*2.5-2.0); points[i+300][2]=new Point3D(382-4.0,2780.87+i*9.682,15-i*2.5-2.0); points[i+300][3]=new Point3D(382-4.0,2780.87+i*9.682,15-i*2.5+2.0); } for(int i=1;i<5;i++){ points[i+304][0]=new Point3D(382+4.0,2819.6+i*9.682,5+i*2.5+2.0); points[i+304][1]=new Point3D(382+4.0,2819.6+i*9.682,5+i*2.5-2.0); points[i+304][2]=new Point3D(382-4.0,2819.6+i*9.682,5+i*2.5-2.0); points[i+304][3]=new Point3D(382-4.0,2819.6+i*9.682,5+i*2.5+2.0); } for(int i=1;i<5;i++){ points[i+308][0]=new Point3D(382+4.0,2858.33+i*9.682,15-i*2.5+2.0); points[i+308][1]=new Point3D(382+4.0,2858.33+i*9.682,15-i*2.5-2.0); points[i+308][2]=new Point3D(382-4.0,2858.33+i*9.682,15-i*2.5-2.0); points[i+308][3]=new Point3D(382-4.0,2858.33+i*9.682,15-i*2.5+2.0); } for(int i=1;i<5;i++){ points[i+312][0]=new Point3D(382+4.0,2897.06+i*9.682,5+i*2.5+2.0); points[i+312][1]=new Point3D(382+4.0,2897.06+i*9.682,5+i*2.5-2.0); points[i+312][2]=new Point3D(382-4.0,2897.06+i*9.682,5+i*2.5-2.0); points[i+312][3]=new Point3D(382-4.0,2897.06+i*9.682,5+i*2.5+2.0); } for(int i=1;i<5;i++){ points[i+316][0]=new Point3D(382+4.0,2935.79+i*9.682,15-i*2.5+2.0); points[i+316][1]=new Point3D(382+4.0,2935.79+i*9.682,15-i*2.5-2.0); points[i+316][2]=new Point3D(382-4.0,2935.79+i*9.682,15-i*2.5-2.0); points[i+316][3]=new Point3D(382-4.0,2935.79+i*9.682,15-i*2.5+2.0); } for(int i=1;i<21;i++){ points[i+320][0]=new Point3D(382+4.0,2974.52+i*10,5+2.0); points[i+320][1]=new Point3D(382+4.0,2974.52+i*10,5-2.0); points[i+320][2]=new Point3D(382-4.0,2974.52+i*10,5-2.0); points[i+320][3]=new Point3D(382-4.0,2974.52+i*10,5+2.0); } for(int i=1;i<21;i++){ points[i+340][0]=new Point3D(382+Math.sqrt(20.0)*Math.cos(Math.toRadians(i*18+26.565)),3174.52+i*10,5+Math.sqrt(20.0)*Math.sin(Math.toRadians(i*18+26.565))); points[i+340][1]=new Point3D(382+Math.sqrt(20.0)*Math.cos(Math.toRadians(i*18+154.435)),3174.52+i*10,5+Math.sqrt(20.0)*Math.sin(Math.toRadians(i*18+154.435))); points[i+340][2]=new Point3D(382+Math.sqrt(20.0)*Math.cos(Math.toRadians(i*18+206.565)),3174.52+i*10,5+Math.sqrt(20.0)*Math.sin(Math.toRadians(i*18+206.565))); points[i+340][3]=new Point3D(382+Math.sqrt(20.0)*Math.cos(Math.toRadians(i*18+334.435)),3174.52+i*10,5+Math.sqrt(20.0)*Math.sin(Math.toRadians(i*18+334.435))); } for(int i=1;i<31;i++){ points[i+360][0]=new Point3D(382+4.0,3374.52+i*7.071,5+2.0-i*7.071); points[i+360][1]=new Point3D(382+4.0,3374.52+i*7.071,5-2.0-i*7.071); points[i+360][2]=new Point3D(382-4.0,3374.52+i*7.071,5-2.0-i*7.071); points[i+360][3]=new Point3D(382-4.0,3374.52+i*7.071,5+2.0-i*7.071); } for(int i=1;i<21;i++){ points[i+390][0]=new Point3D(382+4.0,3586.65+i*10,-207.13+2.0); points[i+390][1]=new Point3D(382+4.0,3586.65+i*10,-207.13-2.0); points[i+390][2]=new Point3D(382-4.0,3586.65+i*10,-207.13-2.0); points[i+390][3]=new Point3D(382-4.0,3586.65+i*10,-207.13+2.0); } } catch(Exception e){ System.out.println(e); } ready=Toolkit.getDefaultToolkit().getImage("ready.png"); go=Toolkit.getDefaultToolkit().getImage("go.png"); goal=Toolkit.getDefaultToolkit().getImage("goal.png"); for(int i=0;i<5;i++){Sphere sp=new Sphere(4.0-2.0*i,500.0+i*80.0,2.0-i,3.0,Sphere.SPHERE1);spV.addElement(sp);} for(int i=0;i<2;i++){Sphere sp=new Sphere(4.0-2.0*i,1000.0+i*40.0,5.0+i*6,3.0,Sphere.SPHERE1);spV.addElement(sp);} for(int i=0;i<10;i++){Sphere sp=new Sphere(4.0-8.0*Math.random(),1098.87+i*60.0,17.0-4.0*Math.random(),2.0,Sphere.SPHERE1);spV.addElement(sp);} for(int i=1;i<3;i++){Sphere sp=new Sphere(95.5-91.5*Math.cos(Math.toRadians(i*30)),1798.87+91.5*Math.sin(Math.toRadians(i*30)),17.0-4.0*Math.random(),2.0,Sphere.SPHERE1);spV.addElement(sp);} for(int i=1;i<3;i++){Sphere sp=new Sphere(95.5+91.5*Math.sin(Math.toRadians(i*30)),1989.87-91.5*Math.cos(Math.toRadians(i*30)),17.0-4.0*Math.random(),2.0,Sphere.SPHERE1);spV.addElement(sp);} for(int i=1;i<3;i++){Sphere sp=new Sphere(286.5-91.5*Math.cos(Math.toRadians(i*30)),1989.87+91.5*Math.sin(Math.toRadians(i*30)),17.0-4.0*Math.random(),2.0,Sphere.SPHERE1);spV.addElement(sp);} for(int i=1;i<3;i++){Sphere sp=new Sphere(286.5+91.5*Math.cos(Math.toRadians(i*30)),2180.87+91.5*Math.sin(Math.toRadians(i*30)),17.0-4.0*Math.random(),2.0,Sphere.SPHERE1);spV.addElement(sp);} for(int i=0;i<1;i++){Sphere sp=new Sphere(286.5+91.5*Math.cos(Math.toRadians(45)),2180.87+91.5*Math.sin(Math.toRadians(45)),17.0-4.0*Math.random(),1.5,Sphere.SPHERE2);spV.addElement(sp);} for(int i=1;i<5;i++){Sphere sp=new Sphere(386-8.0*Math.random(),2180.87+i*100,17.0-4.0*Math.random(),2.0,Sphere.SPHERE1);spV.addElement(sp);} for(int i=0;i<3;i++){Sphere sp=new Sphere(386-8.0*Math.random(),2380.87+i*120,19.0-8.0*Math.random(),1.5,Sphere.SPHERE2);spV.addElement(sp);} for(int i=0;i<1;i++){Sphere sp=new Sphere(386-8.0*Math.random(),2620.87,19.0-8.0*Math.random(),1.0,Sphere.SPHERE3);spV.addElement(sp);} for(int i=0;i<2;i++){Sphere sp=new Sphere(386-8.0*Math.random(),2780.87+2*i*9.682,15-i*5.0+2.0,1.5,Sphere.SPHERE2);spV.addElement(sp);} for(int i=0;i<2;i++){Sphere sp=new Sphere(386-8.0*Math.random(),2819.6+2*i*9.682,5+i*5.0-2.0,1.5,Sphere.SPHEREB);spV.addElement(sp);} for(int i=0;i<2;i++){Sphere sp=new Sphere(386-8.0*Math.random(),2858.33+2*i*9.682,15-i*5.0+2.0,1.5,Sphere.SPHERE2);spV.addElement(sp);} for(int i=0;i<2;i++){Sphere sp=new Sphere(386-8.0*Math.random(),2897.06+2*i*9.682,5+i*5.0-2.0,1.5,Sphere.SPHEREB);spV.addElement(sp);} for(int i=0;i<2;i++){Sphere sp=new Sphere(386-8.0*Math.random(),2935.79+2*i*9.682,15-i*5.0+2.0,1.5,Sphere.SPHERE2);spV.addElement(sp);} for(int i=1;i<8;i++){Sphere sp=new Sphere(386-8.0*Math.random(),2974.52+i*50,9.0-8.0*Math.random(),2.0,Sphere.SPHERE1);spV.addElement(sp);} for(int i=0;i<5;i++){Sphere sp=new Sphere(386-8.0*Math.random(),3054.52+i*50,9.0-8.0*Math.random(),1.5,Sphere.SPHERE2);spV.addElement(sp);} for(int i=0;i<3;i++){Sphere sp=new Sphere(386-8.0*Math.random(),3024.52+i*120,9.0-8.0*Math.random(),1.0,Sphere.SPHERE3);spV.addElement(sp);} Sphere sp=new Sphere(378.0,3686.65,-209.13,1.5,Sphere.SPHERES);spV.addElement(sp); setSize(600,600); setVisible(true); addMouseListener(this); } public void run(){ while(scene!=QUIT){ switch(scene){ case OPENING:opening(); case TITLE:title();break; case MAIN:System.out.println("start");game();break; case SCORE:scoretable(); } } System.exit(0); } public void opening(){scene=TITLE;} public void title(){repaint();} public void scoretable(){repaint();} public void game(){ while(true){ try{Thread.sleep(20);} catch(Exception e){} t+=20.0; if((t-1)<(1000.0*(1000.0/v1)))vp=new ViewPoint(0.0,v1*t/1000.0,0.0); else if((t-1)<(1000.0*(1000.0/v1+100.0/v2)))vp=new ViewPoint(0.0,1000.0+v2*(t-(1000.0*(1000.0/v1)))*0.9887/1000.0,v2*(t-(1000.0*(1000.0/v1)))*0.15/1000.0); else if((t-1)<(1000.0*(1700.0/v1+100.0/v2)))vp=new ViewPoint(0.0,1098.87+v1*(t-1000.0*(1000.0/v1+100.0/v2))/1000.0,15.0); else if((t-1)<(1000.0*(1850.0/v1+100.0/v2)))vp=new ViewPoint(95.5*(1.0-Math.cos(Math.toRadians((t-1000.0*(1700.0/v1+100.0/v2))*v1*6.0/10000.0))),1798.87+95.5*Math.sin(Math.toRadians((t-1000.0*(1700.0/v1+100.0/v2))*v1*6.0/10000.0)),15.0,Math.sin(Math.toRadians((t-1000.0*(1700.0/v1+100.0/v2))*v1*6.0/10000.0)),Math.cos(Math.toRadians((t-1000.0*(1700.0/v1+100.0/v2))*v1*6.0/10000.0)),0.0); else if((t-1)<(1000.0*(2000.0/v1+100.0/v2)))vp=new ViewPoint(95.5*(1.0+Math.sin(Math.toRadians((t-1000.0*(1850.0/v1+100.0/v2))*v1*6.0/10000.0))),1989.87-95.5*Math.cos(Math.toRadians((t-1000.0*(1850.0/v1+100.0/v2))*v1*6.0/10000.0)),15.0,Math.cos(Math.toRadians((t-1000.0*(1850.0/v1+100.0/v2))*v1*6.0/10000.0)),Math.sin(Math.toRadians((t-1000.0*(1850.0/v1+100.0/v2))*v1*6.0/10000.0)),0.0); else if((t-1)<(1000.0*(2150.0/v1+100.0/v2)))vp=new ViewPoint(191.0+95.5*(1.0-Math.cos(Math.toRadians((t-1000.0*(2000.0/v1+100.0/v2))*v1*6.0/10000.0))),1989.87+95.5*Math.sin(Math.toRadians((t-1000.0*(2000.0/v1+100/v2))*v1*6.0/10000.0)),15.0,Math.sin(Math.toRadians((t-1000.0*(2000.0/v1+100.0/v2))*v1*6.0/10000.0)),Math.cos(Math.toRadians((t-1000.0*(2000.0/v1+100.0/v2))*v1*6.0/10000.0)),0.0); else if((t-1)<(1000.0*(2300.0/v1+100.0/v2)))vp=new ViewPoint(191.0+95.5*(1.0+Math.sin(Math.toRadians((t-1000.0*(2150.0/v1+100.0/v2))*v1*6.0/10000.0))),2180.87-95.5*Math.cos(Math.toRadians((t-1000.0*(2150.0/v1+100/v2))*v1*6.0/10000.0)),15.0,Math.cos(Math.toRadians((t-1000.0*(2150.0/v1+100.0/v2))*v1*6.0/10000.0)),Math.sin(Math.toRadians((t-1000.0*(2150.0/v1+100.0/v2))*v1*6.0/10000.0)),0.0); else if((t-1)<(1000.0*(2900.0/v1+100.0/v2)))vp=new ViewPoint(382.0,2180.87+v1*(t-1000.0*(2300.0/v1+100.0/v2))/1000.0,15.0); else if((t-1)<(1000.0*(2940.0/v1+100.0/v2)))vp=new ViewPoint(382.0,2780.87+v1*(t-1000.0*(2900.0/v1+100.0/v2))*0.9682/1000.0,15.0-v1*(t-1000.0*(2900.0/v1+100.0/v2))*0.25/1000.0); else if((t-1)<(1000.0*(2980.0/v1+100.0/v2)))vp=new ViewPoint(382.0,2819.60+v1*(t-1000.0*(2940.0/v1+100.0/v2))*0.9682/1000.0,5.0+v1*(t-1000.0*(2940.0/v1+100.0/v2))*0.25/1000.0); else if((t-1)<(1000.0*(3020.0/v1+100.0/v2)))vp=new ViewPoint(382.0,2858.33+v1*(t-1000.0*(2980.0/v1+100.0/v2))*0.9682/1000.0,15.0-v1*(t-1000.0*(2980.0/v1+100.0/v2))*0.25/1000.0); else if((t-1)<(1000.0*(3060.0/v1+100.0/v2)))vp=new ViewPoint(382.0,2897.06+v1*(t-1000.0*(3020.0/v1+100.0/v2))*0.9682/1000.0,5.0+v1*(t-1000.0*(3020.0/v1+100.0/v2))*0.25/1000.0); else if((t-1)<(1000.0*(3100.0/v1+100.0/v2)))vp=new ViewPoint(382.0,2935.79+v1*(t-1000.0*(3060.0/v1+100.0/v2))*0.9682/1000.0,15.0-v1*(t-1000.0*(3060.0/v1+100.0/v2))*0.25/1000.0); else if((t-1)<(1000.0*(3500.0/v1+100.0/v2)))vp=new ViewPoint(382.0,2974.52+v1*(t-1000.0*(3100.0/v1+100.0/v2))/1000,5); else if((t-1)<(1000.0*(3500.0/v1+100.0/v2+300.0/v3)))vp=new ViewPoint(382.0,3374.52+v3*(t-(1000.0*(3500.0/v1+100.0/v2)))*0.7071/1000.0,5-v3*(t-(1000.0*(3500.0/v1+100.0/v2)))*0.7071/1000.0); else if((t-1)<(1000.0*(3600.0/v1+100.0/v2+300.0/v3)))vp=new ViewPoint(382.0,3586.65+v1*(t-1000.0*(3500.0/v1+100.0/v2+300.0/v3))/1000.0,-207.13); else break; if(t>(1000*(1000/v1)) & t<=(1000*(1000/v1+100/v2)))r+=v2*0.02; else if(t>(1000*(3500/v1+100/v2)) & t<=(1000*(3500/v1+100/v2+300/v3)))r+=v3*0.02; else r+=v1*0.02; c=(int)Math.ceil((r+1)*0.1); try{ for(int i=0;i<10;i++){ for(int k=0;k<4;k++)sample[i][k]=new Screens(vp,points[i+c][k]); } } catch(ArrayIndexOutOfBoundsException e){} int size=spV.size(); for(int i=size-1;i>=0;i--){ Sphere sp1=(Sphere)spV.elementAt(i); if(sp1.screensize(vp)>=(int)sp1.size*150){spV.removeElementAt(i);System.out.println("?");} } repaint(); } scene=SCORE; } Image offScreenImage; Graphics offScreenGraphics; public void update(Graphics g){ if(offScreenImage==null){ offScreenImage=createImage(600,600); offScreenGraphics=offScreenImage.getGraphics(); } paint(offScreenGraphics); g.drawImage(offScreenImage,0,0,this); } public void paint(Graphics g){ switch(scene){ case OPENING: case TITLE: g.setColor(Color.black); g.fillRect(0,0,600,600); g.setColor(Color.white); g.setFont(new Font("Arial",Font.BOLD,35)); FontMetrics fm=getFontMetrics(g.getFont()); g.drawString("SHOOTING GAME!",(600-fm.stringWidth("SHOOTING GAME!"))/2,250); g.setFont(new Font("Arial",Font.BOLD,28)); fm=getFontMetrics(g.getFont()); g.drawString("EASY",(600-fm.stringWidth("EASY"))/2,360); g.drawString("NORMAL",(600-fm.stringWidth("NORMAL"))/2,400); g.drawString("HARD",(600-fm.stringWidth("HARD"))/2,440); g.setFont(new Font("Arial",Font.BOLD,12)); fm=getFontMetrics(g.getFont()); g.drawString("produced by 341062H",(600-fm.stringWidth("produced by 341062H"))/2,520); break; case SCORE: g.setColor(Color.black); g.fillRect(0,0,600,600); g.setColor(Color.white); g.setFont(new Font("Arial",Font.BOLD,35)); fm=getFontMetrics(g.getFont()); g.drawString("YOUR SCORE:"+score,(600-fm.stringWidth("YOUR SCORE:"+score))/2,250); g.setFont(new Font("Arial",Font.BOLD,28)); fm=getFontMetrics(g.getFont()); g.drawString("NEW GAME",(600-fm.stringWidth("NEW GAME"))/2,400); g.drawString("QUIT",(600-fm.stringWidth("QUIT"))/2,440); break; case MAIN: g.setColor(Color.white); g.fillRect(0,0,600,600); for(int i=0;i<10;i++){ int[] x=new int[4],y=new int[4]; for(int k=0;k<4;k++){ x[k]=sample[i][k].x; y[k]=sample[i][k].y; } g.setColor(Color.black); g.drawPolygon(x,y,4); } int size=spV.size(); for(int i=size-1;i>=0;i--){ Sphere sp2=(Sphere)spV.elementAt(i); if(sp2.screensize(vp)>5){ sp2.appear=true; Screens sc=new Screens(vp,sp2.p); g.drawImage(sp2.image,sc.x-sp2.screensize(vp),sc.y-sp2.screensize(vp),2*sp2.screensize(vp),2*sp2.screensize(vp),this); } } if(t>500&t<=1500)g.drawImage(ready,200,220,this); else if(t>1600&t<=2400)g.drawImage(go,200,220,this); if(r>3900)g.drawImage(goal,200,220,this); } } public void mousePressed(MouseEvent e){ int mx=e.getX(),my=e.getY();System.out.println(mx+":"+my); FontMetrics fm=getFontMetrics(new Font("Arial",Font.BOLD,28)); if(scene==TITLE){ if((my<360&my>360-fm.getHeight())&(mx>(600-fm.stringWidth("EASY"))/2&mx<(600+fm.stringWidth("EASY"))/2)){ v1=50.0; v2=40.0; v3=80.0;System.out.println(v1+":"+v2+":"+v3);scene=MAIN; } else if((my<400&my>400-fm.getHeight())&(mx>(600-fm.stringWidth("NORMAL"))/2&mx<(600+fm.stringWidth("NORMAL"))/2)){ v1=80.0; v2=50.0; v3=100.0;System.out.println(v1+":"+v2+":"+v3);scene=MAIN; } else if((my<440&my>440-fm.getHeight())&(mx>(600-fm.stringWidth("HARD"))/2&mx<(600+fm.stringWidth("HARD"))/2)){ v1=100.0; v2=80.0; v3=120.0;System.out.println(v1+":"+v2+":"+v3);scene=MAIN; } } else if(scene==MAIN){ int size=spV.size(); int k=0; for(int i=size-1;i>=0;i--){ Sphere sp3=(Sphere)spV.elementAt(i); if(sp3.judge(vp,mx,my)){ spV.removeElementAt(i); score+=sp3.kind*100;k++; } } if(k==0)score-=10; } else if(scene==SCORE){ if((my<440&my>440-fm.getHeight())&(mx>(600-fm.stringWidth("QUIT"))/2&mx<(600+fm.stringWidth("QUIT"))/2)){ scene=QUIT; } } } public void mouseReleased(MouseEvent e){} public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public static void main(String args[]){ MyFrame frame=new MyFrame(); Thread th=new Thread(frame); th.start(); } }