-
Help rid ball trailing colors in balls bounce
Hello,
Please understand that I am new to Java and this is my homework assignment. Therefore please do not give me the coded answer. Please do give me hints, guidance to get me going in the right direction.
My applet correctly displays balls of different colors traveling around the applet area. The number of balls is defined in the html file. The balls bounce off the applet "walls" as they should and pass through each other as they should. However, each ball leaves its trailing color.
I have tried this in run():
1. set the ball color to the background color.
2. repaint
3. move the ball
4. set the ball color to its original color.
5. repaint.
This didn't work as it just gave me the same results as if those 5 steps didn't exist in run().
Please guide me on how to get rid of the trailing colors. Thank you very much in advance.
Code:
/* Part 2: Write a second applet that bounces multiple balls;
* the number is specified by a parameter in the HTML file.
* Assign different colours to different balls
* (you can have 10 unique colours and re-use colours after that).
* The balls can move independently, passing through each other.
* Each should have its own thread.
*
* 1. DONE - loop through however many balls are specified in html file creating a thread for each in an array.
* 2. DONE - The array size is dictated by the "balls" parameter in the html file.
* 3. DONE - Create an enum with 10 different colors.
* 4. Need to track what enum value we have used or should use next.
* 5. Need to check if the enum value has hit 10 then reset to 1.
* 6. Need to be able to associate the color value with the thread.
*
* int numLines = Integer.parseInt(getParameter("lines"));
*/
import java.applet.*;
import java.awt.*;
import java.util.Random;
class Ball{
Graphics g;
int x;
int y;
int xmove; // x movement
int ymove; // y movement
int radius;
Color bColor;
private final Random generator = new Random();
public Ball(Color c){
x = generator.nextInt(400);
y = generator.nextInt(400);
// calculate random direction (and speed)
xmove = generator.nextInt(5)+1;
ymove = generator.nextInt(5)+1;
radius = 10;
bColor = c;
}// end constructor Ball
public void paint(Graphics graphik){
g = graphik;
g.setColor(bColor);
g.fillOval(x-radius, y-radius, 2*radius, 2*radius);
}// end method paint
public void moveBall(){
if ((x - radius + xmove < 0) || (x + radius + xmove > 400)){
xmove = -xmove;
}
if ((y - radius + ymove < 0) || (y + radius + ymove > 400)){
ymove = -ymove;
}
// recalulate the x,y coordinates of the circle
x+=xmove;
y+=ymove;
}// end method moveBall
}// end class ball
public class BallsBounce extends Applet implements Runnable{
Thread th;
int numBalls;
Graphics graphic;
Image img;
Ball balls[];
private Color Colors[] = {Color.GRAY, Color.BLUE, Color.ORANGE, Color.CYAN, Color.BLACK, Color.MAGENTA, Color.GREEN, Color.PINK, Color.YELLOW, Color.RED};
Color ballColor[];
int c; // count the colors used
public void init(){
setBackground(Color.LIGHT_GRAY);
numBalls = Integer.parseInt(getParameter("balls"));
img = createImage(getWidth(),getHeight());
graphic = img.getGraphics();
balls = new Ball[numBalls];
ballColor = new Color[numBalls];
for (int i=0; i<numBalls; i++){
if (c >= 10){
c=0;
}// end if
ballColor[i] = Colors[c];
balls[i]=new Ball(ballColor[i]);
c++;
}// end for
}// end method init
public void start(){
if(th == null){
th = new Thread(this);
th.start();
}// end if
}// end method start
public void run(){
while(true){
for (int j=0; j<numBalls; j++){
balls[j].moveBall();
repaint();
}// end for
try{
th.sleep(20);
}// end try
catch(InterruptedException except){
}// end catch
}// end while
}// end method run
public void paint(Graphics g){
for (int k=0; k<numBalls; k++){
balls[k].paint(graphic);
}// end for
g.drawImage(img, 10,10,this);
}// end method paint
}// end class BallsBounce
-
Since you've overridden the applet's paint method and are only drawing the balls, nothing is technically clearing the screen. You can either draw a solid box over the displayed area prior to painting the balls, or you could try calling super.paint() from the applet's paint method.
As a side note, after you get this corrected, if you get flickering you'll want to look into "double buffering" the graphics. You could also look into extending Canvas and drawing on that instead.
Similar Threads
-
Replies: 1
Last Post: 10-07-2005, 08:51 AM
-
Replies: 1
Last Post: 03-11-2001, 08:06 PM
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
Forum Rules
|
Top DevX Stories
Easy Web Services with SQL Server 2005 HTTP Endpoints
JavaOne 2005: Java Platform Roadmap Focuses on Ease of Development, Sun Focuses on the "Free" in F.O.S.S.
Wed Yourself to UML with the Power of Associations
Microsoft to Add AJAX Capabilities to ASP.NET
IBM's Cloudscape Versus MySQL
|
Bookmarks