Java libGDX排序任务

Java libGDX排序任务,java,libgdx,Java,Libgdx,我想用libGDX做一个游戏。我在试图让人工智能按顺序完成任务时遇到了问题。我最初使用libGDX定时器来安排任务,但这并不真正适合我试图完成的任务 游戏是一个基于策略回合的游戏,因此任务完成的顺序很重要 以下是我目前的做法 float teamSizeDelay = team.getUnits().size() * gameSpeed; float eventDelay = gameSpeed * 2; // Move Units if (team.getUnits().size() >

我想用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));
}
float teamSizeDelay=team.getUnits().size()*游戏速度;
float eventDelay=游戏速度*2;
//移动单位
if(team.getUnits().size()>0&&enemyTeam.getHqHealth()>0){
单位指数=0;
对于(inti=0;i0)
产卵单位();
}
},teamSizeDelay+eventDelay*2);
float spawnedelay=可用因子*游戏速度;
//末端转弯
如果(enemyTeam.getHqHealth()>0){
Timer.schedule(新的Timer.Task(){
@凌驾
公开募捐{
endTurn();
}
},(teamSizeDelay)+(eventDelay*3)+(spawnDelay));
}
正如您所看到的,使用计时器可能会很混乱,尤其是在计时方面


因此,如果有人知道更好的方法,我们将不胜感激。如果我理解正确,您希望连续执行一系列任务,但任务之间存在时间延迟。在libGDX中实现这一点的一种方法是扩展Scene2D并为您的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,当然可以实现您自己的解决方案,但其工作方式基本相同。

如果游戏是基于回合的,为什么会有与时间相关的代码(即
i*gameSpeed
teamSizeDelay+eventDelay*2
)?为什么不让这些动作瞬间发生呢?因为我希望玩家能够看到电脑的动作,而不是瞬间发生的旋转如果我使用场景2D,我必须使用舞台吗?或者我可以将可运行代码添加到操作队列中吗?我几乎已经完成了没有scene2D的游戏,我不想为了与它兼容而重做任何事情。我相信只要你在游戏循环的某个地方调用
Action#act()
自己,你就可以在没有scene2D的情况下处理AI的自定义操作,谢谢你的建议!