package dev.llan.view.game.map; import dev.llan.controller.Controller; import dev.llan.model.GameRecord; import dev.llan.model.board.Point; import dev.llan.view.RenderComponent; import dev.llan.view.GameComponent; import dev.llan.view.View; import dev.llan.view.game.map.grid.GridDisplayManager; import dev.llan.view.game.map.Direction.*; import javafx.scene.Parent; import javafx.scene.layout.Pane; import javafx.scene.layout.StackPane; import static dev.llan.view.game.map.Constants.*; public class MapView implements RenderComponent, GameComponent { private final GridDisplayManager manager; private final StackPane gridContainer; private final ScoreView scoreView; private XScrollDirection xDirection = XScrollDirection.NONE; private YScrollDirection yDirection = YScrollDirection.NONE; public MapView(View view, Controller controller, Pane parent) { this.gridContainer = new StackPane(); gridContainer.getStyleClass().add("map-background"); initContainer(parent); scoreView = new ScoreView(); manager = new GridDisplayManager(view, controller); gridContainer.getChildren().add(manager.getGrid()); gridContainer.getChildren().add(scoreView.render()); } public void initListeners(Pane parent) { parent.widthProperty().addListener(obs -> updateWidths(parent.getWidth())); parent.heightProperty().addListener(obs -> updateHeights(parent.getHeight())); } public StackPane getRoot() { return this.gridContainer; } private void initContainer(Pane parent) { this.gridContainer.minWidthProperty().bind(parent.widthProperty()); this.gridContainer.minHeightProperty().bind(parent.heightProperty()); this.gridContainer.maxWidthProperty().bind(parent.widthProperty()); this.gridContainer.maxHeightProperty().bind(parent.heightProperty()); this.gridContainer.prefWidthProperty().bind(parent.widthProperty()); this.gridContainer.prefHeightProperty().bind(parent.heightProperty()); } private void updateWidths(double width) { manager.updateWidth(width, true); } private void updateHeights(double height) { manager.updateHeight(height, true); } public void setViewPoint(Point point) { ViewPoint viewPoint = new ViewPoint(point); manager.setFocusPoint(viewPoint); } public void setXScrollDirection(XScrollDirection direction) { this.xDirection = direction; } public void setYScrollDirection(YScrollDirection direction) { this.yDirection = direction; } public void periodic() { if (xDirection != XScrollDirection.NONE) { manager.translateX(xDirection.getDirection() * SCROLL_SPEED); } if (yDirection != YScrollDirection.NONE) { manager.translateY(yDirection.getDirection() * SCROLL_SPEED); } } @Override public void updateGameRecord(GameRecord gameRecord) { manager.updateGameRecord(gameRecord); scoreView.updateGameRecord(gameRecord); } @Override public Parent render() { return gridContainer; } }