import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.Area; import javax.swing.JFrame; import javax.swing.JPanel; public class PunchingBagGUI implements MouseListener, MouseMotionListener, ButtonListener { public static enum Mode { Menu, Interactive, Game }; Mode currentMode = Mode.Interactive; final int bagXSize = 360; final int bagYSize = 840; static JFrame frame; static JFrame bagSimFrame; static PunchingBag bag = new PunchingBag(); // Contact public enum Direction { None, Up, Down, Left, Right }; final boolean useDebugScreen = true; public static void main(String[] args) throws InterruptedException { //SlaveArduino.listPorts(); new PunchingBagGUI(); } PunchingBagGUI() throws InterruptedException { frame = new JFrame("Punching Bag GUI"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 300); frame.setVisible(true); bagSimFrame = new JFrame("Punching Bag Sim"); bagSimFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); bagSimFrame.setSize(bagXSize, bagYSize); bagSimFrame.addMouseListener(this); bagSimFrame.addMouseMotionListener(this); bagSimFrame.setVisible(true); System.out.println("Bag X: " + bagSimFrame.getX() + " Bag Y: " + bagSimFrame.getY()); bag.addButtonListener(this); draw(); } void draw() throws InterruptedException { bagSimFrame.paintComponents(bagSimFrame.getGraphics()); // bagSimFrame.paintAll(bagSimFrame.getGraphics()); Thread.sleep(16); draw(); } public void runInteractively(Contact contact) { bagSimFrame.add(new Ripple(contact)); } class Ripple extends JPanel { final Contact contact; double currentWidth; Ripple(Contact contact) { super(); this.contact = contact; } public void paintComponent(Graphics g) { // Max size of ripple is 60cm // Ripple will expand 60cm * strength/100 SlaveArduino.Colour colour = SlaveArduino.Colour.Red; g.setColor(new Color(255, 0, 0, 255)); boolean drawnSomething = false; for (double i = 0; i < 360; i++) { int x = contact.x + (int) Math.round(currentWidth * Math.cos(i)); int y = contact.y + (int) Math.round(currentWidth * Math.sin(i)); if (x >= 0 && x <= 8 && y >= 0 && y <= 19) { SlaveArduino.setLED(colour, x, y); drawnSomething =true; } if (useDebugScreen) { g.fillOval(40 * x, 40 * y, 6, 6); } } if (!drawnSomething) bagSimFrame.remove(this); currentWidth += 0.1 + (currentWidth/10) + (contact.strength/130) ; } } public void mouseClicked(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseEntered(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } public void mousePressed(MouseEvent arg0) { if (currentMode == Mode.Interactive) { runInteractively(new Contact(System.currentTimeMillis(), (arg0.getX() - 4)/ 40 , (arg0.getY() - 30) / 40, 0)); } } public void mouseReleased(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseDragged(MouseEvent arg0) { // TODO Auto-generated method stub } public void mouseMoved(MouseEvent arg0) { // TODO Auto-generated method stub } public void contact(Contact c) { // TODO Auto-generated method stub } }