LUIZ HERRERA (117 pts)

DEN IVANOV (260 pts)

EDUARDO CARREGA (150 pts)

DAUTON JANOTA (255 pts)

ILVA RUDEV (90 pts)

FÁBIO DUARTE (79 pts)

AUTOR DESCONHECIDO (100 pts)

HELEN TRIOLO (444 pts)

RODRIGO AMARAL (56 pts)

ZECA BALA (45 pts)

EDUARDO WALMOTT (226 pts)

ZEBEDIAH (35 pts)
Treinamento PontoFlash de Flash e ActionScript

Preciso fazer com que o Flash capture 2 teclas pressionadas ao mesmo tempo.

Quero que o usuário determine o tempo que um arquivo de som fique tocando.

Aumento da velocidade de loops.

Quero abrir uma janela popup de um link numa imagem (href).

Queria aprender a usar loops (While ou o For) em actioscript.

Detector de FlashPlayer.

Como fazer um preloader bem simples?

É possível incluir imagens em um arquivo HTML inserido dentro de um Flash e com scroll?

Como fazer para um movie clip desacelerar em direção ao outro.

Estou tentando utilizar o objeto sound do flash, mas não consegui ainda.

Tem como eu controlar um movieclip de outro movieclip?

Como faço para trocar imagens bitmaps sem ter que abrir o FLA?

Preciso que de um botão se abra uma nova mensagem no outlook?

Como fechar uma janela fullscreen ou poup?
Scroll Text.

3D Wireframe - segunda parte

Primeiros passos - desenhando e animando

Gerenciando camadas no CorelDraw

Máscara arrastável no Flash 4.

Clica nuaicon - Photoshop 6

Barneys_menu.

Load Múltiplos.

Objeto Array: métodos sort() e reverse().

Busca em Textos no Flash MX

Menu circular em 3D personalizável

Relógio analógico
Mouse Hide

False Mask

Puzzle

F5menu popup

Intromar

Raio_x

TV static

Drag circling

3d frame by frame

Swirl

Motion guide

Enquete
HOME | TUTORIAIS
Colisão
por Helen Triolo

Uma pequena introdução

Descobrir quando um objeto em movimento atingiu outro objeto é parte crucial de qualquer jogo baseado em actionscript. Considerando que eu não jogo (ou escrevo) um jogo baseados em actionscript, não tenho despendido muito tempo me preocupando com detecção de colisão.


download do FLA

   Mas outro dia estava trabalhando num modo de fazer com que um texto dinâmico se movesse ao longo de uma curva dinamicamente definida e me lembrei que o Gary Fixler postou algumas coisas sobre como usar uma linha de "guardas" ao longo da borda de um movieclip para fornecer uma detecção de colisão precisa, que está de certo modo relacionado com o problema.

   Dei uma olhada no site dele e encontrei a amostra que você vê acima. Gostei muito! Gosto do modo como as coisas saltam e sacodem ao redor, e o modo como você lança algo pra cima com força, a coisa desaparece e então eventualmente volta e quica rapidamente uma outra vez, e esse lance todo é só a "cobertura do bolo" (ok, eu compreendo que é, de fato, o ponto crucial da coisa) que o alpha de ambos os clipes mudem assim que qualquer parte de uma coisa bata em outra. O Gary tem uma boa maneira de pensar em como as coisas funcionam fisicamente (assim, como quanto desequilibrado fica um objeto quando atinge uma borda = quanto a coisa deve girar quando rebate) e fez as equações que produzem o mesmo efeito em Flash, sem ser complicado demais matematicamente.

   Ele concordou em me enviar o fla graciosamente e permitiu que eu o postasse aqui. Assim, tive um bom tempo para "cavar" em volta dele, fazer comentários, rearranjá-lo e tentar tirar dele o melhor senso possível.

As bases da detecção de colisão

Qualquer um que tenha tentado descobrir quando dois objetos colidem em Flash sabe que existem duas coisas que você pode detectar: quando a caixa delimitadora de um movieclip toca a caixa de outro, ou quando o conteúdo de um movieclip (não sua caixa delimitadora) toca um ponto definido no palco, ou em outro clipe que está no palco. O primeiro mencionado é feito com este tipo de código, para dois movieclips no palco, mcShape1 e mcShape2:

Descubra quando uma caixa delimitadora de um movieclip atinge outra

mcShape1.onPress = mcShape2.onPress = function() {
   this.startDrag();
}
mcShape1.onRelease = mcShape2.onRelease = function() {
   this.stopDrag();
}

function basicHitTest() {
   if (mcShape1.hitTest(mcShape2)) {
      trace("hit " + i++);
   }
}
this.onEnterFrame = basicHitTest;

   Isto funciona muito bem se o mcShape1 e o mcShape2 forem ambos de uma forma perfeitamente retangular (enchendo, assim, suas respectivas caixas delimitadoras). Caso elas não sejam de forma retangular, e você queira checar quando qualquer parte do conteúdo de uma delas (digamos, mcShape1) toque um ponto em particular da outra (digamos, um ponto colocado 5 pixels para a direita e 7 abaixo do ponto de registro no mcShape2), você pode também fazer assim:

   Descubra quando o conteúdo de um movieclip atinge um ponto no palco

mcShape1.onPress = mcShape2.onPress = function() {
   this.startDrag();
}
mcShape1.onRelease = mcShape2.onRelease = function() {
   this.stopDrag();
}

function shapeHitTest() {
   if (mcShape1.hitTest(mcShape2._x+5, mcShape2._y+7, true)) {
      trace("shape hit " + i++);
   }
}
this.onEnterFrame = shapeHitTest;

   Mas, se você quer saber quando qualquer parte do conteúdo (não a caixa delimitadora) do mcShape1 colide com qualquer parte do conteúdo (não a caixa delimitadora) do mcShape2, você precisará fazer alguma coisa como o que o Gary fez na sua amostra: use múltiplos clipes em branco para definir a borda.

Detecção precisa

Se você olhar para os símbolos de movieclip azuis e verdes na biblioteca do fla acima, você verá que cada um contém um movieclip chamado perim. Perim contém séries de movieclips em branco, dispostos lado a lado (quanto mais clipes, mais precisão, mas também maior poder de processamento é requerido para detectar uma colisão, claro!) à volta da borda da forma do clipe. Então, ao invés de checar se o clipe a colidiu com o clipe b, checamos se o clipe a colidiu com qualquer dos guardas (tratados como pontos únicos) no clipe b:

   Descubra quando o conteúdo de um movieclip atinge outro clipe em qualquer lugar ao longo da borda de sua forma

// for each sentry in this clip ("clip b")
for (i in this.perim) {
   // get the sentry's point on the stage
   this.perim.localToGlobal(p={x:this.perim[i]._x,y:this.perim[i]._y});
   // see if it's touching o ("clip a")
   if(o.hitTest(p.x, p.y, true)){
      o._alpha=50;
   }
}

   O método localToGlobal nos permite encontrar o local da guarda relativa ao palco (ao invés do perim, que está dentro dele). Aquela instrução diz: tome os valores x e y correntes da guarda (por exemplo, this.perim[i]._x) e faça um objeto p fora daqueles valores. Determine o valor p.x da guarda dentro do perim, e atribua a p.y seus valores y. Então utilize localToGlobal para convertê-lo em um novo objeto p, cujo valor x é o ponto no palco onde está a guarda, e cujo valor y é o valor y da guarda no palco.

Para imitar as leis físicas do movimento

Se você vem dando uma olhada no fla, viu que outras coisas estão acontecendo dentro do método do movieclip de detecção de colisão (col) além da detecção de uma colisão e do ajuste do alfa para 50. Dentro do loop, a localização de cada guarda no palco (p.x, p.y) é calculado para propósitos de detecção de colisão e também usado para descobrir quando um objeto salta ou é lançado para fora do palco (por exemplo, p.x > gcStageWidth), e como parte de uma soma que mostra quão distante um clipe está quando vai para fora do palco, que é então usado para calcular o número de rotações que ele dará quando saltar de volta.

   Efeitos físicos, como a aceleração e desaceleração, são aplicados pela simples adição de uma quantidade crescente ou decrescente de x e y na passagem de tempo do objeto (cada quadro). Por exemplo, aceleração (gravidade) é aplicada pela adição de uma quantidade constante y (constante gcGravity) para o objeto em cada quadro quanto ele se move para baixo. De modo semelhante, a desaceleração é conseguida pela adição de uma quantidade decrescente (multiplicando o montante a ser adicionado por um fator menor que 1, ou dividindo-o por um fator > 1) em cada quadro para desacelerar o objeto (por exemplo, fricção, amortecimento).

   Para uma melhor visão sobre como cada efeito foi conseguido, sugerimos começar com o fla (todos os códigos estão no quadro 1 da linha de tempo principal, e possuem comentários nas linhas para explicar o que está sendo feito em cada segmento) e então mudar os números e/ou os comentários fora das linhas para ver que efeito será produzido.

Tradução:
Sérgio Ramalho



Devido à reformulação implementada no site, pode ser que você encontre alguns links quebrados. Por favor, ajude-nos a corrigir eventuais problemas nos informando links quebrados
2 comentários


Comentário de Alberto
| 28/11/2012 - 20:49 |


Muito bom!!!!



Comentário de Alberto
| 28/11/2012 - 20:49 |


Muito bom!!!!