2016-12-26 7 views
0

私はlibGDXでゲームを作ろうとしています。私は、AIにタスクを順番に実行させようとすることに問題があります。私はもともと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でこれを行う方法の1つは、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を使用しない場合 、もちろん、独自のソリューションを実装することもできますが、基本的に同じ方法で動作します。

+0

私はscene2Dを使用すればステージを使用する必要がありますか?または、アクションキューに追加する実行可能コードを持つことはできますか?私はscene2Dなしでゲームをほぼ終了しましたが、互換性を持たせるためにすべてをやり直す必要はありません。 –

+0

あなたは 'Action#act()'を自分のどこかで呼び出す限り、ゲームループ。 – John

+0

私は、Scene2Dを使用せずに、AIのカスタムアクションを処理するための独自のアクションハンドラを作成しました。 –