задачи заказа libGDX

Я пытаюсь сделать игру в libGDX. У меня есть проблема с попыткой заставить ИИ делать задачи в порядке. Первоначально я использовал таймеры libGDX для планирования задач, но это не совсем соответствует тому, что я пытаюсь выполнить.

Игра является стратегия пошаговая игра, поэтому порядок, в котором задачи выполняются важно.

Вот как я в настоящее время это делаю

float teamSizeDelay = team.getUnits().size() * gameSpeed;
float eventDelay = gameSpeed * 2;

// Move Units
if (team.getUnits().size() > 0 && enemyTeam.getHqHealth() > 0) {
    unitIndex = 0;
    for (int i = 0; i < team.getUnits().size(); i++) {
        Timer.schedule(new Timer.Task() {

            @Override
            public void run() {
                selectUnit(unitIndex);
                unitIndex++;
            }
        }, i * gameSpeed);
    }
}

int availableFactories = getAvailableFactories();

// Spawn Units
Timer.schedule(new Timer.Task() {

    @Override
    public void run() {
        if (enemyTeam.getHqHealth() > 0)
            spawnUnits();
    }
}, teamSizeDelay + eventDelay * 2);

float spawnDelay = availableFactories * gameSpeed;

// End Turn
if (enemyTeam.getHqHealth() > 0) {
    Timer.schedule(new Timer.Task() {

        @Override
        public void run() {
            endTurn();
        }
    }, (teamSizeDelay) + (eventDelay * 3) + (spawnDelay));
}

Как вы можете видеть, использование таймеров может быть грязным, особенно с таймингами

Так что если кто-то знает лучший способ сделать это, было бы очень приятно

1 ответ

  1. Поэтому, если я правильно понимаю, вы хотите выполнить кучу задач последовательно, но с задержками времени между задачами. Одним из способов сделать это в libGDX было бы расширить Actionкласс Scene2D и создать различные действия для вашего AI, последовательность их с SequenceActionклассом , и пространство их с помощью DelayActionкласса .

    Настройка действий вашего ИИ будет выглядеть примерно так:

    action = new SequenceAction();
    for(Unit u : units) {
      action.addAction(new MoveUnitAction( ... ));
      action.addAction(Actions.delay( gameSpeed ));
    }
    action.addAction(new SpawnUnitsAction( ... ));
    action.addAction(Actions.delay( gameSpeed ));
    action.addAction(new EndTurnAction( ... ));
    

    Затем запустите действие, пока оно не завершится так:

    public void render(float delta) { // Or whatever your per-frame method is called.
      if(action.act(delta)) {
        // This line runs when the AI's tasks are complete.
      }
    }
    

    Если вы не хотите использовать Scene2D, вы можете, конечно, реализовать свое собственное решение, но оно будет работать по существу таким же образом.