Java libGDX排序任务
我想用libGDX做一个游戏。我在试图让人工智能按顺序完成任务时遇到了问题。我最初使用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() >
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的自定义操作,谢谢你的建议!