package ge.edu.freeuni.sdp.snake.view.terminal;
import ge.edu.freeuni.sdp.snake.presenter.CellUpdateListener;
import ge.edu.freeuni.sdp.snake.presenter.DirectionKey;
import ge.edu.freeuni.sdp.snake.presenter.LivesUpdateListener;
import ge.edu.freeuni.sdp.snake.presenter.MazePresenter;
import ge.edu.freeuni.sdp.snake.view.MazeView;
import com.googlecode.lanterna.input.Key;
import com.googlecode.lanterna.input.Key.Kind;
import com.googlecode.lanterna.terminal.Terminal;
public class TerminalMazeView implements MazeView {
private Terminal _terminal;
private MazePresenter _presenter;
public TerminalMazeView(MazePresenter presenter, Terminal terminal) {
_terminal = terminal;
_presenter = presenter;
CellUpdateListener updater = new TerminalMazeViewUpdater(terminal);
_presenter.setCellUpdateListener(updater);
LivesUpdateListener livesUpdater = new TerminalLivesViewUpdater(terminal);
_presenter.setLivesUpdateListener(livesUpdater);
}
private boolean isStoped = false;
private final char Space = ' ';
@Override
public void show() {
_terminal.clearScreen();
while (true) {
Key key = _terminal.readInput();
if (_presenter.isGameOver())
return;
if(key != null && key.getCharacter() == Space){
isStoped = !isStoped;
}
if (key != null && key.getKind() == Kind.Escape){
if(isStoped)_presenter.saveState();
return;
}
if(!isStoped)
_presenter.tick(convertToDirection(key));
Sleep();
}
}
private DirectionKey convertToDirection(Key key) {
if (key == null)
return DirectionKey.None;
switch (key.getKind()) {
case ArrowDown:
return DirectionKey.Down;
case ArrowUp:
return DirectionKey.Up;
case ArrowLeft:
return DirectionKey.Left;
case ArrowRight:
return DirectionKey.Right;
default:
return DirectionKey.None;
}
}
private void Sleep() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void restoreState(){
_presenter.restoreState();
}
}