Как создать исключительный файл, который запускается каждые 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);
Другие вопросы по тегам