diff --git a/src/Render.java b/src/Render.java index a7529e0..6f8afda 100644 --- a/src/Render.java +++ b/src/Render.java @@ -5,6 +5,7 @@ import java.awt.event.*; import java.awt.image.*; import javax.swing.*; +import javax.swing.event.*; import java.util.Random; @@ -16,7 +17,7 @@ public class Render extends Canvas implements Runnable, MouseListener, public static int width; public static int height; public static int scale; - public static int max_fps = 15; + public int fps_now; public boolean paused; public String rule; @@ -32,7 +33,7 @@ public class Render extends Canvas implements Runnable, MouseListener, private JFrame _frame; private JButton pauseButton; - + private Random random = new Random(); public Render(int width, int height, Grid g, String[] rules) { @@ -49,6 +50,7 @@ public class Render extends Canvas implements Runnable, MouseListener, _pixels = ((DataBufferInt) _image.getRaster().getDataBuffer()).getData(); _lastTick = 0; _rules = rules; + fps_now = 15; Dimension size = new Dimension(width * scale, height * scale); setPreferredSize(size); setFrame(); @@ -90,6 +92,7 @@ public class Render extends Canvas implements Runnable, MouseListener, pauseButton = new JButton("Pause"); pauseButton.setActionCommand("pause"); + pauseButton.setPreferredSize(new Dimension(90,0)); menuBar.add(pauseButton); pauseButton.addActionListener(this); @@ -97,17 +100,42 @@ public class Render extends Canvas implements Runnable, MouseListener, resetButton.setActionCommand("reset"); menuBar.add(resetButton); resetButton.addActionListener(this); - + JButton randomButton = new JButton("Random"); randomButton.setActionCommand("random"); menuBar.add(randomButton); randomButton.addActionListener(this); - + JButton clearButton = new JButton("Clear"); clearButton.setActionCommand("clear"); menuBar.add(clearButton); clearButton.addActionListener(this); + JSlider framesPerSecond = new JSlider(JSlider.HORIZONTAL, 0, 30, 15); + ChangeListener fpschange = new ChangeListener() { + @Override + public void stateChanged(ChangeEvent event) { + JSlider source = (JSlider) event.getSource(); + if (!source.getValueIsAdjusting()) { + int fps = (int) source.getValue(); + if (fps == 0) { + paused = true; + pauseButton.setText("Unpause"); + } else { + paused = false; + fps_now = fps; + pauseButton.setText("Pause"); + } + } + } + }; + framesPerSecond.addChangeListener(fpschange); + framesPerSecond.setMajorTickSpacing(10); + framesPerSecond.setMinorTickSpacing(1); + framesPerSecond.setPaintTicks(true); + framesPerSecond.setPaintLabels(true); + menuBar.add(framesPerSecond); + _frame = new JFrame(); _frame.setJMenuBar(menuBar); _frame.setResizable(false); @@ -153,9 +181,9 @@ public class Render extends Canvas implements Runnable, MouseListener, public void sleep() { long since = System.currentTimeMillis() - _lastTick; - if (since < 1000 / max_fps) { + if (since < 1000 / fps_now) { try { - Thread.sleep(1000 / max_fps - since); + Thread.sleep(1000 / fps_now - since); } catch (InterruptedException e) { return; } @@ -170,7 +198,7 @@ public class Render extends Canvas implements Runnable, MouseListener, public void draw(int x, int y, int color) { _pixels[x + y * width] = color; } - + public void clear() { for (int i = 0; i < _grid.getHeight(); i++) { for (int j = 0; j < _grid.getWidth(); j++) { @@ -178,11 +206,11 @@ public class Render extends Canvas implements Runnable, MouseListener, } } } - + public void randomize() { - for(int i = 0; i < _grid.getHeight(); i++) { + for (int i = 0; i < _grid.getHeight(); i++) { for (int j = 0; j < _grid.getWidth(); j++) { - _grid.getPatch(i,j).setState(random.nextInt(Goldfish.getMaxStates(rule))); + _grid.getPatch(i, j).setState(random.nextInt(Goldfish.getMaxStates(rule))); } } }