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: