diff --git a/app/src/main/java/school_project/Controller.java b/app/src/main/java/school_project/Controller.java index c979cac..9af36d9 100644 --- a/app/src/main/java/school_project/Controller.java +++ b/app/src/main/java/school_project/Controller.java @@ -4,26 +4,43 @@ package school_project; import javafx.application.Application; -import javafx.scene.Group; +import javafx.scene.Parent; import javafx.scene.Scene; -import javafx.scene.control.Button; + +import javafx.scene.input.KeyCombination; +import javafx.stage.Screen; import javafx.stage.Stage; +import school_project.Parsers.FileParserFactory; + +import java.io.File; +import java.io.IOException; + public class Controller extends Application { + private Stage stage; + Parent root; + public static Vec2 screen_size; @Override - public void start(Stage primaryStage) throws Exception { - primaryStage.setTitle("test"); - Button btn = new Button("test"); - btn.setOnAction(event -> System.out.println("hey")); + public void start(Stage primaryStage) throws IOException { + stage = primaryStage; + screen_size = new Vec2( + (int) Screen.getPrimary().getBounds().getWidth(), + (int) Screen.getPrimary().getBounds().getHeight() + ); - Group root = new Group(); - root.getChildren().add(btn); + stage.setTitle("ROAD TO MASTER YOU"); - Scene scene = new Scene(root, 300,300); - primaryStage.setScene(scene); + // Full Screen mode + stage.setFullScreen(true); + stage.setFullScreenExitHint(""); + primaryStage.setFullScreenExitKeyCombination(KeyCombination.NO_MATCH); - primaryStage.show(); + root = new GameUI(FileParserFactory.loadMapFromFile(new File(getClass().getResource("level11.level").getFile()))); + + Scene scene = new Scene(root, screen_size.x, screen_size.y); + stage.setScene(scene); + stage.show(); } public static void main(String[] args) { diff --git a/app/src/main/java/school_project/GameUI.java b/app/src/main/java/school_project/GameUI.java new file mode 100644 index 0000000..139109a --- /dev/null +++ b/app/src/main/java/school_project/GameUI.java @@ -0,0 +1,61 @@ +package school_project; + +import javafx.scene.Group; +import javafx.scene.input.MouseButton; +import school_project.Utils.MatrixShape; + +import java.io.FileNotFoundException; + +public class GameUI extends Group{ + public final static int SEGMENT_SIZE = 50; + public final static int SPACE_SIZE = 5; + private final Vec2 piece_pos_click = new Vec2(); + + public GameUI(Map level) throws FileNotFoundException { + super(); + + MatrixShape grid = new MatrixShape(level); + + //center the grid + grid.setLayoutX((Controller.screen_size.x - grid.boundary_size.x) >> 1); + grid.setLayoutY((Controller.screen_size.y - grid.boundary_size.y) >> 1); + + getChildren().add(grid); + + Vec2 piece_space = new Vec2(SPACE_SIZE, SPACE_SIZE); + int column = 0; + for (Piece p : level.getPieces()) { + MatrixShape _piece = new MatrixShape(p); + + _piece.setLayoutX(piece_space.x); + _piece.setLayoutY(piece_space.y); + + piece_space.y += _piece.boundary_size.y; + + if(piece_space.y >= Controller.screen_size.y){ + column++; + piece_space.y = SPACE_SIZE; + piece_space.x = (SEGMENT_SIZE*3 + SPACE_SIZE*4 )* column; + } + + // Pieces Events + _piece.setOnMouseClicked(event -> { + if(event.getButton() == MouseButton.SECONDARY){ + ((Piece) _piece.shape).RotateRight(1); + _piece.update(); + } + }); + _piece.setOnMousePressed(event -> { + piece_pos_click.x = (int) event.getX(); + piece_pos_click.y = (int) event.getY(); + }); + _piece.setOnMouseDragged(event -> { + _piece.setLayoutX(event.getSceneX() - piece_pos_click.x); + _piece.setLayoutY(event.getSceneY() - piece_pos_click.y); + }); + + getChildren().add(_piece); + } + + } +} diff --git a/app/src/main/java/school_project/Utils/MatrixShape.java b/app/src/main/java/school_project/Utils/MatrixShape.java new file mode 100644 index 0000000..5ed0f34 --- /dev/null +++ b/app/src/main/java/school_project/Utils/MatrixShape.java @@ -0,0 +1,64 @@ +package school_project.Utils; + +import javafx.scene.Node; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.Pane; +import javafx.scene.paint.Paint; +import javafx.scene.shape.Rectangle; +import school_project.*; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +public class MatrixShape extends GridPane { + public Shape shape; + public Vec2 boundary_size = new Vec2(); + private Paint color; + public MatrixShape(Shape shape) { + super(); + this.shape = shape; + if(shape instanceof Piece){ + Piece p = (Piece) shape; + color = p.getColor(); + } + + update(); + + setHgap(GameUI.SPACE_SIZE); + setVgap(GameUI.SPACE_SIZE); + } + + public void update(){ + getChildren().clear(); + boolean[][] shape_matrix = shape.getShape(); + for (int i = 0; i < shape_matrix.length; i++) { + for (int j = 0; j < shape_matrix[i].length; j++) { + Node _cell; + if(shape_matrix[i][j]){ + if(shape instanceof Piece){ + Piece p = (Piece) shape; + _cell = new Rectangle(GameUI.SEGMENT_SIZE, GameUI.SEGMENT_SIZE); + ((Rectangle) _cell).setFill(color); + }else{ + try { + _cell = new ImageView(new Image(new FileInputStream(Controller.class.getResource("tile.png").getFile()))); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + } + } + else{ + _cell = new Pane(); + ((Pane) _cell).setPrefSize(GameUI.SEGMENT_SIZE, GameUI.SEGMENT_SIZE); + } + add(_cell, j, i); + } + } + boundary_size = new Vec2((GameUI.SEGMENT_SIZE + GameUI.SPACE_SIZE) * shape.getWidth(), (GameUI.SEGMENT_SIZE + GameUI.SPACE_SIZE) * shape.getHeight()); + } + public void setColor(Paint p) { + color = p; + } +} diff --git a/app/src/main/resources/school_project/tile.png b/app/src/main/resources/school_project/tile.png new file mode 100644 index 0000000..98e7c6e Binary files /dev/null and b/app/src/main/resources/school_project/tile.png differ