Started cleaing up the code

Game world objects no longer move (when paused) while the window is
being redrawn for resize events

Signed-off-by: Ricky Barrette <rickbarrette@gmail.com>
This commit is contained in:
2012-04-03 11:55:35 -04:00
parent 88b8853c31
commit 87eb6339e1
6 changed files with 150 additions and 145 deletions

View File

@@ -25,7 +25,6 @@ import java.awt.Graphics;
/**
* This class will be used to make astroids, to destroy the ship!
*
* @author ricky barrette
*/
public class Asteroid extends MovingSpaceObject implements Collider, Drawable {
@@ -33,13 +32,12 @@ public class Asteroid extends MovingSpaceObject implements Collider, Drawable {
private final int mNumberSplit;
private final int mHitsLeft;
private final int mRadius;
private final double mMinVelocity;
private final double mMaxVelocity;
private AsteroidGame mGame;
private double mMinVelocity;
private double mMaxVelocity;
/**
* Creates a new Asteroid
*
* @param x
* @param y
* @param xVelocity
@@ -63,8 +61,30 @@ public class Asteroid extends MovingSpaceObject implements Collider, Drawable {
mNumberSplit = numberSplit;
mHitsLeft = hitsLeft;
mRadius = radius;
mVelocityDecay = 1;
isActive = true;
}
/**
* Called when a collision check needs to be made.
* Only checks for ship and shots
* (non-Javadoc)
* @see com.RickBarrette.asteroids.Collider#checkForCollision(java.lang.Object)
*/
@Override
public boolean checkForCollision(Object o) {
if(o instanceof Asteroid){
//TODO inverse directions of both asteroids
}
if(o instanceof Ship) {
return shipCollision((Ship) o);
}
if(o instanceof Shot) {
return shotCollision((Shot) o);
}
return false;
}
/**
@@ -75,15 +95,15 @@ public class Asteroid extends MovingSpaceObject implements Collider, Drawable {
* @author ricky barrette
*/
public Asteroid createSplitAsteroid(double minVelocity, double maxVelocity){
//when this asteroid gets hit by a shot, this method is called
//numSplit times by AsteroidsGame to create numSplit smaller
//asteroids. Dividing the radius by sqrt(numSplit) makes the
//sum of the areas taken up by the smaller asteroids equal to
//the area of this asteroid. Each smaller asteroid has one
//less hit left before being completely destroyed.
return new Asteroid(mX,mY, minVelocity, maxVelocity, (int) (mRadius/Math.sqrt(mNumberSplit)), mNumberSplit, mHitsLeft-1, mGame);
/*
* Dividing the radius by sqrt(numSplit) makes the
* sum of the areas taken up by the smaller asteroids equal to
* the area of this asteroid. Each smaller asteroid has one
* less hit left before being completely destroyed.
*/
return new Asteroid(mX,mY, minVelocity, maxVelocity, (int) (mRadius/Math.sqrt(mNumberSplit)), mNumberSplit, mHitsLeft-1, mGame);
}
/**
* Called when the Asteroid needs to be drawn
* (non-Javadoc)
@@ -165,24 +185,4 @@ public class Asteroid extends MovingSpaceObject implements Collider, Drawable {
else if (mY > scrnWidth + mRadius)
mY -= scrnWidth + 2 * mRadius;
}
/**
* Called when a collision check needs to be made.
* Only checks for ship and shots
* (non-Javadoc)
* @see com.RickBarrette.asteroids.Collider#checkForCollision(java.lang.Object)
*/
@Override
public boolean checkForCollision(Object o) {
if(o instanceof Ship) {
return shipCollision((Ship) o);
}
if(o instanceof Shot) {
return shotCollision((Shot) o);
}
return false;
}
}

View File

@@ -95,9 +95,10 @@ public class AsteroidGame extends Thread {
* Pauses the game
* @author ricky barrette
*/
public synchronized void pause(){
public synchronized void pauseGame(){
isStarted = false;
mGameFrame.setDisplayText("Paused");
setMovingSpaceObjectsEnabled(false);
}
/**
@@ -124,7 +125,10 @@ public class AsteroidGame extends Thread {
while (true){
if(isStarted) {
mGameFrame.repaintDisplay();
/*
* update the display and stats
*/
mGameFrame.repaintDispaly();
mGameFrame.getStatusBar().updateStatus();
/*
@@ -176,9 +180,9 @@ public class AsteroidGame extends Thread {
mGameFrame.getStatusBar().setShipCount(mGameFrame.getStatusBar().getShipCount() -1);
if(mGameFrame.getStatusBar().getShipCount() > 0){
pause();
pauseGame();
mWorld.add(new Ship(100,100,0,.35,.98,.4,1));
mGameFrame.setDisplayText("You died, press start when ready.");
mGameFrame.setDisplayText("You died, You can hyper jump to a safe place now...\nPress start when ready.");
} else {
mGameFrame.setDisplayText("Game Over");
}
@@ -199,8 +203,18 @@ public class AsteroidGame extends Thread {
*/
public synchronized void startGame(){
mGameFrame.setDisplayText(null);
mGameFrame.setMovingSpaceObjectsEnabled(true);
isStarted = true;
setMovingSpaceObjectsEnabled(true);
isStarted = true;
}
/**
* Sets the enabled state of Moving Space Objects
* @param b
* @author ricky barrette
*/
public void setMovingSpaceObjectsEnabled(boolean b) {
for(Object item : mWorld)
if(item instanceof MovingSpaceObject)
((MovingSpaceObject) item).setActive(b);
}
}

View File

@@ -61,18 +61,22 @@ public class Display extends JPanel {
if(mText != null){
g.setColor(Color.ORANGE);
g.drawString(mText, this.getHeight() /2 , this.getWidth() / 2);
g.drawString(mText, this.getWidth() / 2, this.getHeight() /2 );
}
/*
* Move & Draw the world's objects
*/
Object item;
MovingSpaceObject mso;
for (int i = 0; i < mGame.getWorld().size(); i++) {
item = mGame.getWorld().get(i);
if (item instanceof MovingSpaceObject)
((MovingSpaceObject) item).move(getHeight(), getWidth());
if (item instanceof MovingSpaceObject){
mso = (MovingSpaceObject) item;
if(mso.isActive)
mso.move(getHeight(), getWidth());
}
if(item instanceof Drawable)
((Drawable) item).draw(g);

View File

@@ -33,31 +33,20 @@ import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
/**
* This class will maintian the game's frame, and handle key events from the user
* This class will maintian the game's frame.
* It will be used to display all the game's information to the user and handle key events from the user
* @author ricky barrette
*/
public class GameFrame extends JFrame implements KeyListener{
public class GameFrame extends JFrame implements KeyListener, ActionListener{
private static final long serialVersionUID = -2051298505681885632L;
private JMenuBar mMenuBar;
private JMenu mMenu;
private JMenuItem mMenuNewGame;
private JMenuItem mMenuQuit;
private Status mStatusBar;
private Display mDisplay;
private Container mContainer;
private FlowLayout mLayout;
private menuListener xlistener;
private AsteroidGame mGame;
private JMenuItem mMenuStartGame;
private JMenuItem mMenuPauseGame;
/**
* Creates a new GameFrame
*
* @param g
* @author ricky barrette
*/
@@ -65,39 +54,40 @@ public class GameFrame extends JFrame implements KeyListener{
super("ASTEROIDS");
mGame = g;
mMenuBar = new JMenuBar();
setJMenuBar(mMenuBar);
/*
* set up the game's menus
*/
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
/*
* file menu
*/
JMenu fileMenu = new JMenu("File");
JMenuItem menuNewGame = new JMenuItem("New Game");
JMenuItem menuStartGame = new JMenuItem("Start");
JMenuItem menuPauseGame = new JMenuItem("Pause");
JMenuItem menuQuit = new JMenuItem("Quit");
mMenu = new JMenu("File");
fileMenu.add(menuNewGame);
fileMenu.addSeparator();
fileMenu.add(menuStartGame);
fileMenu.add(menuPauseGame);
fileMenu.addSeparator();
fileMenu.add(menuQuit);
menuNewGame.addActionListener(this);
menuQuit.addActionListener(this);
menuStartGame.addActionListener(this);
menuPauseGame.addActionListener(this);
mMenuNewGame = new JMenuItem("New Game");
mMenuStartGame = new JMenuItem("Start");
mMenuPauseGame = new JMenuItem("Pause");
mMenuQuit = new JMenuItem("Quit");
menuBar.add(fileMenu);
FlowLayout layout = new FlowLayout();
layout.setAlignment(FlowLayout.LEFT);
mMenu.add(mMenuNewGame);
mMenu.addSeparator();
mMenu.add(mMenuStartGame);
mMenu.add(mMenuPauseGame);
mMenu.addSeparator();
mMenu.add(mMenuQuit);
mMenuBar.add(mMenu);
mLayout = new FlowLayout();
mLayout.setAlignment(FlowLayout.LEFT);
mContainer = getContentPane();
mStatusBar = new Status(mContainer, mGame);
mDisplay = new Display(mContainer, mGame);
xlistener = new menuListener();
mMenuNewGame.addActionListener(xlistener);
mMenuQuit.addActionListener(xlistener);
mMenuStartGame.addActionListener(xlistener);
mMenuPauseGame.addActionListener(xlistener);
Container container = getContentPane();
mStatusBar = new Status(container, mGame);
mDisplay = new Display(container, mGame);
addKeyListener(this);
@@ -109,38 +99,50 @@ public class GameFrame extends JFrame implements KeyListener{
}
public void repaintDisplay() {
mDisplay.repaint();
/**
* Called when a menu item is selected from the benu bar
* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("New Game")) {
mGame.newGame();
mDisplay.repaint();
}
if (e.getActionCommand().equals("Start")) {
mGame.startGame();
}
if (e.getActionCommand().equals("Pause")) {
mGame.pauseGame();
}
if (e.getActionCommand().equals("Quit"))
System.exit(0);
}
/**
* (non-Javadoc)
* @see java.awt.Component#repaint()
* @return the height of the game display panel
* @author ricky barrette
*/
@Override
public void repaint() {
mDisplay.repaint();
super.repaint();
public int getDispalyHeight() {
return mDisplay.getHeight();
}
private class menuListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("New Game")) {
mGame.newGame();
mDisplay.repaint();
}
if (e.getActionCommand().equals("Start")) {
mGame.startGame();
}
if (e.getActionCommand().equals("Pause")) {
mGame.pause();
}
if (e.getActionCommand().equals("Quit"))
System.exit(0);
}
/**
* @return the width of the game dispaly panel
* @author ricky barrette
*/
public int getDisplayWidth() {
return mDisplay.getWidth();
}
/**
* @return the mStatusBar
*/
public Status getStatusBar() {
return mStatusBar;
}
/**
@@ -272,43 +274,31 @@ public class GameFrame extends JFrame implements KeyListener{
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
/**
* @return the height of the game display panel
* (non-Javadoc)
* @see java.awt.Component#repaint()
*/
@Override
public void repaint() {
mDisplay.repaint();
super.repaint();
}
/**
* updates and repaints all world objects
* @author ricky barrette
*/
public int getDispalyHeight() {
return mDisplay.getHeight();
public void repaintDispaly() {
mDisplay.repaint();
}
/**
* @return the width of the game dispaly panel
* Sets test to be displayed in the center of the display
* @param string to be displayed
* @author ricky barrette
*/
public int getDisplayWidth() {
return mDisplay.getWidth();
}
/**
* Sets the enabled state of Moving Space Objects
* @param b
* @author ricky barrette
*/
public void setMovingSpaceObjectsEnabled(boolean b) {
for(Object item : mGame.getWorld())
if(item instanceof MovingSpaceObject)
((MovingSpaceObject) item).setActive(b);
}
/**
* @return the mStatusBar
*/
public Status getStatusBar() {
return mStatusBar;
}
public void setDisplayText(String string) {
mDisplay.setDisplayText(string);
this.repaint();

View File

@@ -27,12 +27,12 @@ package com.RickBarrette.asteroids;
public class MovingSpaceObject extends SpaceObject implements Moveable{
protected double mAngle;
protected double mVelocityDecay;
protected double mVelocityDecay = 1;
protected double mRotationalSpeed;
protected double mXVelocity = 0;
protected double mYVelocity = 0;
protected double mAcceleration;
protected boolean isTurningLeft = false, isTurningRight = false, isAccelerating = false, isActive;
protected boolean isTurningLeft = false, isTurningRight = false, isAccelerating = false, isActive = true;
/**
* @return true if the space object is accelerating

View File

@@ -46,11 +46,8 @@ public class Shot extends MovingSpaceObject implements Drawable {
mAcceleration = SPEED;
mColor = Color.WHITE;
mGame = game;
isActive = true;
mXVelocity = SPEED*Math.cos(angle)+shipXVel;
mYVelocity = SPEED*Math.sin(angle)+shipYVel;
mVelocityDecay = 1;
}
@Override