domingo, 3 de junho de 2012

Tutorial básico sobre hashtable

Eai galera, há um tempo havia falado que iria fazer um tutorial sobre hashtables. Então chega de enrolação e vamos logo com isso.

Galera antes de ensinar sobre hashtable, vou dizer tudo que vocês precisam pra usar hashtable. Você terá que ter um conhecimento básico sobre variáveis array e precisará criar uma hashtable em uma trigger com evento "Map Initialization":


O que é uma Hashtable?


Hashtable é uma tabela na qual você pode guardar qualquer tipo de informação. Como se fosse uma variável array. Porém nas variáveis array só temos 1 indice, em hashtable temos 2.
Exemplo:
set variavel [1] = informação
set hashtable [1] [2] = informação
Veja o exemplo de hashtable, para absorver mais ainda:











Para salvar algo na hashtable você precisa fornecer dois índices (números) que serão como um código para achar a informação. Como no exemplo acima, eu quero guardar MinhaUnit dentro da MinhaHashtable no índice 0 (zero) e 0 (zero). Então para eu recuperar o que eu gravei na hashtable eu apenas tenho que usar o load (carregar/recuperar) nos índices 0 e 0 gravando direto na minha variável.

Mas qual a real vantagem da hashtable?


A vantagem é que cada coisa do mapa tem um id (código) chamado HandleId. Esse handle id é um número maior que o limite dos indices das variáveis array, que é 8191, mas não é maior que o limite para os indices da hashtable. E além disso, a hashtable possui dois indices, tornando o armazenamento de informações mais dinâmico ainda. Vou dar um exemplo. Vou ensinar a fazer um simples knockback (aquelas magias que empurram) usando hashtable. Usarei a magia Thunder Clap para ativar nosso knockback. veja:

Acima são as triggers do knockback com hashtable. Só quero explicar mesmo a linha que salvo o valor do Angulo no indice Key (Picked Unit), isso significa que usei o código daquela unidade para ser um índice. Assim quando eu for fazer o Pick Every Unit no grupo que está todos os alvos do knockback eu novamente usarei o Key (Picked Unit) para recuperar as informações que gravei. No outro índice ainda tenho que usar valores diferentes. Se a hashtable fosse mesmo uma variável com 2 índices, é como se eu tivesse fazendo isso:
set MinhaHashtable[0][PickedUnit] = Angulo
set MinhaHashtable[1][PickedUnit] = DistanciaRestante
Estou deixando no final do tutorial um mapa com esse knockback. Caso ainda tenha restado duvidas, eu aconselho tentar usar hashtables no world editor. Ver pessoalmente como elas funcionam. E mais outra coisa, se você sabe o que são leaks verá que nas triggers que postei está cheio deles. Se você não sabe o que são leaks, procure tutoriais na internet, para criadores de mapa esse é um assunto muito importante.

É isso ai galera, até a próxima!

Mapa de Demonstração


Leia Mais...

sexta-feira, 1 de junho de 2012

Atualização: Blog com syntax highlighter

Syntax highlighter para quem não conhece é uma maneira melhor de visualizar um código. Ele colore palavras importantes do código, facilitando assim a leitura. Sem falar que deixa o código bem mais bonito.

Então, existe um syntax highlighter na internet muito bom, porém como não tinha para "jass" eu improvisei uma.

Um exemplo de código com SH:

struct Bar
 method foo takes nothing returns boolean
  call KillUnit(GetTriggerUnit())
  return false
 endmethod
endstruct

Agora quando eu voltar a fazer as aulas de vjass os códigos estarão bonitinhos.

Até mais galera!

Leia Mais...

Como trabalhar com várias unidades de uma vez

De vez em quando precisamos fazer uma mesma coisa para várias unidades ao mesmo tempo. Por exemplo, eu tenho 10 footmans em um local do meu mapa, quando já tiver 2 segundos que o jogo começou todos os footmans vão morrer. Quando eu comecei a aprender sobre world editor eu pensaria em fazer uma trigger com 10 Kill Units, um para cada footman. Para nossa alegria, existe os Unit Groups (grupos de unidade), com eles trabalhar com várias unidades fica muito mais fácil.
Vamos denovo tentar matar nossos 10 footman, só que dessa vez de maneira mais fácil. Usaremos a action Pick Every Unit In Unit Group para agrupar todos os footmans e mata-los. Veja a trigger:

O evento ali faz a trigger executar automaticamente quando já estiver passado 2 segundos que o jogo começou (depois de terminar de carregar).
Nas actions, usamos o Pick Every Unit para agrupar todas "Units owned by Player 1 of type Footman", ou seja, todos os footmans que pertencem ao player 1. Em Loop - Actions, são as actions que acontece para cada unidade no grupo. O Picked unit referece à uma unidade do grupo de cada vez, ou seja, quando o Loop executar na primeira vez o Picked Unit será o primeiro footman do grupo, depois ele será o segundo, depois o terceiro e assim até o ultimo footman.

A linha acima do Pick Every Unit, aquele custom script, significa que queremos destruir o grupo depois que usa-lo. Por que se não destruirmos ele, ele vai ficará ocupando espaço na memória desnecessáriamente, o que conhecemos por Memory Leaks.

Bom galera é só isso, é bem simples assim mesmo. Voce não precisa necessáriamente usa-lo para matar unidades, pode usa-lo para teleporta muitas unidades de um lugar para outro, por exemplo.

Estou colocando um link para download de um mapa de exemplo, nele vocês podem notar que os footmans vão morrer todos ao mesmo tempo, isso por que o Pick Every Unit executa muito rápido.



Até a próxima galera!

Leia Mais...