3ª Aula de vJass - Aprendo mais sobre struct
Autor: Luiz Paulo "Bills" | Publicado: 2011-09-19T16:38:00-03:00

Primeiramente, desculpa pela demora da 3ª aula. Nem ia dar ela tão cedo, ando muito ocupado com java e faculdade, até esqueço do resto do mundo (nerdisse do caramba). Mas um colega meu (Victor) conseguiu arrumar o JNGP no computador dele. Então vou dar essa aula nova, que pretendo ensinar sobre structs, methods e variaveis. Vamos lá, né?

Quem leu a segunda aula&nbsp;viu que mostrei um exemplo de struct e expliquei sobre structs e o method onInit. Vamos relembra-lo:
library Exemplo1
 struct MyStruct
  // Meu primeiro código
  static method onInit takes nothing returns nothing
   call BJDebugMsg("Hello World!")
  endmethod
 endstruct
endlibraryEntão essa nossa struct apenas mostrava uma mensagem ("Hello World") quando o jogo começava. Vamos ir além dessa vez. Antes de prosserguimos gostaria que vocês entendessem que uma struct é um "objeto". Um objeto pode ter caracteristicas e comportamentos e além disso um objeto é um tipo de dado (assim como unit, effect, player, group, etc). O method onInit, por exemplo, é um "comportamento inicial" da nossa struct. Veja:

library Exemplo2
 struct Object
  // Agora nossa struct chama Object
  // nosso Object tem um comportamento (method) stop.
  method stop takes nothing returns nothing
   call BJDebugMsg("object paused")
   call TriggerSleepAction(10)
   call BJDebugMsg("object unpaused!")
  endmethod

  static method onInit takes nothing returns nothing
   local Object obj = Object.create() // cria um objeto do tipo Object
   call obj.stop()
   call obj.destroy() //destroi o objeto
  endmethod
 endstruct
endlibraryNo código acima a struct Object tem um method (comportamento) chamado stop. Esse method faz a mensagem object paused&nbsp;aparecer na tela e executa uma function chamada TriggerSleepAction, essa function é o famoso wait do GUI. O numero 10 indicado entre parenteses é o numero de segundos que pausará, no caso 10 segundos. Logo depois dos 10 segundos do wait, mostra a mensagem object unpaused. Percebeu que aquele method não tem static na declaração dele? Isso quer dizer que aquele method só pode ser executado de um Object&nbsp;"criado" ou como dizemos em programação instanciado.
No method onInit (o que sempre executa quando o jogo começa) nós criamos um Object:
local Object obj = Object.create()O que fizemos ali foi criar uma variável para guardar o Object que criamos. O local significa que aquela variavel só vai existir dentro daquele method (no caso, o onInit). Object&nbsp;é o tipo da variável (lembra que as struct são tipos?) e por ultimo, obj&nbsp;é apenas o nome da nossa variável local. Agora sim, Object.create()&nbsp;isso é que cria um objeto (instancia uma struct). Voce poderia chamar isso sem colocar numa variavel:
call Object.create()Mas voce não poderia acessar aquele objeto, pois ele não teria um registro (uma variável). Quando&nbsp;executamos&nbsp;obj.stop(), fizemos o objeto criado que estava guardado na variavel obj chamar o method stop dele. O ponto final entre o nome e o method é importante, nunca esqueçam dele. Logo em seguida,&nbsp;destruímos&nbsp;nosso objeto com o obj.destroy(). O comando destroy libera o espaço daquela instancia da struct. "Cada struct" só pode ter 8190 instancias, ou seja, só pode ser criada 8190 vezes de uma vez. Então&nbsp;Para completar a aula ensinarei a criar variáveis locais. É facil:
local tipo-da-variavel nome-da-variavelExemplos:
local unit caster
local effect efeito
local timer tempo
local player jogador1
local integer iVoce pode "setar" o valor dela na criação ou durante o method, como qualquer variável:
set caster = GetTriggerUnit()
set i = 1348Mas cuidado, as variáveis locais podem causar leak quando você não remover o&nbsp;conteúdo&nbsp;delas. Apenas as variaveis do tipo handle podem causar leak. Handle é tudo que não é integer, real, boolean e string. Ou seja, unit, effect, timer, group, force, etc. Dê uma olhada no documento Common.j dentro do MPQ do war3 para saber mais. E qualquer variável do tipo de uma struct também não causa leak, voce só precisa destruir aquela instancia quando não precisa mais dela. Mas como remove um conteudo de uma handle? Apenas no final seu method dê set para null. Veja:

method XXX takes nothing returns nothing
 local unit u = GetTriggerUnit()
 local integer i = 12 // integer não causa leaks
 // código restante do method
 // ...
 set u = null
endmethodEspero que essa aula tenha sido muito&nbsp;esclarecedora.&nbsp;
Então, até breve!