В настоящее время я играю с JavaFX, когда пишу игру Snake для своего финального проекта класса Java Fundamentals. Я не новичок в создании простых игр с анимацией, так как я сделал некоторые из них, используя модуль PyGame и SDL на C. В любом случае, теперь я довольно борюсь с пониманием корреляции некоторых объектов в JavaFX, особенно в сочетании с FXML SceneBuilder.
Я просто не могу понять, как создать эквивалент цикла игры, который я использовал для реализации в PyGame или SDL. Что я хочу сделать с приведенным ниже кодом, так это войти в игровой цикл, как только будет создан новый объект Game, и непрерывно отрисовывать состояние игры на gameCanvas, созданном в SceneBuilder. Я думаю, что смогу легко управлять всем этим позже, но я просто не могу понять, как создать законную связь между холстом FXML и игровым циклом, который я хочу запустить.
GameController.java
public class GameController implements Initializable, ControlledScreen {
@FXML
private Canvas gameCanvas;
@Override
public void setScreenParent(ScreensController screenPage) {
// THIS IS FOR SCENE MANAGEMENT CONCEPT
}
Game.java
public class Game implements Runnable {
public static final int EASY = 1,
MEDIUM = 2,
HARD = 3;
int difficultyLevel, score = 0;
Snake snake;
Food food;
boolean isRunning = true;
public void setLevelEasy() {
difficultyLevel = EASY;
}
public void setLevelMedium() {
difficultyLevel = MEDIUM;
}
public void setLevelHard() {
difficultyLevel = HARD;
}
@Override
public void run() {
while (isRunning) {
}
}
}
@Override
public void initialize(URL location, ResourceBundle resources) {
// TODO Auto-generated method stub
}
}
См. svanimpe.be/blog/game-loops и svanimpe.be/blog/game-loops-fx (краткая версия: используйте AnimationTimer
).
Вы не можете использовать файл FXML для создания новой сцены. Используйте это вместо
public class Screen extends Application implements Runnable
{
@Override
public void start ( Stage primaryStage )
{
Pane pane = new Pane ();
Scene scene = new Scene(pane,500,300);
primaryStage.setScene ( scene );
primaryStage.show ();
}
@Override
public void run ()
{
launch ();
}
}
все, что вы хотите добавить, попадает в элемент панели вашего холста и т. д. и, кстати, сделайте трудность enum not int как
enum {easy,medium,hard}
таким образом никто не может установить уровень сложности, чтобы чего-то не было.