Quem leu a
segunda aula 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
endlibrary
Entã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
endlibrary
No código acima a struct Object tem um method (comportamento) chamado stop. Esse method faz a mensagem
object paused 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 "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 é o tipo da variável (lembra que as struct são tipos?) e por ultimo,
obj é apenas o nome da nossa variável local. Agora sim,
Object.create() 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 executamos 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, destruímos 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 Para completar a aula ensinarei a criar variáveis locais. É facil:
local tipo-da-variavel nome-da-variavel
Exemplos:
local unit caster
local effect efeito
local timer tempo
local player jogador1
local integer i
Voce pode "setar" o valor dela na criação ou durante o method, como qualquer variável:
set caster = GetTriggerUnit()
set i = 1348
Mas cuidado, as variáveis locais podem causar leak quando você não remover o conteúdo 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
endmethod
Espero que essa aula tenha sido muito esclarecedora.
Então, até breve!