Одновременная работа Animation Timer и сетевого потока
Работаю над созданием сетевой игры и появилась проблема с потоками и отрисовкой изображения. Есть ли возможность обновлять окно игры через Animation Timer и заодно на фоне принимать данные через поток с сокета (например враг переместился)? Пытался закинуть код для сокета в AnimationTimer но появлялась проблема того, что за один "тик" таймера могло принять только одно действие противника и появлялась задержка Пример кода для потоков:
AnimationTimer() animationTimer = new AnimationTimer() {
@Override
public void handle(long now) {
movePlayer();
moveBackground();
moveBullets(); //все три метода просто меняют координаты элементов на экране пользователя
}
}
И сам сетевой поток, работающий через сокет:
@Override
public void start() {
OutpuStream outputStream= socket.getOutputStream();
InputStream inputStream= socket.getInputStream();
while(isConnected){ //проверка пока пользователь подключен
byte[] data = new byte[1 + 8 * 4];
inputStreamTest.read(data);
setOpponentX(ByteBuffer.wrap(data).getShort(0));
setOpponentY(ByteBuffer.wrap(data).getShort(1));
}
}
Ответы (1 шт):
Проблема была решена путём реализации "собственного Animation Timer". Для этого был создан обычный поток с выставленной задержкой, которая обеспечивает ту же частоту обновлений что и Animaion Timer. Стоит обратить внимание на то, что в обычном потоке нельзя взаимодействовать/видоизменять элементы JavaFX напрямую. Решением данной проблемы является использование Platfrorm.RunLater внутри обычного потока, возможно это не самый оптимальный вариант, но свою работу выполняет.