135 lines
4 KiB
Java
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;
|
|
}
|
|
|
|
}
|