package at.tetris4j.controller; import java.net.InetAddress; import java.util.Timer; import java.util.TimerTask; import at.tetris4j.model.IModel; import at.tetris4j.view.IView; import at.tetris4j.view.TetrisView; public class GameController implements IController{ private static final int REFRESH_TIME = 100; private static final int DEFAULT_STEP_TIME = 500; private final IModel model; private final IView view; private boolean gameRunning; public GameController(IModel model) { this.model = model; this.view = new TetrisView(this); this.gameRunning = false; } @Override public void startGame() { this.gameRunning = true; view.showStartScreen(); } @Override public void moveLeft() { model.moveLeft(); } @Override public void moveRight() { model.moveRight(); } @Override public void upPressed() { model.turn(); } @Override public void downPressed() { model.moveDown(); } @Override public void stopGame() { this.gameRunning = false; view.showGoodbyeScreen(); } @Override public void pauseGame() { //TODO implement pause } @Override public void resumeGame() { //TODO implement resume } @Override public void startSinglePlayerMode() { new Thread(new GameLoop()).start(); new Thread(new RenderLoop()).start(); } @Override public void multiplayerPressed() { view.showNetworkInfoScreen(); } private void startMultiplayer() { view.clear(); final Timer updateTimer = new Timer(); updateTimer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { if(model.isConnectionEstablished()){ model.updateGame(); if (model.isGameOver()) { view.showGoodbyeScreen(); gameRunning = false; } } if (!gameRunning) { updateTimer.cancel(); } } }, DEFAULT_STEP_TIME, DEFAULT_STEP_TIME); new Thread(new RenderLoop()).start(); } @Override public void startMultiplayerMode(InetAddress ip) { model.startNewMultiplayerGame(ip); startMultiplayer(); } @Override public void startMultiplayerMode() { model.startNewMultiplayerGame(); startMultiplayer(); } private class GameLoop implements Runnable { @Override public void run() { while (gameRunning) { model.updateGame(); if (model.isGameOver()) { view.showGameOverScreen(); gameRunning = false; } try { Thread.sleep(DEFAULT_STEP_TIME); } catch (InterruptedException e) { gameRunning = false; } } } } private class RenderLoop implements Runnable { @Override public void run() { while (gameRunning) { view.updateScreen(model); try { Thread.sleep(REFRESH_TIME); } catch (InterruptedException e) { gameRunning = false; } } } } }