====== Kevin's Rhythm Game ====== [[https://mathorama.com/apcs/pmwiki.php?n=Main.TimerApplicaiton|Timer Application]] {{::screen_recording_2023-05-08_at_1.31.43_pm.gif?400|}} import java.awt.Color; import java.awt.*; import javax.swing.Timer; import java.awt.event.*; public class Dot { private int x, y, size ; private Color color; private Timer wait, duration; boolean visable; public Dot(int x, int y, int size, Color c, ActionListener app, int w, int dur) { this.x = x; this.y = y; this.size = size; color = c; visable = false; wait = new Timer(w, app); duration = new Timer(dur, app); color = c; //color = randomColor(); } public void start(){ wait.start(); } public Timer getWaitTimer(){ return wait; } public Timer getDurationTimer(){ return duration; } public boolean isVisable(){ return visable;} public void setVisable(boolean b){ visable = b;} public boolean contains (int a, int b) { if (!visable) return false; double r = .5 * size; double dx = (this.x + r) -a; double dy = (this.y + r) -b; //return (int)(Math.sqrt(dx*dx+dy*dy )); return (dx*dx + dy*dy <= r*r); } /** * randomInt * @param min * @param max * @return a random integer from min to max (inclusive) */ public int randomInt(int min, int max){ return min + (int)(Math.random()*(max-min+1)); } /** * randomColor * @return random Color */ public Color randomColor() { return new Color( randomInt(0,255), randomInt(0,255), randomInt(0,255)); } /** * draw * @param The graphics object to draw itself */ public void draw(Graphics g) { if (visable) { g.setColor(color); g.fillOval(x, y, size, size); } } } import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import javax.swing.Timer; import java.awt.event.*; import javax.swing.JFrame; import javax.swing.JPanel; public class DotTester extends JPanel implements MouseListener, ActionListener { public static int WIDTH=800; public static int HEIGHT=600; private Font titleFont, regularFont; private int x,y; private Dot[] dots; private String message; public DotTester() { //initialize variables here... titleFont = new Font("Roman", Font.BOLD, 18); regularFont = new Font("Helvetica", Font.PLAIN, 12); x=0; y=0; message="Hit the red dot"; dots = new Dot[3]; dots[0] = new Dot(50,200, 50, Color.BLUE, this,400, 350); dots[1] = new Dot(110,200, 50, Color.BLUE, this, 10, 490); dots[2] = new Dot(170,200, 50, Color.RED, this, 10, 150); //wait = new Timer(1000, this); //duration = new Timer(100, this); //wait.addActionListener(this); //duration.addActionListener(this); dots[0].setVisable(true); dots[0].start(); } public static void main(String[] args) { DotTester app= new DotTester(); JFrame window = new JFrame("Dot Tester"); window.setSize(WIDTH, HEIGHT); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.getContentPane().add(app); window.getContentPane().addMouseListener(app); window.setVisible(true); } public void paintComponent(Graphics g){ super.paintComponent(g); g.setColor(Color.WHITE); g.fillRect(0, 0, getWidth(),getHeight()); g.setColor(Color.BLUE); g.setFont(titleFont); g.drawString("Dot Tester", 20, 20); g.drawString("X = "+x+" Y = "+y, 20, 100); g.drawString(message, 500,200); g.setColor(Color.BLACK); g.setFont(regularFont); g.drawString("Click with your mouse", 20, 40); for (Dot d:dots) d.draw(g); } // update is a workaround to cure Windows screen flicker problem public void update(Graphics g){ paint(g); } /** * These are the Methods needed to implement the MouseListener Interface */ @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { x=e.getX(); y=e.getY(); if (dots[2].contains(x,y) ) message = "hit!"; else message = "miss"; repaint(); } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } public void actionPerformed(ActionEvent e) { for(int i=0; i< dots.length; i++) { int next = (i+1)%3; Timer wait = dots[i].getWaitTimer(); Timer duration = dots[i].getDurationTimer(); if (e.getSource()==duration){// time turn off duration.stop(); dots[next].getWaitTimer().start(); dots[i].setVisable(false); } if (e.getSource()==wait) { wait.stop(); duration.start(); dots[i].setVisable(true); } } repaint(); } }