From 712b7f63cb94afcb163a25fe6e08dd4606f31be9 Mon Sep 17 00:00:00 2001 From: MasterPyo <olivier.pillods@gmail.com> Date: Thu, 27 Apr 2023 17:24:37 +0200 Subject: [PATCH] click piece and click tile are now both in Main controller, instead of boardView --- .../src/main/java/controller/Main.java | 134 ++++++++++++++++-- .../src/main/java/view/BoardView.java | 110 +------------- .../target/classes/controller/Main.class | Bin 4781 -> 6686 bytes .../target/classes/view/BoardView.class | Bin 8300 -> 6365 bytes 4 files changed, 128 insertions(+), 116 deletions(-) diff --git a/MavenChess/MavenChess/src/main/java/controller/Main.java b/MavenChess/MavenChess/src/main/java/controller/Main.java index 0725fe2..008b995 100644 --- a/MavenChess/MavenChess/src/main/java/controller/Main.java +++ b/MavenChess/MavenChess/src/main/java/controller/Main.java @@ -6,9 +6,23 @@ import javafx.scene.input.MouseEvent; import javafx.scene.input.ScrollEvent; import javafx.stage.Stage; import model.Board; +import model.Position; import view.*; +import java.util.ArrayList; + public class Main extends Application { + + private CustomCamera camera; + private Group group; + private CustomScene scene; + private CustomMaterial material; + private CustomLight light; + private Custom3dModel model; + private Desk desk; + + private Board board; + private BoardView boardView; @Override public void start(Stage stage) { @@ -19,31 +33,31 @@ public class Main extends Application { stage.setTitle("Chess3D - Tuna Acikbas & Olivier Pillods"); // title // init - camera - CustomCamera camera = new CustomCamera(1, 1000, 70); // create a camera and some settings + camera = new CustomCamera(1, 1000, 70); // create a camera and some settings // init - scene, main container - Group group = new Group(); // will contain all the elements "to show" on scene - CustomScene scene = new CustomScene(group, camera.getCamera(), SceneAntialiasing.BALANCED); + group = new Group(); // will contain all the elements "to show" on scene + scene = new CustomScene(group, camera.getCamera(), SceneAntialiasing.BALANCED); // init - materials and shaders - CustomMaterial material = new CustomMaterial(); // prepare all the 3D materials (shaders) + material = new CustomMaterial(); // prepare all the 3D materials (shaders) // init - all lights - CustomLight light = new CustomLight(); // setups different custom lights + light = new CustomLight(); // setups different custom lights light.addAllToScene(group); // adds all the lights to scene // init - import all 3D models from .obj files - Custom3dModel model = new Custom3dModel(); + model = new Custom3dModel(); // init - creates a wooden desk - Desk desk = new Desk(material); + desk = new Desk(material); desk.addAllToScene(group); // adds the desk to scene // init - creates a (model) list of all pieces - Board board = new Board(); + board = new Board(); // init - creates a (visual) chessboard of 8x8, and all (visual) 3d pieces - BoardView boardView = new BoardView(model, material, board); + boardView = new BoardView(model, material, board); boardView.addAllToScene(group); // adds the board and the pieces to scene // event -------------------------------------------------------------- @@ -58,14 +72,14 @@ public class Main extends Application { for(int n = 0 ; n < 64 ; n++) { PieceView piece = boardView.getPiece(n); if(piece != null) { - piece.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> boardView.clickPiece(material, piece, board)); + piece.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> clickPiece(piece)); } } // event - click on (visual) "colored tiles" to move the selected piece there for(int n = 0 ; n < 64 ; n++) { TileView tile = boardView.getTile(n); - tile.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> boardView.clickTile(material, model, tile, board)); + tile.getObj().addEventHandler(MouseEvent.MOUSE_CLICKED, event -> clickTile(tile)); } // start -------------------------------------------------------------- @@ -78,4 +92,102 @@ public class Main extends Application { public static void main(String[] args) { launch(); } + + public void clickPiece(PieceView clickedPiece) { + // clicking a piece will ask her available moves + Position position = clickedPiece.getPosition(); + board.setSelected(position); + boardView.resetColor(material); + boardView.setColor(material, position, CustomMaterial.SELECTED_TILE); + ArrayList<Position> moves = board.getPiece(position).getAvailableMoves(board); + + // shows all available moves on the tiles, with colors, each tile-color having a meaning + for (Position move : moves) { + if(board.isFree(move)) { + boardView.setColor(material, move, CustomMaterial.MOVABLE_TILE); + } else if(board.isEnemy(move, position)) { + boardView.setColor(material, move, CustomMaterial.ATTACK_TILE); + } else { + boardView.setColor(material, move, CustomMaterial.SPECIAL_TILE); // any special move + } + // PROMOTION (attacking or not) + if(board.isPawn(position) && (move.getY() == 8 || move.getY() == 1)) { + boardView.setColor(material, move, CustomMaterial.SPECIAL_TILE); + } + } + } + + public void clickTile(TileView clickedTile) { + int state = clickedTile.getState(); + Position selected = board.getSelected(); + Position arrival = clickedTile.getPosition(); + if(state != TileView.NORMAL && state != TileView.SELECTED) { + // --- ALL SPECIAL MOVES --- + if(state == TileView.SPECIAL) { + if(board.isPawn(selected)) { + // --- PROMOTION --- + if(arrival.getY() == 8 || arrival.getY() == 1) { + // --- ATTACK (while doing promotion) --- + if (!board.isFree(arrival)) { + boardView.killPiece(arrival); // place piece on graveyard (visual) + } + // Promotion to Queen (by default, Queen for now) + board.mutationOfSelectedPiece(Board.QUEEN); // (on model) + boardView.mutationPiece(model, selected, Custom3dModel.QUEEN); // (on view) + // --- MOVE (while doing promotion) --- + board.movePiece(selected, arrival); // move piece (on model) + boardView.movePiece(selected, arrival); // move piece (on 3d view) + } + // --- PRISE EN PASSANT --- + else { + // PRE : if it's not a promotion, then it's "prise en passant", because of pawn rules + // we don't need to test y-position + } + } + // --- CASTLING (from king) --- + if(board.isKing(selected)) { + // PRE (1) : the arrival piece CAN ONLY BE ROOK, because of king rules + // PRE (2) : we don't need to test if rook !hasBeenMoved(), because of king rules + // PRE (3) : we don't need to test if king !hasBeenMoved(), because of king rules + int x = Board.D; // king x arrival, for west-rook + if(arrival.getX() == Board.H) { + x = Board.F; // king x arrival, for east-rook + } + Position kingArrival = new Position(x, selected.getY()); + board.movePiece(selected, kingArrival); // move king (on model) + boardView.movePiece(selected, kingArrival); // move king (on 3d view) + board.movePiece(arrival, selected); // move rook (on model) + boardView.movePiece(arrival, selected); // move rook (on 3d view) + } + // --- CASTLING (from rook) --- + else if(board.isRook(selected)) { + // PRE (1) : the arrival piece CAN ONLY BE KING, because of rook rules + // PRE (2) : we don't need to test if king !hasBeenMoved(), because of rook rules + // PRE (3) : we don't need to test if rook !hasBeenMoved(), because of rook rules + int x = Board.D; // king x arrival, for west-rook + if (selected.getX() == Board.H) { + x = Board.F; // king x arrival, for east-rook + } + Position kingArrival = new Position(x, arrival.getY()); + board.movePiece(arrival, kingArrival); // move king (on model) + boardView.movePiece(arrival, kingArrival); // move king (on 3d view) + board.movePiece(selected, arrival); // move rook (on model) + boardView.movePiece(selected, arrival); // move rook (on 3d view) + } + } + // --- STANDARD MOVES --- + else { + // --- ATTACK --- + if(state == TileView.ATTACK) { + boardView.killPiece(arrival); // place piece on graveyard (visual) + } + // --- MOVE --- + board.movePiece(selected, arrival); // move piece (on model) + boardView.movePiece(selected, arrival); // move piece (on 3d view) + } + + } + // --- Resets board coloring, doing any action or not --- + boardView.resetColor(material); + } } \ No newline at end of file diff --git a/MavenChess/MavenChess/src/main/java/view/BoardView.java b/MavenChess/MavenChess/src/main/java/view/BoardView.java index 2439a13..dc006f2 100644 --- a/MavenChess/MavenChess/src/main/java/view/BoardView.java +++ b/MavenChess/MavenChess/src/main/java/view/BoardView.java @@ -4,8 +4,6 @@ import javafx.scene.Group; import javafx.scene.shape.*; import model.*; -import java.util.ArrayList; - public class BoardView { public static final int BOARD_SIZE = 16, CENTERED_ORIGIN = -BOARD_SIZE*7/2, BOARD_HEIGHT = -5, GRAVEYARD_HEIGHT = -1; @@ -123,7 +121,7 @@ public class BoardView { piece.getObj().setTranslateY(GRAVEYARD_HEIGHT); // place at right height (Y axis) on table } - private void resetColor(CustomMaterial material) { + public void resetColor(CustomMaterial material) { for(int n = 0, j = 1 ; j <= 8 ; j++) { for (int i = 1; i <= 8; i++, n++) { // resets board with black and white - bottom left (first case) is black, then alternates @@ -137,7 +135,7 @@ public class BoardView { } } - private void setColor(CustomMaterial material, Position position, int type) { + public void setColor(CustomMaterial material, Position position, int type) { int id = position.getID(); // set the new color-type (visually) getTileObj(id).setMaterial(material.get(type)); @@ -151,105 +149,7 @@ public class BoardView { } } - public void clickPiece(CustomMaterial material, PieceView clickedPiece, Board board) { - // clicking a piece will ask her available moves - Position position = clickedPiece.getPosition(); - board.setSelected(position); - resetColor(material); - setColor(material, position, CustomMaterial.SELECTED_TILE); - ArrayList<Position> moves = board.getPiece(position).getAvailableMoves(board); - - // shows all available moves on the tiles, with colors, each tile-color having a meaning - for (Position move : moves) { - if(board.isFree(move)) { - setColor(material, move, CustomMaterial.MOVABLE_TILE); - } else if(board.isEnemy(move, position)) { - setColor(material, move, CustomMaterial.ATTACK_TILE); - } else { - setColor(material, move, CustomMaterial.SPECIAL_TILE); // any special move - } - // PROMOTION (attacking or not) - if(board.isPawn(position) && (move.getY() == 8 || move.getY() == 1)) { - setColor(material, move, CustomMaterial.SPECIAL_TILE); - } - } - } - - public void clickTile(CustomMaterial material, Custom3dModel model, TileView clickedTile, Board board) { - int state = clickedTile.getState(); - Position selected = board.getSelected(); - Position arrival = clickedTile.getPosition(); - if(state != TileView.NORMAL && state != TileView.SELECTED) { - // --- ALL SPECIAL MOVES --- - if(state == TileView.SPECIAL) { - if(board.isPawn(selected)) { - // --- PROMOTION --- - if(arrival.getY() == 8 || arrival.getY() == 1) { - // --- ATTACK (while doing promotion) --- - if (!board.isFree(arrival)) { - killPiece(arrival); // place piece on graveyard (visual) - } - // Promotion to Queen (by default, Queen for now) - board.mutationOfSelectedPiece(Board.QUEEN); // (on model) - mutationPiece(model, selected, Custom3dModel.QUEEN); // (on view) - // --- MOVE (while doing promotion) --- - board.movePiece(selected, arrival); // move piece (on model) - movePiece(selected, arrival); // move piece (on 3d view) - } - // --- PRISE EN PASSANT --- - else { - // PRE : if it's not a promotion, then it's "prise en passant", because of pawn rules - // we don't need to test y-position - } - } - // --- CASTLING (from king) --- - if(board.isKing(selected)) { - // PRE (1) : the arrival piece CAN ONLY BE ROOK, because of king rules - // PRE (2) : we don't need to test if rook !hasBeenMoved(), because of king rules - // PRE (3) : we don't need to test if king !hasBeenMoved(), because of king rules - int x = Board.D; // king x arrival, for west-rook - if(arrival.getX() == Board.H) { - x = Board.F; // king x arrival, for east-rook - } - Position kingArrival = new Position(x, selected.getY()); - board.movePiece(selected, kingArrival); // move king (on model) - movePiece(selected, kingArrival); // move king (on 3d view) - board.movePiece(arrival, selected); // move rook (on model) - movePiece(arrival, selected); // move rook (on 3d view) - } - // --- CASTLING (from rook) --- - else if(board.isRook(selected)) { - // PRE (1) : the arrival piece CAN ONLY BE KING, because of rook rules - // PRE (2) : we don't need to test if king !hasBeenMoved(), because of rook rules - // PRE (3) : we don't need to test if rook !hasBeenMoved(), because of rook rules - int x = Board.D; // king x arrival, for west-rook - if (selected.getX() == Board.H) { - x = Board.F; // king x arrival, for east-rook - } - Position kingArrival = new Position(x, arrival.getY()); - board.movePiece(arrival, kingArrival); // move king (on model) - movePiece(arrival, kingArrival); // move king (on 3d view) - board.movePiece(selected, arrival); // move rook (on model) - movePiece(selected, arrival); // move rook (on 3d view) - } - } - // --- STANDARD MOVES --- - else { - // --- ATTACK --- - if(state == TileView.ATTACK) { - killPiece(arrival); // place piece on graveyard (visual) - } - // --- MOVE --- - board.movePiece(selected, arrival); // move piece (on model) - movePiece(selected, arrival); // move piece (on 3d view) - } - - } - // --- Resets board coloring, doing any action or not --- - resetColor(material); - } - - private void movePiece(Position origin, Position arrival) { + public void movePiece(Position origin, Position arrival) { PieceView piece = getPiece(origin.getID()); piece.setPosition(arrival); // changes position to arrival setPiece(piece); // copies the piece from origin ID to arrival ID @@ -257,7 +157,7 @@ public class BoardView { updatePiece(arrival); // updates 3d model position (visual) } - private void killPiece(Position p) { // graveyards are specified as negative x + public void killPiece(Position p) { // graveyards are specified as negative x PieceView piece = getPiece(p.getID()); if(piece.getColor() == Piece.WHITE){ white_death_count++; @@ -269,7 +169,7 @@ public class BoardView { updateGraveyardPiece(piece); } - private void mutationPiece(Custom3dModel model, Position selected, int type) { + public void mutationPiece(Custom3dModel model, Position selected, int type) { // for view side, we can't "overwrite" the piece, we need to "edit" it, // otherwise the old 3d model would stay on the scene MeshView obj = getPieceObj(selected.getID()); diff --git a/MavenChess/MavenChess/target/classes/controller/Main.class b/MavenChess/MavenChess/target/classes/controller/Main.class index 26a5078555bb03c979e9421431ca6b3186969f9e..a58fe7ddbb1a5d7404aac4d5172a66aeafdf4666 100644 GIT binary patch literal 6686 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 literal 4781 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 NI{E&LXYe<K{|iagE=d3Y diff --git a/MavenChess/MavenChess/target/classes/view/BoardView.class b/MavenChess/MavenChess/target/classes/view/BoardView.class index 8bfa2b308389f4a7da41ccdd5dd8a3e5ce86e819..13aa03119faf5d4aef19c4100a993ea3c4332aaf 100644 GIT binary patch delta 2224 zcmZ8iX>e0j7(MqjP0}P?(k0!}bcyyyTA-E|%G4>;ZLqY^MG6H3YKanB7MohZkyZx* z$Bu*g9A^}D>M}AisB|a+#AV$0fj__nSI{c%;!+n7EYx#v($_b(GcWhPd++(qJ>U7h zcV^D1D;!5Jz5E)08c{UlD79O?IPSuGdYLmT9v`}JLT_+-efZdgPtYe|3kQ1|g5lK; ze1^|$IO)PEe4%f5))!+$z`druxBcdg)50CWb-`)#*RKjX@ik7{@Qn-K;yZyteXp}{ zUyiF$(-+$-^>-cRegW(H?$9lvbp&tk?hf^~cL^kPhPt{ML&1)qfY_jKb5uJ8?BQTn zu%joqN`EUkT!Zg%Jp_Irbqzlv8$X%mKXZP@H2;P3UrqDh^q!PLr<><(_?^#DeK2LD zAAb<+CS>uM0t-@+h%{s(9fin18GmPRekIpyk&8NbaRc(O3_h$vK0+u!7k6$#5w^h( z9hYGcm*WK#<8|(R2LT*K367x@e=@={Bp`?H|01n;#w$g`-yB*9(t@)bSqZxo=kO1g z8?X`Q)hcit7w|6u<Y){R$zF~wVVpW}M8O2&gr?W0)@r=ij?~QP#jI-QG!@*V_Sy_2 zn}{PikK%0-r5;48;U0<T2n@rSTOL8fUd}WnQWR^t3Cm$%ISi~G+@`Slf$I>bz>*|b zNd!$1G?%mt8GsJ8I+Kc5nLv{a&?I3I@rqzE_QeQR^Nb{DBc?C6{QvB#4WK;kF_0#& z8o>dHq`#4tQ*OG|Y~vj7ZXBDu)gGo)9!pI3%}~dp+^;70YfMK?+;L7w!8Ca2CV8|y zy{TRu^)R=<T)3%z5iK<x^_atKOM?_pGSF%h*{&5fVdrr-%0z;YK{W=vRsmj0-x*Ev zRdf>2gk&@`R*Ujz0IjIRBFw^K!nHBX60R)e|BYCQ<><r;^wRfRX}J3kRKc5JC(eKo zd>|H_?}U?NrS1dDrjq0U?dKn-cjZueGM)tP6fTiS7tcboNa7J2Jz4F^mY!_&%w24{ z|7z|JQNA_Qpc6B()^z_WgF;n|LOiA`hiO8Rps-_@DaAbz%gb5Mx~LY#tT12$Z*nVD z>1GXwS*JbJq8GDqJ2luu1@2J60*d@{BiQm-&g^Iv$?Co-m@iT|Vrdc84(%c;g~+4) zIqU|}k{MyjWJ2}RnM=$ZHq%Ib>>qcrU)+tU*upNdm8t8)d~9YHxmR(h;MqiGNOlAZ zFVw6`UgNkCvNcGh7a9x~s*)FqO&Y8hVG&fqE(#Jaz<nO^4)y`JNLBVYlC{N5XMn2R zPdYnLfd?4yLDG1LcF?gJ4^yZ|3_74>6aEWF1Cm5oWkSjjj#<EpwJIkTMaK#27%GH| ze+gufCep$8qx#9btbQB|Oo?E(ELpaJX3-KTjo`(}Mvy~pz@tpvV@SeIHr&T4+7l?k zlcq%Z4OV`Up{fG#3lB${YOAu~;utzJT5v=>NO39P6f6kHxDgCBF!1}9K@<eqhEZo( zxgT|<hmqW-kz3sXxFa~G5Bj{4F?W6-DaI+&7OC2Jih-VHF+RiWKg*mx$Ii8jS$dvg z?p9Qz1-!tZx<F(pstN3dl3>)p3DCwc)dp`4`DP0~Rrg)bVA4t%dUby43VbxFP?Ed{ zUZSP;GKWK^TxA%cGK?=nhR9W_5Gj@`2b`)hEsW<?1|HS-<oo*ZspVCC*%lY@M(}3K zA$+A_ksJ>lK{h2btq#Xl@6p7r@xznC_}FHFVal_g1sCCm?;wRa#4bfe@roge#*Qby jX3|0PCOG>sPxwSWNy*nvSjH%jKkoun5TbyuG*S2;0|Sgo delta 4038 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 Y!%^+d3wuBDs2SYH%tUrjWRtG{0oH5JtN;K2 -- GitLab