quinta-feira, 21 de junho de 2012

Platformer Kit: SPG_GameInfo class (UnrealScript)

Os principais ajustes feitos na classe SPG_GameInfo são para possibilitar o uso de Archetypes nas classes Pawn e Weapon do jogador.

Esta classe contém as referências dos Archetypes nas variáveis DefaultPawnArchetype e DefaultWeaponArchetype.
class SPG_GameInfo extends SimpleGame;

// Variable which references the default pawn archetype stored within a package
var() const archetype Pawn DefaultPawnArchetype;

// Variable which references the default weapon archetype stored within a package
var() const archetype Weapon DefaultWeaponArchetype;

Se você não conhece a classe GameInfo, dê uma lida no meu artigo: "Classe GameInfo (UnrealScript)".

A classe SPG_GameInfo sobrescreve a função SpawnDefaultPawnFor() para que o objeto da classe Pawn do jogador seja criado baseado no Archetype.
function Pawn SpawnDefaultPawnFor(Controller NewPlayer, NavigationPoint StartSpot)
{
    local Rotator StartRotation;
    local Pawn SpawnedPawn;

    // Quick exit if NewPlayer is none or if StartSpot is none
    if (NewPlayer == None || StartSpot == None)
    {
        return None;
    }

    // Only the start spot's yaw from its rotation is required
    StartRotation = Rot(0, 0, 0);
    StartRotation.Yaw = StartSpot.Rotation.Yaw;

    // Spawn the default pawn archetype at the start spot's location and the start rotation defined above
    // Set SpawnedPawn to the spawned
    SpawnedPawn = Spawn(DefaultPawnArchetype.Class,,, StartSpot.Location, StartRotation, DefaultPawnArchetype);

    // Return the value of SpawnedPawn
    return SpawnedPawn;
}

A função SpawnDefaultPawnFor() utiliza uma variável local do tipo Rotator chamada StartRotation para obter apenas a rotação no eixo vertical (Yaw) do ponto de ínicio (StartSpot) do jogo. Para mais informações sobre Rotação, leia o meu artigo: "Usando Rotators em UnrealScript".

Após isso, é criado um novo objeto Pawn baseado no Archetype "DefaultPawnArchetype" usando a função Spawn().

Outra função que é sobrescrita na classe SPG_GameInfo é a AddDefaultInventory(). Nesta função é obtida uma referência da classe SPG_InventoryManager para poder criar a arma baseada no Archetype DefaultWeaponArchetype.
event AddDefaultInventory(Pawn P)
{
    local SPG_InventoryManager SPG_InventoryManager;

    Super.AddDefaultInventory(P);

    // Ensure that we have a valid default weapon archetype
    if (DefaultWeaponArchetype != None)
    {
        // Get the inventory manager
        SPG_InventoryManager = SPG_InventoryManager(P.InvManager);
        if (SPG_InventoryManager != None)
        {
            // Create the inventory from the archetype
            SPG_InventoryManager.CreateInventoryArchetype(DefaultWeaponArchetype, false);
        }
    }
}

No bloco defaultproperties são especificados os Archetypes do Pawn e da Arma, além das classes responsáveis pelo HUD e pelo PlayerController.

defaultproperties
{
    // What player controller class to create for the player
    PlayerControllerClass=class'SPG_PlayerController'

    // What default pawn archetype to spawn for the player
    DefaultPawnArchetype=SPG_PlayerPawn'StarterPlatformGameContent.Archetypes.PlayerPawn'

    // What default weapon archetype to spawn for the player
    DefaultWeaponArchetype=SPG_Weapon'StarterPlatformGameContent.Archetypes.LinkGunWeapon'

    // What HUD class to create for the player
    HUDType=class'SPG_HUD'
}