我正在尝试在libGDX中制作游戏。我在尝试让AI按顺序完成任务时遇到问题。我最初使用libGDX Timers来安排任务,但这并不适合我想要完成的任务。
游戏是基于策略回合的游戏,因此任务完成的顺序非常重要。
以下是我目前正在做的事情
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 :(得分:0)
因此,如果我理解正确,您希望按顺序执行一系列任务,但任务之间会有时间延迟。在libGDX中执行此操作的一种方法是扩展Scene2D Action
class并为您的AI创建不同的操作,使用SequenceAction
class对它们进行排序,并使用DelayAction
class将它们分隔开来。
设置AI的操作看起来像这样:
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,您当然可以实施自己的解决方案,但它的工作方式基本相同。