Как создать исключительный файл, который запускается каждые 0,1 секунды и может передать в него массив
Я делаю игру. Я создаю массив, который содержит все мои фигуры. Мне нужно перемещать фигуры каждые 0,1 секунды или что-то маленькое. В то же время у меня также есть круг, следующий за моей мышью. Мне нужно постоянно перемещать круг, следуя за моей мышью, но я не нашел способа перемещать другие круги немного каждую секунду. Когда я пытался переместить другие круги, они все перемещались мгновенно, прежде чем окно javaFX даже загрузилось.
Это мой массив
Я создаю круг и добавляю его в массив форм
ArrayList<Shape> Objects = new ArrayList<Shape>();
Circle I = ClassObjects.getCircle(randomWidth,randomX,randomY);
Objects.add(I);
Я пытался использовать
final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(Timingobjects::myTask, 0, 1, TimeUnit.SECONDS);
}// program name, function, wait before start, time before each loop
private static void myTask() {
System.out.println("Running");
}
Но я обнаружил, что это исполняемый сервис-исполнитель, поэтому нельзя возвращать возвращаемое значение, и я также не могу получить массив для передачи.
Я пытался взглянуть на вызываемый сервис executor, но я не могу понять, как его кодировать.
Если бы кто-то мог дать мне пример исполняемого файла, который запускается каждые 0,1 секунды и может передать мой список массива фигур, чтобы его можно было изменить, а затем вернуть обратно.
Я был бы очень признателен.
2 ответа
См. Пример использования временной шкалы в руководстве по анимации и визуальным эффектам Oracle в JavaFX.
В противном случае вы можете использовать AnimationTimer.
Вам не нужно передавать массив во временную шкалу или AnimationTimer, так как узлы будут храниться в графе сцены, и вы можете просто манипулировать узлами графа сцены непосредственно из кода обработки событий Timeline или AnimationTimer.
Например, чтобы создать временную шкалу, которая обрабатывает каждые 0,1 секунды:
final Timeline timeline = new Timeline();
timeline.setCycleCount(Animation.INDEFINITE);
timeline.getKeyFrames().add(
new KeyFrame(Duration.millis(100)),
new KeyValue(node.translateXProperty(), 25))
);
timeline.play();
Обратите внимание, что частота кадров в JavaFX по умолчанию обрабатывается со скоростью 60 кадров в секунду. Таким образом, 0,1 секундная шкала не будет вызываться точно каждую 0,1 секунды.
Также связано:
Можно с TimerTask
, простираться TimerTask
лайк:
class CustomTimerTask extends TimerTask {
List<Shape> shapes;
public CustomTimerTask(List<Shape> shapes, /* observers*/) {
this.shapes = shapes;
}
@Override
public void run() {
// update shapes
// notify( about mouse events or whatever)
}
}
Не пытайтесь вернуть какое-либо значение. Используйте шаблон наблюдателя для уведомления подписчиков.
И сейчас
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(new CustomTimerTask(shapes/*, */), 0, 0.1 * 1000);