Added themes & bugfixes

This commit is contained in:
Filip Znachor 2023-05-03 20:57:12 +02:00
parent b9fe92d7ff
commit 09f8469af2
7 changed files with 139 additions and 27 deletions

View file

@ -137,7 +137,7 @@ public abstract class APiece {
* @param objects painted objects
*/
public void paintObjects(Graphics2D g2, Shape[] objects) {
g2.setStroke(new BasicStroke(7));
g2.setStroke(new BasicStroke(8));
for (Shape object : objects) {
g2.setColor(color.draw);
g2.draw(object);
@ -333,7 +333,7 @@ public abstract class APiece {
double currentX = 0;
double currentY = 0;
public void run() {
chessboard.getRootPane().repaint(getRepaintRectangle());
chessboard.repaintRootPane(getRepaintRectangle());
if(i > 100) {
timer.cancel();
setOverride(0, 0);
@ -342,7 +342,7 @@ public abstract class APiece {
currentY = i * stepY + startY;
setOverride(currentX, currentY);
}
chessboard.getRootPane().repaint(getRepaintRectangle());
chessboard.repaintRootPane(getRepaintRectangle());
i++;
}
}, 5, 5);
@ -362,7 +362,7 @@ public abstract class APiece {
timer.cancel();
scale = 0;
}
chessboard.getRootPane().repaint(getRepaintRectangle());
chessboard.repaintRootPane(getRepaintRectangle());
}
}, 10, 10);
}

View file

@ -58,8 +58,17 @@ public class Chess {
public static JMenuBar createMenuBar() {
menuBar = new JMenuBar();
menuBar.add(createMenuGame());
menuBar.add(createMenuTheme());
menuBar.add(createMenuCPU());
menuBar.add(createMenuExport());
return menuBar;
}
public static JMenu createMenuGame() {
JMenu menuGame = new JMenu("Game");
JMenu menuExport = new JMenu("Export");
JMenuItem startNewGame = new JMenuItem("Start new game");
startNewGame.addActionListener(l -> newGame(Chessboard.fromFEN(DEFAULT_FEN)));
@ -85,19 +94,39 @@ public class Chess {
});
menuGame.add(toggleBlindMode);
JMenuItem exportAsSvg = new JMenuItem("Export as SVG");
exportAsSvg.addActionListener(l -> exportSVG());
menuExport.add(exportAsSvg);
return menuGame;
JMenuItem exportAsPng = new JMenuItem("Export as PNG");
exportAsPng.addActionListener(l -> exportPNG());
menuExport.add(exportAsPng);
}
menuBar.add(menuGame);
menuBar.add(createMenuCPU());
menuBar.add(menuExport);
public static JMenu createMenuTheme() {
JMenu menuTheme = new JMenu("Theme");
Theme[] themes = new Theme[]{Theme.CLASSIC, Theme.GREEN};
String[] themeNames = new String[]{"Classic", "Green"};
JRadioButtonMenuItem[] items = new JRadioButtonMenuItem[themes.length];
Runnable deselectRadios = () -> {
for (JRadioButtonMenuItem item : items) {
item.setSelected(false);
}
};
for (int i = 0; i < themes.length; i++) {
items[i] = new JRadioButtonMenuItem(themeNames[i]);
int themeIndex = i;
items[i].addActionListener(l -> {
Theme.setTheme(themes[themeIndex]);
deselectRadios.run();
items[themeIndex].setSelected(true);
chessboard.repaintRootPane();
});
menuTheme.add(items[i]);
if(themes[i] == Theme.activeTheme) items[i].setSelected(true);
}
return menuTheme;
return menuBar;
}
public static JMenu createMenuCPU() {
@ -162,6 +191,23 @@ public class Chess {
updateBlack.run();
return menuCPU;
}
public static JMenu createMenuExport() {
JMenu menuExport = new JMenu("Export");
JMenuItem exportAsSvg = new JMenuItem("Export as SVG");
exportAsSvg.addActionListener(l -> exportSVG());
menuExport.add(exportAsSvg);
JMenuItem exportAsPng = new JMenuItem("Export as PNG");
exportAsPng.addActionListener(l -> exportPNG());
menuExport.add(exportAsPng);
return menuExport;
}
public static void setCPU(Player player, String mode, Runnable update) {
@ -188,6 +234,7 @@ public class Chess {
public static void newGame(Chessboard newChessboard) {
window.remove(chessboard);
chessboard = newChessboard;
window.setJMenuBar(createMenuBar());
window.add(chessboard, BorderLayout.CENTER);
repaintWindow();
}

View file

@ -3,7 +3,6 @@ import java.awt.*;
import java.awt.geom.AffineTransform;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ScheduledExecutorService;
/**
* Chessboard class
@ -64,6 +63,8 @@ public class Chessboard extends JPanel {
public boolean blindMode = false;
static private Theme theme = Theme.activeTheme;
/**
* Constructor of the chessboard
*/
@ -311,8 +312,8 @@ public class Chessboard extends JPanel {
}
private void paintSquare(Graphics g, boolean isBlack) {
if(isBlack) g.setColor(Color.LIGHT_GRAY);
else g.setColor(Color.WHITE);
if(isBlack) g.setColor(theme.darkSquare);
else g.setColor(theme.lightSquare);
g.fillRect(0, 0, SQUARE_SIZE+1, SQUARE_SIZE+1);
}
@ -340,6 +341,22 @@ public class Chessboard extends JPanel {
piece.paint(g2);
}
public void repaintRootPane() {
repaintRootPane(null);
}
public void repaintRootPane(Rectangle r) {
JComponent pane = getRootPane();
if(pane != null) {
if (r != null) pane.repaint(r);
else pane.repaint();
}
}
public static void setTheme(Theme newTheme) {
theme = newTheme;
}
/**
* Setup Graphics2D with anti-aliasing
* @param g Graphics instance
@ -492,8 +509,8 @@ public class Chessboard extends JPanel {
}
public void changeActivePlayer() {
activePlayer = activePlayer == player1 ? player2 : player1;
getRootPane().repaint();
activePlayer = getOtherPlayer();
repaintRootPane();
activePlayer.play();
}

View file

@ -52,7 +52,7 @@ public class ChessboardMouseAdapter extends MouseAdapter {
if (piece != null && piece.getPlayer() == c.getActivePlayer() && selectedPiece != piece) {
c.setSelectedPiece(piece);
c.showPossibleMoves(piece.getPossibleMoves());
c.getRootPane().repaint();
c.repaintRootPane();
} else if(selectedPiece != null) {
if(selectedPiece.getPossibleMoves()[pos.y][pos.x]) {
selectedPiece.move(pos);
@ -60,7 +60,7 @@ public class ChessboardMouseAdapter extends MouseAdapter {
c.changeActivePlayer();
if(c.getActivePlayer().inCheck()) System.out.println("Active player in check!");
} else {
c.getRootPane().repaint();
c.repaintRootPane();
}
c.showPossibleMoves(null);
c.setSelectedPiece(null);
@ -74,7 +74,7 @@ public class ChessboardMouseAdapter extends MouseAdapter {
if (piece != null && piece.getPlayer() == c.getActivePlayer()) {
c.setSelectedPiece(piece);
c.showPossibleMoves(piece.getPossibleMoves());
c.getRootPane().repaint();
c.repaintRootPane();
}
}
@ -82,11 +82,11 @@ public class ChessboardMouseAdapter extends MouseAdapter {
Chessboard c = (Chessboard) me.getSource();
APiece piece = c.getSelectedPiece();
if (piece != null) {
c.getRootPane().repaint(piece.getRepaintRectangle());
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.getRootPane().repaint(piece.getRepaintRectangle());
c.repaintRootPane(piece.getRepaintRectangle());
}
}
@ -101,7 +101,7 @@ public class ChessboardMouseAdapter extends MouseAdapter {
c.changeActivePlayer();
if(c.getActivePlayer().inCheck()) System.out.println("Active player in check!");
} else {
c.getRootPane().repaint();
c.repaintRootPane();
}
c.setSelectedPiece(null);
}

View file

@ -31,8 +31,17 @@ public enum PieceColor {
* @param drawColor draw color
*/
PieceColor(Color fillColor, Color drawColor) {
setColors(fillColor, drawColor);
}
public void setColors(Color fillColor, Color drawColor) {
fill = fillColor;
draw = drawColor;
}
public static void setTheme(Theme theme) {
PieceColor.WHITE.setColors(theme.whiteFill, theme.whiteBorder);
PieceColor.BLACK.setColors(theme.blackFill, theme.blackBorder);
}
}

View file

@ -30,11 +30,12 @@ public class Player {
}
public void play() {
if(cpu == null) return;
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
if(cpu != null) {
if (cpu != null) {
if (cpu.equals("random")) randomMove();
if (cpu.equals("smart")) smartMove();
}
@ -140,6 +141,7 @@ public class Player {
public void setCPU(String cpu) {
this.cpu = cpu;
if(cpu != null && chessboard.getActivePlayer() == this) play();
}
public String getCPU() {

37
src/Theme.java Normal file
View file

@ -0,0 +1,37 @@
import java.awt.*;
public enum Theme {
CLASSIC(
Color.WHITE, Color.BLACK, Color.BLACK, Color.WHITE, Color.WHITE, Color.LIGHT_GRAY
),
GREEN(
Color.decode("#f9f9f9"), Color.decode("#333333"), Color.decode("#686563"), Color.decode("#000000"),
Color.decode("#ebecd0"), Color.decode("#779556")
);
public static Theme activeTheme = Theme.CLASSIC;
public static void setTheme(Theme theme) {
activeTheme = theme;
Chessboard.setTheme(theme);
PieceColor.setTheme(theme);
}
Color whiteFill;
Color whiteBorder;
Color blackFill;
Color blackBorder;
Color lightSquare;
Color darkSquare;
Theme(Color whiteFill, Color whiteBorder, Color blackFill, Color blackBorder, Color lightSquare, Color darkSquare) {
this.whiteFill = whiteFill;
this.whiteBorder = whiteBorder;
this.blackFill = blackFill;
this.blackBorder = blackBorder;
this.lightSquare = lightSquare;
this.darkSquare = darkSquare;
}
}