sábado, 5 de novembro de 2011

Classe GameInfo (UnrealScript)

A classe GameInfo especifica as características e regras do jogo. É uma espécie de classe gerenciadora que mantém as referências de outras classes responsáveis por diferentes aspectos do jogo. Por exemplo, o código abaixo foi extraído da classe UTGame que é uma subclasse de GameInfo.
//definições de variáveis, funções, estados...

defaultproperties
{
    HUDType=class'UTGame.UTHUD'
    PlayerControllerClass=class'UTGame.UTPlayerController'
    ConsolePlayerControllerClass=class'UTGame.UTConsolePlayerController'
    DefaultPawnClass=class'UTPawn'
    PlayerReplicationInfoClass=class'UTGame.UTPlayerReplicationInfo'
    GameReplicationInfoClass=class'UTGame.UTGameReplicationInfo'
    DeathMessageClass=class'UTDeathMessage'
    PopulationManagerClass=class'UTPopulationManager'
    BotClass=class'UTBot'

    //...
}

Cada tipo de jogo no Unreal Tournament (DeathMatch, Capture the Flag, etc.) é especificado por uma subclasse de GameInfo, como pode ser visto na hierarquia de classes abaixo.


Quando criamos e compilamos uma nova subclasse de GameInfo ela passa a ser automaticamente listada no Game Type que pode ser acessado através da opção de Menu do UDK: View -> WorldProperties -> Game Type.


Todo objeto da classe Actor tem acesso ao objeto GameInfo que representa o jogo atual. Esse acesso ocorre através de uma outra classe chamada WorldInfo. A classe WorldInfo contém as informações relacionadas ao mapa/fase atual, sendo que uma dessas informações é uma variável do tipo GameInfo chamada game. Nos tutoriais anteriores nós já estavamos utilizando essa variável GameInfo para poder escrever mensagens na tela usando a sua função Broadcast() como no exemplo abaixo:
class MeuActor extends Actor;

event PostBeginPlay()
{
 worldinfo.game.broadcast(self, "Usando o GameInfo");
}

Há apenas um problema, essa variável game faz referencia apenas para a classe base GameInfo. Se criarmos uma nova subclasse de GameInfo com novas variáveis e novas funções, a variável game não conseguirá acessar as novas variáveis/funções e irá gerar um erro de compilação. Para resolver este problema, presisamos converter a variável game para o tipo da subclasse GameInfo que estamos utilizando, como no exemplo abaixo:
//Em MeuGameInfo.uc:
class MeuGameInfo extends GameInfo;

var vector vPosicaoBonus;

//Em MeuActor.uc:
class MeuActor extends Actor;

var vector vObjetivo;

event PostBeginPlay()
{
   local MeuGameInfo meuGameInfo;

   //Converter o objeto GameInfo para um objeto do tipo MeuGameInfo   
   meuGameInfo = MeuGameInfo(worldinfo.game);
   
   //verificar se a conversão deu certo
   if(meuGameInfo != None )
   {
     vObjetivo = meuGameInfo.vPosicaoBonus;
   }
}

Para mais informações sobre a classe GameInfo: