Select Git revision
Matrix.java
Forked from
COUETOUX Basile / FirefighterStarter
Source project has a limited visibility.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Controller.java 4.13 KiB
package controller;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.util.Duration;
import javafx.util.Pair;
import model.*;
import util.Position;
import view.Grid;
import java.util.ArrayList;
import java.util.List;
import static java.util.Objects.requireNonNull;
public class Controller {
public static final int PERIOD_IN_MILLISECONDS = 50;
@FXML
public Button restartButton;
@FXML
public Button oneStepButton;
@FXML
public Label generationNumberLabel;
@FXML
private ToggleButton pauseToggleButton;
@FXML
private ToggleButton playToggleButton;
@FXML
private Grid<BoardElement> grid;
private Timeline timeline;
private GameBoard board;
@FXML
private void initialize() {
initializePlayAndPauseToggleButtons();
initializeTimeline();
}
private void initializePlayAndPauseToggleButtons() {
ToggleGroup toggleGroup = new PersistentToggleGroup();
toggleGroup.getToggles().addAll(playToggleButton, pauseToggleButton);
pauseToggleButton.setSelected(true);
}
private void setModel(GameBoard gameBoard) {
this.board = requireNonNull(gameBoard, "GameBoard.model is null");
}
private void updateBoard(){
List<Position> updatedPositions = board.updateToNextGeneration();
List<Pair<Position, BoardElement>> updatedSquares = new ArrayList<>();
for(Position updatedPosition : updatedPositions){
//List<ModelElement> squareState = board.getState(updatedPosition);
//BoardElement viewElement = getViewElement(squareState);
//updatedSquares.add(new Pair<>(updatedPosition, viewElement));
}
grid.repaint(updatedSquares);
updateGenerationLabel(board.stepNumber());
}
private void repaintGrid(){
int columnCount = board.columnCount();
int rowCount = board.rowCount();
model.BoardElement[][] boardElements = new model.BoardElement[rowCount][columnCount];
for(int column = 0; column < columnCount; column++)
for(int row = 0; row < rowCount; row++){
if(board.getElementPosition().containsKey(new Position(row,column))){
boardElements[row][column] = board.getElementPosition().get(new Position(row,column)).get(0);
}else{
boardElements[row][column]=new EmptyElement();
}
}
grid.repaint(boardElements);
updateGenerationLabel(board.stepNumber());
}
/*private BoardElement getViewElement(List<ModelElement> squareState) {
if(squareState.contains(ModelElement.FIREFIGHTER)){
return BoardElement.FIREFIGHTER;
}
if (squareState.contains(ModelElement.FIRE)){
return BoardElement.FIRE;
}
return BoardElement.EMPTY;
}*/
private void initializeTimeline() {
Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS);
EventHandler<ActionEvent> eventHandler =
event -> updateBoard();
KeyFrame keyFrame = new KeyFrame(duration, eventHandler);
timeline = new Timeline(keyFrame);
timeline.setCycleCount(Animation.INDEFINITE);
}
public void play() {
timeline.play();
}
public void pause() {
timeline.pause();
}
public void pauseToggleButtonAction() {
this.pause();
}
public void playToggleButtonAction() {
this.play();
}
public void restartButtonAction() {
this.pause();
board.reset();
pauseToggleButton.setSelected(true);
repaintGrid();
}
public void initialize(int squareWidth, int squareHeight, int columnCount,
int rowCount, int initialFireCount, int initialFirefighterCount) {
grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
this.setModel(new GameBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount));
repaintGrid();
}
public void oneStepButtonAction() {
this.pause();
updateBoard();
}
private void updateGenerationLabel(int value){
generationNumberLabel.setText(Integer.toString(value));
}
}