Я пытаюсь сделать простую управляемую событиями игру TicTacToe, используя JavaFX.В настоящее время я борюсь с прекращением, когда определенные условия выполнены.Чтобы поместить это в более подробную информацию, игрок может нажать на элементы GridPane
, которые являются Canvas
объектами, и затем они заполнены формами "X" или "O" соответственно (я использую strokeLine
и strokeOval
методы GraphicsContext
).Код ниже:
private static void placeX(Canvas square){
GraphicsContext gc = square.getGraphicsContext2D();
gc.setLineWidth(10.0f);
gc.setStroke(Color.CORNFLOWERBLUE);
gc.strokeLine(square.getWidth()*0.2, square.getHeight()*0.2, square.getWidth()*0.8, square.getHeight()*0.8);
gc.strokeLine(square.getWidth()*0.8, square.getHeight()*0.2, square.getWidth()*0.2, square.getHeight()*0.8);
}
Как только 3 одинаковых фигуры появляются в линии или по диагонали, программа должна завершиться.Я делаю это, используя Platform.exit()
.Код ниже:
class HandleGame implements EventHandler<MouseEvent>{
@Override
public void handle(MouseEvent e){
Canvas can = (Canvas)e.getTarget();
//function to check if the canvas is clear
placeX(can);
if(game.isEnded()){ //checks if the same shape appears three times
Platform.runLater(new Runnable() {
@Override
public void run(){
try {
Thread.sleep(5000);
}
catch(InterruptedException exc){
System.out.println("Got something: " + exc.getMessage());
}
Platform.exit();
}
});
}
}
}
Этот обработчик событий присоединяется к каждому Canvas
объекту в GridPane
и срабатывает при отпускании мыши.Проблема, с которой я столкнулся, заключается в том, что после нажатия на последний Canvas
, перед тем, как фигура появится на Canvas
, указанный Runnable
будет выполнен, и рендеринг будет неестественно задержан (фигура "X" появляется только на секунду раньшезакрытие).Достаточно странно, что 1 из 10 запусков выполняется должным образом.Как мне сделать триггер рендеринга до Thread.sleep()
и после Platform.exit()
?Почему в редких случаях рендеринг выполняется до Thread.sleep()
?Я провел небольшое исследование, но не смог найти ничего решающего, я новичок, когда дело доходит до JavaFx.Ценю вашу помощь.