Я пытаюсь реализовать традиционный игровой цикл, используя JavaFX AnimationTimer:
@Override
public void handle(long currentNanoTime) {
// calculate time since last update.
double elapsedTime = (currentNanoTime - lastNanoTime) / 1e9f;
lastNanoTime = currentNanoTime;
// Handle Input
switch (currentScreen) {
case AREA_ONE-> areaOneInputHandler.handle();
case AREA_TWO-> areaTwoInputHandler.handle();
}
// Update the models
areaOneUpdater.update(elapsedTime);
areaTwoUpdater.update(elapsedTime);
// Clear the canvas
gc.clearRect(0,0,InterfaceConstants.CANVAS_WIDTH,
InterfaceConstants.CANVAS_HEIGHT);
// Render
switch (currentScreen) {
case AREA_ONE -> areaOneRenderer.render();
case AREA_TWO-> areaTwoRenderer.render();
}
}
То, что я пытаюсь выяснить, является лучшим способом реализации методов handle (), потому что «input»в этом случае события мыши / клавиатуры запускаются на узле холста.В настоящее время у меня есть следующая идея:
- Присоединить прослушиватели событий, где инициализируется холст
- Сохранить эти объекты событий мыши / клавиатуры в классе GeneralHandler.
- Позволить areaOneInputHandlerи т. д. имеют ссылку на этот общий класс обработчика и соответствующую модель (areaOneModel).
- handle () затем обновляет модель.
Один вопрос - верна ли она для handle ()обновить модель, или это должно быть полностью сделано с помощью update ().Можно ли обновлять модель в обоих случаях?
Базовая реализация того, о чем я говорил, была бы:
GeneralHandler.java
public class GeneralHandler {
private MouseEvent clickMouseEvent;
// Getters and Setters omitted
}
Где инициализируется холст:
canvas.setOnMouseClicked(generalHandler::setClickMouseEvent);
AreaOneInputHandler.java
public class AreaOneInputHandler extends Handler {
private AreaOneModel areaOneModel;
private GeneralHandler generalHandler;
public AreaOneInputHandler (AreaOneModel areaOneModel, GeneralHandler generalHandler) {
this.areaOneModel= areaOneModel;
this.generalHandler = generalHandler;
}
@Override
public void handle() {
if (generalHandler.getClickMouseEvent() != null) {
// Update the model
generalHandler.setClickMouseEvent(null);
}
}
}
Подходит ли это?Это моя первая реальная попытка реализовать игровой цикл, и мне интересно, нарушает ли это какие-либо нормы или вызовет проблемы в дальнейшем.