quinta-feira, 16 de fevereiro de 2012

Classe Weapon (UnrealScript)

A classe Weapon é uma subclasse de Inventory. O sistema de armas no UDK é bem flexível para a criação de diversos tipos de armas ou itens usáveis. A imagem abaixo mostra as subclasses de Weapon existentes no UDK:


Cada arma pode ter vários modos de tiro. O UDK utiliza dois tipos, o primário, que é acionado com o botão esquerdo do mouse, e o secundário, que é acionado com o botão direito do mouse. Entretanto, outros modos de tiro podem ser criados. Para cada modo de tiro é preciso definir o tipo de tiro.  O UDK já possui dois tipos definidos, o Instant Fire que é usado para armas muito velozes como uma Sniper Rifle. Neste tipo de tiro, a bala não é criada. O que acontece é que no momento do disparo é feito uma projeção do caminho que a bala irá percorrer, se encontrar algum obstáculo a colisão é feita imediatamente. O outro tipo de tiro é o Projectile Fire. Quando a arma é disparada neste tipo de tiro, um objeto da classe Projectile é criado com as informações necessárias de velocidade e direção. A verificação de colisão passa a ser responsabilidade da classe Projectile

Os tipos de tiro são definidos na classe Weapon em uma Enumeração (enum). O uso do enum é muito útil para limitar os possíveis valores que uma variável pode receber. Para definir o tipo de tiro de cada modo de tiro é utilizado um Array dinâmico. Cada posição do Array representa um modo de tiro. As posições de um Array começam a ser contadas a partir de zero, ou seja, as informações do tiro primário ficam na posição zero e as informações do tiro secundário ficam na posição um. O código abaixo mostra a declaração do enum e do Array.
// Extraído da classe Weapon (pacote Engine)

enum EWeaponFireType
{
    EWFT_InstantHit,
    EWFT_Projectile,
    EWFT_Custom,
    EWFT_None
};

var Array<EWeaponFireType>  WeaponFireTypes;

Um bom exemplo de arma no UDK é a Link Gun. Essa é a arma padrão que o jogador começa ao iniciar um jogo no UDK como UTGame. O tiro primário da Link Gun é do tipo EWFT_Projectile que lança projéteis de plasmas a uma alta velocidade. O tiro secundário é do tipo EWFT_InstantHit que quando acionado mantém um raio de plasma ativo conforme figura abaixo.


A classe que define a arma Link Gun é a UTWeap_LinkGun. No bloco defaultproperties é definido o tipo de tiro e a classe que representa o projétil para o tiro primário conforme código abaixo.
//Extraído da classe UTWeap_LinkGun (pacote UTGame)

defaultproperties
{
  //...

  WeaponFireTypes(0)=EWFT_Projectile
  WeaponProjectiles(0)=class'UTProj_LinkPlasma'

  //...
}

A função da classe Weapon responsável por disparar armas do tipo EWFT_InstantHit é a InstantFire(). A função usada no tipo EWFT_Projectile para disparar projéteis é ProjectileFire(). Abaixo temos um código de exemplo da função ProjectileFire() da classe UTWeapon.
//Extraído da classe UTWeapon (pacote UTGame)

simulated function Projectile ProjectileFire()
{
    local vector        RealStartLoc;
    local Projectile    SpawnedProjectile;

    // tell remote clients that we fired, to trigger effects
    IncrementFlashCount();

    if( Role == ROLE_Authority )
    {
        // this is the location where the projectile is spawned.
        RealStartLoc = GetPhysicalFireStartLoc();

        // Spawn projectile
        SpawnedProjectile = Spawn(GetProjectileClass(),,, RealStartLoc);

        if( SpawnedProjectile != None && !SpawnedProjectile.bDeleteMe )
        {
            SpawnedProjectile.Init( Vector(GetAdjustedAim( RealStartLoc )) );
        }

        // Return it up the line
        return SpawnedProjectile;
    }

    return None;
}

Para mais informações sobre a classe Weapon:
Weapon System Technical Guide