import java.applet.*; import java.awt.*; import java.util.*; public class BallTrack implements Runnable { public static final int SLEEP = 10; public static final int MaxAngle = 30, MinAngle = 2; public int NoofBall; public int curBall; Color Barcolor = Color.red; PBall Ball[]; int Tx, Ty, Tw, Th; int MaxTop, MinTop; boolean Ready = false; Thread trackthread; Game parent; public BallTrack (Game p, PBall b[]) { parent = p; setBall (b); resetTBar (); } public void setBall (PBall b[]) { Ball = b; NoofBall = Ball.length; curBall = 0; } public void setReady () { Ready = true; } public void BallReady () { // Graphics g = parent.getGraphics(); int i, j; i = curBall; if (i < NoofBall) { Ball[i].setBallXY (415-(PBall.ria+3), 275-PBall.ria-3); // Ball[i].drawBall (Ball[i].fc, Ball[i].cc); } // synchronized (g) { // g.setColor (Color.black); // g.fillRect (415-2*(PBall.ria+3), 310, 2*(PBall.ria+3), 360); // } i++; if (i < NoofBall) { for (j=i; j MaxTop) { // drawTBar (Color.black); Ty--; // drawTBar (Barcolor); } } public boolean insideTBar (int x, int y) { Rectangle rect; boolean in = false; rect = new Rectangle (Tx, Ty, Tw, Th); in = rect.inside (x, y); return (in); } public void delay () { try { Thread.sleep (SLEEP); } catch (InterruptedException e) {}; } public void start () { if (trackthread == null) { trackthread = new Thread(this); trackthread.start (); } else if (!trackthread.isAlive()) { trackthread = null; trackthread = new Thread(this); trackthread.start (); } } public void run () { int curX, curY, curAngle, curStep; double curXValue, curYValue; curAngle = MaxAngle * (Ty - MaxTop)/(MinTop - MaxTop); if (curAngle == 0) curAngle = MinAngle; curStep = (275-PBall.ria-2-250) * (Ty - MaxTop)/(MinTop - MaxTop); if (curStep == 0) curStep = 1; curXValue = -1 * (PBall.MAXSPEED-2) * (Ty - MaxTop)/(MinTop - MaxTop); if (curXValue == 0) curXValue = -1; curYValue = Math.random () * 3; if (curYValue == 0) curYValue = 1; while (Ty > MaxTop) { UpTBar (); delay (); } if (Ready) { curX = 415-(PBall.ria+3); curY = 275-PBall.ria-2; while (curY > 260) { // Ball[curBall].drawBall (Ball[curBall].bc, Ball[curBall].bc); curY -= curStep; Ball[curBall].setBallXY (curX, curY); // Ball[curBall].drawBall (Ball[curBall].fc, Ball[curBall].cc); delay (); } for (int i=0; i<=90; i+=curAngle) { // Ball[curBall].drawBall (Ball[curBall].bc, Ball[curBall].bc); curX = (int) (365 + (50 - (PBall.ria+3)) * Math.cos(Direction.getRand(i))); curY = (int) (260 - (50 - (PBall.ria+3)) * Math.sin(Direction.getRand(i))); Ball[curBall].setBallXY (curX, curY); // Ball[curBall].drawBall (Ball[curBall].fc, Ball[curBall].cc); delay (); } curX = 365-(PBall.ria+3); // Ball[curBall].drawBall (Ball[curBall].bc, Ball[curBall].bc); Ball[curBall].setBallXY (curX, curY); // Ball[curBall].drawBall (Ball[curBall].fc, Ball[curBall].cc); while (curX > 345) { // Ball[curBall].drawBall (Ball[curBall].bc, Ball[curBall].bc); curX -= curStep; Ball[curBall].setBallXY (curX, curY); // Ball[curBall].drawBall (Ball[curBall].fc, Ball[curBall].cc); delay (); } curX = 345-(PBall.ria+3); // Ball[curBall].drawBall (Ball[curBall].bc, Ball[curBall].bc); Ball[curBall].setBallXY (curX, curY); // Ball[curBall].drawBall (Ball[curBall].fc, Ball[curBall].cc); Ball[curBall].setBallXYValue (curXValue, curYValue); Ball[curBall].start (); curBall++; if (curBall < NoofBall) BallReady (); else Ready = false; } } public void stop () { if ((trackthread != null) && trackthread.isAlive()) trackthread.stop(); trackthread = null; } }