// <applet code="FullBall2" width="400" height="400"></applet>
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class FullBall2 extends Applet implements Runnable
{
//position of the ball
int x_pos = 12;
int y_pos = 12;
//ball size
int radius = 5;
//ball direction
int x_speed = 6;
int y_speed = 8;
//position of the slider
int sliderx_pos = 50;
int slidery_pos = 150;
//size of slider
int swidth = 60;
int sheight = 1;
Rectangle box = new Rectangle(swidth, sheight);
//slider direcion
int sliderx_speed = 0;
//applet size
// These spatial definitions are not correct:
// Component origin (0,0) is at upper left.
// getHeight = bottom of component.
// getHeight returns zero at this point in
// program execution.
int appletsize_top = //getHeight();
0;
// bottom would be 200 px below bottom of component.
int appletsize_bottom = //appletsize_top + 20 * 10;
200;
// getWidth = width/far right of component.
// Since the applet has not been realized, ie, made
// visible, this call to getWidth returns zero.
int appletsize_left = //getWidth();
0;
// right would be 350 past right edge of component.
int appletsize_right = //appletsize_left + 35 * 10;
350;
//level stuff
int lx_pos = 100;
int ly_pos = appletsize_top +20;
int lwidth = 50;
int lheight = 1;
// If you move this only once you can specify the location here.
Rectangle brick = new Rectangle(lx_pos, ly_pos, lwidth, lheight);
//random movement
Random rnd = new Random ();
//Drawing image off screen
private Image dbImage;
private Graphics dbg;
Thread thread;
boolean running = false;
public void init()
{
enableEvents(AWTEvent.KEY_EVENT_MASK);
setFocusable(true);
}
public void start ()
{
// define a new thread
running = true;
thread = new Thread (this);
// start this thread
thread.start();
}
public void stop()
{
running = false;
if(thread != null)
thread.interrupt();
thread = null;
}
public void run ()
{
while (running)
{
//change direct if the ball hits the left or right wall
// stop ball if out
if (x_pos - radius + x_speed < appletsize_left ||
x_pos + radius + x_speed > appletsize_right )
{
x_speed *= -1;
}
if (y_pos - radius + y_speed < appletsize_top)
{
y_speed *= -1;
}
if(y_pos + radius + y_speed > appletsize_bottom )
{
// Reposition ball to avoid overshooting boundry
// as a consequence of high speed value.
y_pos = appletsize_bottom - radius;
y_speed *= -1;
// stop();
}
// What to do if we will hit the top of the slider on the
// next frame, ie, after the next trip through this method.
if(x_pos + radius + x_speed > sliderx_pos &&
x_pos - radius + x_speed < sliderx_pos + swidth)
{
// Ball is in vertical plane of slider.
// Check for possible contact.
if(y_pos + radius + y_speed > slidery_pos)
{
// We have an imminent collision -> bounce!
y_speed *= -1;
}
}
// What to do if we will hit the bottom of the
// brick the next time through.
if(x_pos + radius + x_speed > lx_pos &&
x_pos - radius + x_speed < lx_pos + lwidth)
{
// Ball is in vertical plane of brick.
// Check for contact on underside of brick.
if(y_pos - radius /*+ y_speed*/ < ly_pos + brick.height)
{
// We have an imminent collision -> bounce!
y_speed *= -1;
// The ball disappeared because some of the
// signs above were reversed which caused a
// false/erroneous positive for collision.
System.out.println("brick being removed");
lx_pos = 10000;
ly_pos = 10000;
brick.setLocation(lx_pos, lx_pos);
}
}
x_pos += x_speed;
y_pos += y_speed;
//repaint applet
repaint();
try
{
// Stop thread for the speed
Thread.sleep (90);
}
catch (InterruptedException ex)
{
running = false;
break;
}
}
}
//create an image off screen and loads it into the applet
public void update (Graphics g)
{
// initialize buffer
if (dbImage == null)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
}
// clear screen in background
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
// draw elements in background
dbg.setColor (getForeground());
paint (dbg);
// draw image on the screen
g.drawImage (dbImage, 0, 0, this);
}
public void paint (Graphics g)
{
// Show right and lower boundries to help in
// adjusting animation variables.
g.drawLine(appletsize_right, appletsize_top,
appletsize_right, appletsize_bottom);
g.drawLine(appletsize_left, appletsize_bottom,
appletsize_right, appletsize_bottom);
//DRAWING THE BALL
Graphics2D g2 = (Graphics2D) g;
g.setColor (Color.red);
g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
//DRAWING THE SLIDER
box.setLocation(sliderx_pos, slidery_pos);
g2.setColor (Color.blue);
g2.draw(box);
//DRAWING THE BRICKS
g2.setColor (Color.pink);
g2.draw(brick);
}
protected void processKeyEvent(KeyEvent e)
{
int keyCode = e.getKeyCode();
//move if left key is pressed
if (keyCode == KeyEvent.VK_LEFT)
{
if (sliderx_pos -10 > appletsize_left)
sliderx_pos = sliderx_pos -20;
}
//move if right key is pressed
else if (keyCode == KeyEvent.VK_RIGHT)
{
if (sliderx_pos + swidth +10 < appletsize_right)
sliderx_pos = sliderx_pos +20;
}
}
}