Chess/src/ChessboardMouseAdapter.java
2023-05-08 00:09:26 +02:00

135 lines
4 KiB
Java

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* Chessboard mouse adapter class for detecting user input on the chessboard
*/
public class ChessboardMouseAdapter extends MouseAdapter {
long lastClicked;
boolean dragging;
/**
* Detect mouse press
* @param me mouse event
*/
public void mousePressed(MouseEvent me) {
if(me.getButton() != MouseEvent.BUTTON1) return;
dragging = false;
lastClicked = System.currentTimeMillis()+250;
}
/**
* Detect mouse dragging
* @param me mouse event
*/
@Override
public void mouseDragged(MouseEvent me) {
if(!dragging) {
dragging = true;
onDragStart(me);
}
onDrag(me);
}
/**
* Detect mouse release
* @param me mouse event
*/
@Override
public void mouseReleased(MouseEvent me) {
if(dragging) onDragEnd(me);
else if(lastClicked > System.currentTimeMillis()) onClick(me);
}
/**
* Select, unselect or move the piece on the chessboard
* @param me mouse event
*/
public void onClick(MouseEvent me) {
Chessboard c = (Chessboard) me.getSource();
PiecePosition pos = c.getPieceCoordinates(me.getX(), me.getY());
APiece piece = c.getPiece(pos.x, pos.y);
APiece selectedPiece = c.getSelectedPiece();
if (selectedPiece != piece && canMove(c, piece)) {
c.setSelectedPiece(piece);
c.showPossibleMoves(piece.getPossibleMoves());
c.repaintRootPane();
} else if(selectedPiece != null) {
if(selectedPiece.getPossibleMoves()[pos.y][pos.x]) {
selectedPiece.move(pos.x, pos.y);
c.changeActivePlayer();
} else {
c.repaintRootPane();
}
c.showPossibleMoves(null);
c.setSelectedPiece(null);
}
}
/**
* Select piece on drag start
* @param me mouse event
*/
public void onDragStart(MouseEvent me) {
Chessboard c = (Chessboard) me.getSource();
PiecePosition pos = c.getPieceCoordinates(me.getX(), me.getY());
APiece piece = c.getPiece(pos.x, pos.y);
if (canMove(c, piece)) {
c.setSelectedPiece(piece);
c.showPossibleMoves(piece.getPossibleMoves());
c.repaintRootPane();
}
}
/**
* Render and move selected piece on drag
* @param me mouse event
*/
public void onDrag(MouseEvent me) {
Chessboard c = (Chessboard) me.getSource();
APiece piece = c.getSelectedPiece();
if (piece != null) {
c.repaintRootPane(piece.getRepaintRectangle());
double pieceX = me.getX() - c.SQUARE_SIZE/2 * c.boardScale;
double pieceY = me.getY() - c.SQUARE_SIZE/2 * c.boardScale;
piece.setOverride(pieceX, pieceY);
c.repaintRootPane(piece.getRepaintRectangle());
}
}
/**
* Move piece to the new position on drag end
* @param me mouse event
*/
public void onDragEnd(MouseEvent me) {
Chessboard c = (Chessboard) me.getSource();
APiece piece = c.getSelectedPiece();
PiecePosition pos = c.getPieceCoordinates(me.getX(), me.getY());
if(piece != null) {
if(piece.getPossibleMoves()[pos.y][pos.x]) {
piece.move(pos.x, pos.y, false);
c.changeActivePlayer();
} else {
c.repaintRootPane();
}
c.setSelectedPiece(null);
}
c.showPossibleMoves(null);
}
/**
* Detect if selected piece can be moved
* @param chessboard chessboard instance
* @param piece selected piece
* @return true, if you can move the piece or false
*/
public boolean canMove(Chessboard chessboard, APiece piece) {
if(piece == null) return false;
Player player = piece.getPlayer();
return player == chessboard.getActivePlayer() && player.getCPU() == null;
}
}