package org.squirrelframework.foundation.fsm.snake; import org.squirrelframework.foundation.fsm.StateMachinePerformanceMonitor; import org.squirrelframework.foundation.fsm.snake.SnakeController.SnakeEvent; import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class SnakeGame extends JFrame { private static final long serialVersionUID = 5135000138657306646L; private final SnakePanel panel; private final SnakeController gameController; public SnakeGame(final SnakeController controller, final SnakeModel gameModel) { super("Greedy Snake"); setLayout(new BorderLayout()); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); this.gameController = controller; this.panel = new SnakePanel(gameController, gameModel); add(panel, BorderLayout.CENTER); final StateMachinePerformanceMonitor statModel = new StateMachinePerformanceMonitor(controller.getClass().getName()); controller.addDeclarativeListener(statModel); addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { switch(e.getKeyCode()) { case KeyEvent.VK_W: case KeyEvent.VK_UP: gameController.fire(SnakeEvent.TURN_UP, gameModel); break; case KeyEvent.VK_S: case KeyEvent.VK_DOWN: gameController.fire(SnakeEvent.TURN_DOWN, gameModel); break; case KeyEvent.VK_A: case KeyEvent.VK_LEFT: gameController.fire(SnakeEvent.TURN_LEFT, gameModel); break; case KeyEvent.VK_D: case KeyEvent.VK_RIGHT: gameController.fire(SnakeEvent.TURN_RIGHT, gameModel); break; case KeyEvent.VK_P: gameController.fire(SnakeEvent.PRESS_PAUSE, gameModel); break; case KeyEvent.VK_ENTER: gameController.fire(SnakeEvent.PRESS_START, gameModel); break; } } }); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { controller.removeDeclarativeListener(statModel); System.out.println(statModel.getPerfModel()); } }); pack(); setLocationRelativeTo(null); setVisible(true); } /** * Starts the game running. */ public void startGame() { gameController.start(); } }