Skip to content

Latest commit

 

History

History
58 lines (47 loc) · 2.45 KB

File metadata and controls

58 lines (47 loc) · 2.45 KB

Provavelmente, a classe mais importante para entender o funcionamento do agent2D. É ela que vai, literalmente, analisar o campo a partir do diagrama de Voronoi para então decidir que ação deve ser tomada pelo agente.

Uma explicação bem simples do diagrama de Voronoi pode ser encontrada aqui: http://www.ime.usp.br/~freitas/gc/voronoi.html

Para entender o funcionamento do código do diagrama de Voronoi da librcsc, veja a classe Voronoi Diagram.

No método actionImpl() do SamplePlayer (que é chamado a cada ciclo do jogo), a instância da classe FieldAnalyzer é chamada já na segunda linha. Antes dela, a chamada responsável pela estratégia de jogo também atualizada. (Mais detalhes, veja a classe Strategy).

void
SamplePlayer::actionImpl()
{
    //
    // update strategy and analyzer
    //
    Strategy::instance().update( world() );
    FieldAnalyzer::instance().update( world() );

   //[...]

Antes da cadeia de ações ser gerada, o campo é analisado a cada ciclo. Note que nesse ponto, é muito importante que você tenha entendido o diagrama de Voronoi.

A chamada feita no SamplePlayer tem o seguinte código na classe FieldAnalyzer:

void
FieldAnalyzer::update( const WorldModel & wm )
{
    static GameTime s_update_time( 0, 0 );

    if ( s_update_time == wm.time() )
    {
        return;
    }
    s_update_time = wm.time();

    if ( wm.gameMode().type() == GameMode::BeforeKickOff
         || wm.gameMode().type() == GameMode::AfterGoal_
         || wm.gameMode().isPenaltyKickMode() )
    {
        return;
    }
    
#ifdef DEBUG_PRINT
    Timer timer;
#endif

    //updateVoronoiDiagram( wm );

#ifdef DEBUG_PRINT
    dlog.addText( Logger::TEAM,
                  "FieldAnalyzer::update() elapsed %f [ms]",
                  timer.elapsedReal() );
    writeDebugLog();
#endif

O trecho do código onde é chamado o método que, de fato, atualiza o diagrama de Voronoi vem comentado no código original do agent2D. Testes precisam ser feitos para analisar o impacto desse método. Seguindo o resto da lógica, basicamente, esse método exclui algumas situações onde o diagrama não é atualizado, são elas início e retomada do jogo e nos seguintes modos de jogo: BeforeKickOff, AfterGoal_ e isPenaltyKickMode.