Отслеживание столкновений между объектами в JavaFX и реализация системы проигрыша осуществляется с помощью AnimationTimer.
Отслеживание столкновений
Для проверки столкновения игрока с врагом в цикле AnimationTimer используется функция getBoundsInParent() для получения ограничивающего прямоугольника объекта и функция intersects() для проверки пересечения.
// Пример кода
if (player.getBoundsInParent().intersects(enemy.getBoundsInParent())) {
System.out.println("Collision!");
}
Выводимое сообщение о столкновении может повторяться, так как AnimationTimer срабатывает каждый кадр.
Реализация проигрыша
При столкновении отображается окно с сообщением о проигрыше, и игра останавливается. В Scene Builder добавлен лейбл с текстом «Lost» и ID «label_lost».
// Пример кода (фрагмент)
private Label label_lost; // ... в объявлении переменных
// ... внутри AnimationTimer
if (player.getBoundsInParent().intersects(enemy.getBoundsInParent())) {
label_lost.setText("Lost");
label_lost.setVisible(true);
playerSpeed = 0;
jumpDownSpeed = 0;
// Остановка анимации
}
Текст лейбла устанавливается в «Lost», лейбл становится видимым, а скорости игрока обнуляются, останавливая анимацию.
Неточности обнаружения столкновений
Возможны ложные срабатывания из-за того, что ограничивающий прямоугольник объекта в Scene Builder больше, чем сам объект. Для точного обнаружения столкновений следует использовать непосредственно изображение объекта, что сложнее реализовать в JavaFX, чем в игровых движках, таких как Unity или Unreal Engine. Однако, при перепрыгивании врага, игра работает корректно.
Итоги
Разработка игр на JavaFX имеет ограничения. JavaFX лучше подходит для создания приложений, а для разработки полноценных игр предпочтительнее использовать игровые движки, такие как Unity. Созданная 2D-игра демонстрирует базовые элементы, но не является полноценной игрой. Java и JavaFX эффективны для разработки приложений с базами данных, анимацией и сложным дизайном.