sexta-feira, 15 de junho de 2012

Platformer Kit: SPG_HealthPickup class (UnrealScript)


A classe SPG_HealthPickup é usada para representar um item de energia que pode cair de um inimigo quando ele morre. Esta classe é uma subclasse de DroppedPickup. As suas variáveis são as seguintes:
class SPG_HealthPickup extends DroppedPickup
      placeable;

// Static mesh used by the pick up
var(HealthPickup) const StaticMeshComponent Mesh;

// Sound to play when the pick up is picked up by a pawn
var(HealthPickup) const SoundCue PickupSound;

// How much health to give to the pawn when picked up
var(HealthPickup) const int HealthToGive;

O Platformer Starter Kit também utiliza um Archetype desta classe para facilitar a mudanças dos valores de suas variáveis.

A imagem abaixo mostra os valores padrões do Archetype da classe SPG_HealthPickup.


Se você não sabe nada sobre Pickups, recomendo a leitura do meu artigo "PickupFactory e Inventory em UnrealScript".

A função "GiveTo(Pawn P)" é chamada quando o jogador pega o item. Ela apenas toca um Som e atribui mais energia ao jogador:
function GiveTo(Pawn P)
{
    // Play sound
    if (PickupSound != None)
    {
        PlaySound(PickupSound);        
    }

    // Add health to the player, but clamp it to the pawn's maximum health
    P.Health = Min(P.Health + HealthToGive, P.HealthMax);

    // Handle the rest of pick up
    PickedUpBy(P);
}

A função "int Min( int A, int B )" retorna o menor número entre dois números inteiros e é usada para evitar que o valor da energia do jogador ultrapasse o valor máximo. A função "PickedUpBy(Pawn P)" pertence a classe DroppedPickup e ela apenas chama a função "Destroy()" para remover este Pickup do jogo.

A classe SPG_HealthPickup sobrescreve a função "ValidTouch(Pawn Other)", que está dentro do estado "Pickup" da classe DroppedPickup, com uma versão mais simples da função. Esta função é chamada toda vez que ocorre uma colisão com um objeto do tipo Pawn para verificar se é o jogador que está pegando o item.
auto state Pickup
{
    function bool ValidTouch(Pawn Other)
    {
        // make sure its a live player
        if (Other == None || !Other.bCanPickupInventory || (Other.DrivenVehicle == None && Other.Controller == None))
        {
            return false;
        }

        // make sure thrower doesn't run over own weapon
        if (Physics == PHYS_Falling && Other == Instigator && Velocity.Z > 0)
        {
            return false;
        }

        return true;
    }
}

Para concluir, temos o bloco defaultproperties cujo código está abaixo. É definido um objeto do tipo StaticMeshComponent com o nome MyStaticMeshComponent. Se você observar na imagem do Archetype que foi criado para esta classe, a propriedade Mesh é associada ao objeto MyStaticMeshComponent que será usado como componente, utilizando ":" e o nome do objeto.
defaultproperties
{
    // Remove the sprite component
    Components.Remove(Sprite);

    // Add the static mesh component
    Begin Object Class=StaticMeshComponent Name=MyStaticMeshComponent
    End Object
    Mesh=MyStaticMeshComponent
    Components.Add(MyStaticMeshComponent);
}