Как правильно реализовать handleInput () в традиционном игровом цикле JavaFX? - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь реализовать традиционный игровой цикл, используя 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);
        }
    }
}

Подходит ли это?Это моя первая реальная попытка реализовать игровой цикл, и мне интересно, нарушает ли это какие-либо нормы или вызовет проблемы в дальнейшем.

...