2016-12-26 3 views
0

Я пытаюсь создать игру в 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)); 
} 

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

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

+0

Если игра основана на поворотах, почему у вас есть связанный с временем код (например, 'i * gameSpeed' и' teamSizeDelay + eventDelay * 2')? Почему бы не сделать эти действия мгновенно? – John

+0

Потому что я хочу, чтобы игрок мог видеть, что движет компьютером, вместо того, чтобы только что произошло в одно мгновение –

ответ

0

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

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

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, вы могли бы, конечно, реализовать свое собственное решение, но оно будет работать по-разному.

+0

Если я использую scene2D, мне нужно будет использовать сцену? Или я могу просто запустить исполняемый код, который я добавляю в очередь действий? Я почти закончил игру без scene2D, и я бы предпочел не переделывать все, чтобы быть совместимым с ним. –

+0

Я считаю, что вы могли бы сделать это без сцены, пока вы вызываете 'Action # act()' себя где-то в своем игровой цикл. – John

+0

Я создал свой собственный обработчик действий для обработки пользовательских действий для ИИ без использования scene2D, спасибо за предложение! –