sexta-feira, 23 de novembro de 2012

Novo Projeto

Galera agora estou com um novo blog: Update and Draw
Nele estou atualmente ensinando como criar jogos para navegador (browser games).
Vou adorar ver vocês por lá!

Leia Mais...

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...

domingo, 29 de abril de 2012

Como Renascer Árvores

Perguntaram ontem no Team Kings, um fórum que frequento, como que faz para renascer as árvores destruidas no mapa. É uma dúvida comum de muitos que estão começando no world editor e, por sinal, uma coisa muito útil para mapas que têm suas árvores constantemente destruidas. Assim vou ensinar como criar uma simples trigger que faça isso com eficácia.


A Trigger


Ontem quando ajudei aquele membro com essa dúvida, falei para ele usar duas triggers. Sendo que por ser em GUI, Uma causava um leak indestrutivel em GUI. Então resolvi reconsiderar e ver se existia uma maneira mais simples de renascer uma árvore. Então consegui chegar numa única trigger mais simples do que eu havia explicado para ele. Eis a seguinte trigger:


Explicando a Trigger


A trigger começa com um evento que detecta quando uma destructible morre. Nas condições você verifica se a destructible é uma árvore. Na trigger de exemplo, eu verifico com um "Or" se é uma das duas árvores de Ashenvale. Se a destructible for uma árvore então a trigger espera um certo tempo (no exemplo foi 10 segundos) e, logo após, renasce a árvore.
Para configurar a trigger é muito fácil. Se voce quiser que a trigger detecte outras arvores apenas adicione mais condições iguais aquelas modificando apenas o tipo da arvores que voce deseja. Se quiser que demore mais ou menos tempo para renascer, modifique o valor do wait.
Estou postando também um MAPA de exemplo. Mas acho que ele nem era preciso.


Até a próxima, meus camaradas.

Leia Mais...