Ians Final Project

<< Ethan's Final Project | OldProjectsTrailIndex | Joseph's Final Project >>

Requires the boing.wav file found under Fr. Chris's Bounce under Final Projects

Click here for a working demonstration

boing.wav

CrazyBall.java

import java.awt.event.*; 
import java.applet.Applet;
import java.awt.*;
import javax.swing.*;


public class CrazyBall extends Applet implements  ActionListener, MouseMotionListener
{
	Sound boing;
    Timer timer;
    Image virtualMem;
    Graphics gBuffer;
    Ball ball1, ball2, ball3, ball4;
    Player player1;
    Wall top,bottom,left,right;
    int appletWidth;        
    int appletHeight; 
    int frame;
    int lastFrame;
    Button myButton;
    int count;
    int score;

    // OUR CLASS IS A SUBCLASS OF APPLET
    /**
     * this init() method will be run at the beginning
     * and where we create the Listeners 
     */
    public void init()
    {
        boing = new Sound("boing.wav",this);
        ball1 = new Ball(10);
        ball2 = new Ball(10);
        ball3 = new Ball(10);
        ball4 = new Ball(10);
        player1 = new Player(10);
        top = new Wall(0,0,800,10);
        bottom = new Wall(0,470,800,10);
        left = new Wall(0,10,10,590);
        right = new Wall(630,10,10,590);
        appletWidth = 640;
        appletHeight = 480; 
        score=0;
        timer=new Timer(1, this);
        lastFrame=appletWidth;
        virtualMem = createImage(appletWidth,appletHeight);
        gBuffer = virtualMem.getGraphics();
        gBuffer.setColor(Color.white);
        gBuffer.fillRect(0,0,appletWidth,appletHeight);
        resize(640, 480);

        myButton= new Button("Do It Again");
        //the class is its own button listener
        myButton.addActionListener (this);
        add(myButton);
        this.addMouseMotionListener(this);
    }

     public void paint(Graphics g)
    {
        //We draw using the object methods of
        // the graphics buffer, not what is
        // currently on the screen
        gBuffer.setColor(Color.white);
        gBuffer.fillRect(0,0,appletWidth,appletHeight);gBuffer.setColor(Color.black);
        gBuffer.setColor(Color.black);
        gBuffer.drawString("Score: "+score, 20, 20);
        ball1.draw(gBuffer);
        ball2.draw(gBuffer);
        ball3.draw(gBuffer);
        ball4.draw(gBuffer);
        player1.draw(gBuffer);
        top.draw(gBuffer);
        bottom.draw(gBuffer);
        left.draw(gBuffer);
        right.draw(gBuffer);

        //Now we send the result to the screen
        g.drawImage(virtualMem,0,0,this);
    }

    public void update(Graphics g)
    {
        paint(g); //get rid of flicker with this method
    }

    /**
     * ActionListener is an interface and
     * requires the actionPerformed() method
     * to be defined..in this case we
     * look for a restart button being pressed
     */
    public void actionPerformed(ActionEvent e)
    {
        Object source = e.getSource();
        if (source == timer) 
        {
       		score++;
        	frame++;
       		frame%=100;
       		ball1.move();
       		ball2.move();
       		ball3.move();
       		ball4.move();
       		if (top.touches(ball1) || bottom.touches(ball1))
       		{
       			ball1.bounceVertical();
        		boing.play();
        		count++;
        	}
        	if (left.touches(ball1) || right.touches(ball1))
        	{
        		ball1.bounceHorizontal();
        		boing.play();
        		count++;
        	}
        	if (top.touches(ball2) || bottom.touches(ball2))
        	{
        		ball2.bounceVertical();
        		boing.play();
        		count++;
        	}
        	if (left.touches(ball2) || right.touches(ball2))
        	{
        		ball2.bounceHorizontal();
        		boing.play();
        		count++;
        	}
        	if (top.touches(ball3) || bottom.touches(ball3))
        	{
        		ball3.bounceVertical();
        		boing.play();
        		count++;
        	}
        	if (left.touches(ball3) || right.touches(ball3))
        	{
        		ball3.bounceHorizontal();
        		boing.play();
        		count++;
        	}
        	if (top.touches(ball4) || bottom.touches(ball4))
        	{
        		ball4.bounceVertical();
        		boing.play();
        		count++;
        	}
        	if (left.touches(ball4) || right.touches(ball4))
        	{
        		ball4.bounceHorizontal();
        		boing.play();
        		count++;
        	}
        	if (player1.touches(ball1) || player1.touches(ball2) || player1.touches(ball3) || player1.touches(ball4))
        	{
        		timer.stop();
                        myButton.setLabel("Play Again");
        		ball1.setVisable(false);
                ball2.setVisable(false);
                ball3.setVisable(false);
                ball4.setVisable(false);
        	}
        }
        else 
        {//restart button pressed   
        	if (timer.isRunning()) 
            {
        		timer.stop();
                myButton.setLabel("Start");
                ball1.setVisable(false);
                ball2.setVisable(false);
                ball3.setVisable(false);
                ball4.setVisable(false);
            } 
            else 
            {
            	score=0;
                timer.start();
                myButton.setLabel("Stop");
                ball1=new Ball(10);
                ball1.setVisable(true);
                ball2=new Ball(10);
                ball2.setVisable(true);
                ball3=new Ball(10);
                ball3.setVisable(true);
                ball4=new Ball(10);
                ball4.setVisable(true);
                boing.play();  
            }                 
        }
        repaint();
    }

	@Override
	public void mouseDragged(MouseEvent arg0) 
	{

	}

	@Override
	public void mouseMoved(MouseEvent e) 
	{
		player1.move(e.getX(), e.getY());
		repaint();

	}
}

Sound.java

import java.applet.*;
import java.net.URL;


public class Sound
{
	private AudioClip clip;

	public Sound(String fileName, Applet a)
	{
		URL soundToPlay = getClass().getResource(fileName);

		clip = a.getAudioClip(soundToPlay);
	}

	public void play()
	{
		clip.play();
	}

	public void loop()
	{
		clip.loop();
	}
}

Wall.java

import java.awt.Color;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;


public class Wall
{
	private Rectangle2D.Double rect;
	private Color color;
	private int x,y,width,height;

	public Wall(int x, int y, int width, int height)
	{
		rect=new Rectangle2D.Double(x, y, width, height);
		this.x=x;
		this.y=y;
		this.width=width;
		this.height=height;
		setColor(Color.BLACK);
	}

	public boolean touches(Ball ball)
	{
		return rect.intersects(ball.area());
	}

	public void draw(Graphics g)
	{
		Color c=g.getColor();
		g.setColor(color);
		g.fillRect(x, y, width, height);
		g.setColor(c);
	}

	public void setColor(Color color) 
	{
		this.color = color;
	}

	public Color getColor() 
	{
		return color;
	}
}

Player.java

import java.awt.Color;
import java.awt.Graphics;


public class Player 
{
	private int radius;
	private int x;
	private int y;

	public Player(int radius)
	{
		x=randInt(350,450);
		y=randInt(250,350);
		this.radius=radius;
	}
	public void move(int x, int y){
		this.x = x;
		this.y = y;
	}
	public void draw(Graphics g)
	{
		Color c = g.getColor();
		g.setColor(Color.RED);
		g.fillOval(x-radius, y-radius, 2*radius, 2*radius);
		g.setColor(c);
	}
	public int randInt(int min, int max)
	{
		return min+(int)((max-min)*Math.random());
	}
	public boolean touches(Ball ball)
	{
		boolean result = false;
		if (((ball.getX()-x)*(ball.getX()-x))+((ball.getY()-y)*(ball.getY()-y)) <= 400)
			return true;
		return result;		
	}
}

Ball.java

import java.awt.Color;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;


public class Ball 
{
	private int x;
	private int y;
	private int radius;
	private int rise;
	private int run;
	private boolean visable;

	public Ball(int radius)
	{
		x=randInt(350,450);
		y=randInt(250,350);
		this.radius=radius;
		rise=randInt(1,8);
		run=randInt(-8,8);
		setVisable(false);
	}

	public int randInt(int min, int max)
	{
		return min+(int)((max-min)*Math.random());
	}

	public void move()
	{
		x+=run;
		y+=rise;
	}

	public void bounceVertical()
	{
		rise*=-1;
	}

	public void bounceHorizontal()
	{
		run*=-1;
	}

	public void draw(Graphics g)
	{
		if (visable){
			Color c=g.getColor();
			g.setColor(Color.BLUE);
			g.fillOval(x-radius, y-radius, 2*radius, 2*radius);
			g.setColor(c);
		}		
	}

	public void setVisable(boolean visable) 
	{
		this.visable = visable;
	}

	public boolean isVisable() 
	{
		return visable;
	}

	public Rectangle2D area()
	{
		return new Rectangle2D.Double(x-radius, y-radius, 2*radius, 2*radius);
	}

	public void setRise(int rise)
	{ 
		this.rise=rise;
	}

	public void setRun(int run)
	{
		this.run=run;
	}

	public int getRise()
	{
		return rise;
	}

	public int getRun()
	{
		return run;
	}

	public void setX(int x)
	{ 
		this.x=x;
	}

	public void setY(int y)
	{ 
		this.y=y;
	}

	public int getX()
	{
		return x;//center x
	}

	public int getY()
	{
		return y;//center y
	}
	public int getRadius()
	{
		return radius;
	}	
}