import java.applet.Applet; import java.awt.event.*; import java.awt.*; public class test1 extends Applet { MotionCanvas X; Animator A; ControlCanvas C; public void init() { setBackground(Color.blue); A=new Animator(); X=new MotionCanvas(); C=new ControlCanvas(); A=A.addMotionCanvas(X); X=X.addAnimator(A); C=C.addAnimator(A); C=C.addMotionCanvas(X); X.resize(200,200); C.resize(120,200); X.setBackground(Color.black); C.setBackground(new Color(50,50,150)); add(C); add(X); try { A.start(); } catch(Exception e) { System.out.println(e.toString()); } } } class DBCanvas extends Canvas { public void update(Graphics g) { Graphics g2; Image offscreen = null; offscreen = createImage(size().width, size().height); g2 = offscreen.getGraphics(); paint(g2); g.drawImage(offscreen, 0, 0, this); g2.dispose(); offscreen.flush(); } } class MotionCanvas extends DBCanvas implements MouseListener, MouseMotionListener { Animator A; double mesh; Tadpole W; MotionCanvas() { setBackground(Color.black); addMouseListener(this); addMouseMotionListener(this); mesh=0.0; Color C[]=new Color[5]; double X[]=new double[5]; double Y[]=new double[5]; double r[]=new double[15]; X[1]=125.0; //xpos Y[1]=125.0; //ypos X[2]=125.0; //goal xpos Y[2]=125.0; //goal ypos r[1]=12.0; //radius r[2]=30.0; //tail length r[3]=2.0; //tail vibration r[4]=3.0; //eye size r[5]=6.0; //speed C[1]=Color.orange; //body color C[2]=Color.green; //tail color C[3]=Color.blue; //eye color W=new Tadpole(X,Y,r,C); } MotionCanvas addAnimator(Animator A) { MotionCanvas Y=this; Y.A=A; return(Y); } public void paint(Graphics g) { W.render(g); } public void mouseDragged (MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseClicked(MouseEvent e) { e.consume(); W.X[2]=e.getX(); W.Y[2]=e.getY(); } public void mouseExited(MouseEvent e) { } public void mouseMoved(MouseEvent e) { e.consume(); W.eye.x=e.getX(); W.eye.y=e.getY(); } } class Tadpole { double[] X,Y; double r[]; Color C[]; Point eye; int state; //state of tadpole double mod; //periodic motion Tadpole(double[] X,double[] Y,double r[],Color C[]) { this.X=X; this.Y=Y; this.r=r; this.C=C; eye=new Point(); eye.x=-125; eye.y=-125; state=0; mod=0.0; } void render(Graphics g) { double x,y,c,s,ii; double ex,ey,er,gx1,gy1,gr1,gx2,gy2,gr2; int opt,x1,x2,y1,y2,x3,y3,x4,y4; x=X[1]; y=Y[1]; /******body******/ g.setColor(C[1]); x1=(int)(x); y1=(int)(y); x2=(int)(r[1]); g.fillOval(x1-x2,y1-x2,2*x2,2*x2); g.drawOval(x1-x2,y1-x2,2*x2,2*x2); /****************/ /***the eye****/ opt=0; g.setColor(C[3]); ex=eye.x-x; ey=eye.y-y; er=Math.sqrt(ex*ex+ey*ey); if(er>r[1]-r[4]) { ex=.6*ex/er; ey=.6*ey/er; x1=(int)(x+r[1]*ex); y1=(int)(y+r[1]*ey); } if(er<=r[1]-r[4]) { opt=1; x1=(int)(eye.x); y1=(int)(eye.y); } g.fillOval((int)(x1-r[4]),(int)(y1-r[4]),(int)(2*r[4]),(int)(2*r[4])); g.drawOval((int)(x1-r[4]),(int)(y1-r[4]),(int)(2*r[4]),(int)(2*r[4])); /*************/ /*******goal*****/ g.setColor(Color.red); if(state==2) g.fillOval((int)(X[2]-4),(int)(Y[2]-4),8,8); /***************/ /********tail********/ g.setColor(C[2]); gr1=1.0; gr2=1.0; gx1=0.0; gy1=0.0; gx2=0.0; gy2=0.0; if(state==0) { gx1=-ex/.7; gy1=-ey/.7; gr1=1.0; gx2=gx1; gy2=gy1; } if(state!=0) { gx1=X[2]-X[1]; gy1=Y[2]-Y[1]; gr1=Math.sqrt(gx1*gx1+gy1*gy1); gx1=-gx1/gr1; gy1=-gy1/gr1; gx2=gx1-.4*gy1*Math.cos(2*Math.PI*mod); gy2=gy1+.4*gx1*Math.cos(2*Math.PI*mod); } x3=(int)(x+r[1]*gx1); y3=(int)(y+r[1]*gy1); x4=(int)(x+r[1]*gx1+r[2]*gx2); y4=(int)(y+r[1]*gy1+r[2]*gy2); if(opt==0) g.drawLine(x3,y3,x4,y4); } Tadpole update() { double dist; double x,y; Tadpole T=this; dist=(X[1]-X[2])*(X[1]-X[2])+(Y[1]-Y[2])*(Y[1]-Y[2]); dist=Math.sqrt(dist); if(dist>r[1]) state=2; if((dist<=r[1])&&(dist>1.5*r[5])) state=1; if(dist<1.5*r[5]) state=0; if(state==0) { T.X[1]=X[2]; T.Y[1]=Y[2]; } if(state!=0) { x=(X[2]-X[1])/dist; y=(Y[2]-Y[1])/dist; T.X[1]=X[1]+r[5]*x; T.Y[1]=Y[1]+r[5]*y; } T.mod=mod+.01*r[3]; return(T); } } class ControlCanvas extends Canvas implements MouseListener, MouseMotionListener { Animator A; MotionCanvas X; int stop; ControlCanvas() { addMouseListener(this); addMouseMotionListener(this); stop=0; } ControlCanvas addMotionCanvas(MotionCanvas X) { ControlCanvas B=this; B.X=X; return(B); } ControlCanvas addAnimator(Animator A) { ControlCanvas B=this; B.A=A; return(B); } public void paint(Graphics g) { int x1,x2; x1=(int)(X.W.r[5]*10); x2=(int)(X.W.r[3]*10); g.setColor(Color.black); g.fillRect(0,0,20,160); g.fillRect(99,0,20,160); g.setColor(Color.white); g.setFont(new Font("TimesRoman",Font.PLAIN,15)); g.drawRect(0,0,20,160); g.drawRect(99,0,20,160); g.setColor(Color.red); g.drawRect(1,x1-1,18,2); g.drawRect(100,x2-1,18,2); g.setColor(Color.yellow); g.setFont(new Font("TimesRoman",Font.PLAIN,18)); g.drawString("Rich:",25,20); g.drawString("Applet 22",25,40); g.setFont(new Font("TimesRoman",Font.PLAIN,15)); g.setColor(Color.white); g.drawString("click on the screen",2,180); g.drawString("to summon tadpole",2,195); } public void mouseDragged (MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseClicked(MouseEvent e) { e.consume(); Point p=new Point(); p.x=e.getX(); p.y=e.getY(); if((p.x>100)&&(p.x<120)&&(p.y>0)&&(p.y<200)) { X.W.r[3]=p.y/10.0; repaint(0,0,120,200); } if((p.x>0)&&(p.x<20)&&(p.y>0)&&(p.y<200)) { X.W.r[5]=p.y/10.0; repaint(0,0,120,200); } } } class Animator extends Thread { MotionCanvas X; public void run() { while(true) { X.W=X.W.update(); X.repaint(); try {sleep(30);} catch(Exception e) { System.out.println(e.toString()); } } } Animator addMotionCanvas(MotionCanvas X) { Animator B=this; B.X=X; return(B); } }