package games.MouseAndVoiceDemo.inputExample; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.*; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.Timer; /** * Creates an area of the screen in which the game will be drawn that supports: * <UL> * <LI>animation via the Timer * <LI>mouse and keyboard input via the Input class * </UL> * * @author Robert C Duvall */ public class Canvas extends JComponent { // default serialization ID private static final long serialVersionUID = 1L; // animate 25 times per second if possible public static final int FRAMES_PER_SECOND = 25; // better way to think about timed events (in milliseconds) public static final int ONE_SECOND = 1000; public static final int DEFAULT_DELAY = ONE_SECOND / FRAMES_PER_SECOND; // input state public static final int NO_KEY_PRESSED = -1; private Timer myTimer; private Game1 myGame = new Game1(this); private int myLastKeyPressed; private Point myLastMousePosition; boolean mouseDown = false; int cumulativeTime = 0; JFrame myFrame; /** * Create a panel so that it knows its size * @param size * @param frame */ public Canvas (Dimension size, JFrame frame) { myFrame = frame; setPreferredSize(size); setSize(size); setFocusable(true); requestFocus(); setInputListeners(); } /** * Paint the contents of the canvas. * * Never called by you directly, instead called by Java runtime * when area of screen covered by this container needs to be * displayed (i.e., creation, uncovering, change in status) * * @param pen used to paint shape on the screen */ @Override public void paintComponent (Graphics pen) { pen.setColor(Color.WHITE); pen.fillRect(0, 0, getSize().width, getSize().height); // first time needs to be special cased :( if (myGame != null) { myGame.paint((Graphics2D) pen); } } /** * Returns last key pressed by the user. */ public int getLastKeyPressed () { return myLastKeyPressed; } /** * Returns last position of the mouse in the canvas. */ public Point getLastMousePosition () { return myLastMousePosition; } /** * Start the animation. */ public void start () { final int stepTime = DEFAULT_DELAY; // create a timer to animate the canvas Timer timer = new Timer(stepTime, new ActionListener() { public void actionPerformed (ActionEvent e) { myGame.update((double) stepTime / ONE_SECOND); repaint(); } }); // start animation timer.start(); } /** * Stop the animation. */ public void stop () { myTimer.stop(); } /** * Create listeners that will update state based on user input. */ private void setInputListeners () { // initialize input state myLastKeyPressed = NO_KEY_PRESSED; addKeyListener(new KeyAdapter() { @Override public void keyPressed (KeyEvent e) { myLastKeyPressed = e.getKeyCode(); } @Override public void keyReleased (KeyEvent e) { myLastKeyPressed = NO_KEY_PRESSED; } }); myLastMousePosition = new Point(); addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved (MouseEvent e) { myLastMousePosition = e.getPoint(); } }); //sets the current mouse click state mouseDown = false; addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent arg0) {} @Override public void mouseEntered(MouseEvent arg0) {} @Override public void mouseExited(MouseEvent arg0) {} @Override public void mousePressed(MouseEvent arg0) { mouseDown = true; } @Override public void mouseReleased(MouseEvent arg0) { mouseDown = false; } }); } /** * Returns true if the mouse button is down, and false if it is up * * @return mouse click state */ public boolean getMouseDown(){ return mouseDown; } }