RICARDO TEIXEIRA (40 pts)

EDUARDO WALMOTT (226 pts)

GUILHERME SCHEIBE (49 pts)

AUTOR DESCONHECIDO (100 pts)

NETO LEAL (116 pts)

PANDOGO (82 pts)

NILTON BICALHO (61 pts)

SASHA GUDEY (235 pts)

ILVA RUDEV (90 pts)

MUZAK (45 pts)

FLASHGURU (155 pts)

ALEXANDRE PORTO (1281 pts)
Treinamento PontoFlash de Flash e ActionScript

O que uso para movimentar e dar um efeito zoom num objeto?

Plugin do Flash Player

Preciso remover todas as arrays que tenho em um movieclip?

Como faço um menu popup fechar o item aberto quando abro outro?

Alguém conhece alguma maneira de mostrar dentro do flash uma imagem que está em outro provedor?

Quero fazer um texto com scroll (barra de rolagem) contínua.

Queria declarar valores para uma variável importada de um arquivo TXT.

Preciso de uma ação para desabilitar um botão.

Eu gostaria de saber como faz o efeito de desfoque nos objetos.

Como utilizar a função para procurar valores dentro de uma variável?

Como eu faria um exemplo com zoom no flash?

Como eu faço de um layer uma descrição de uma foto?

Como posso fazer para que um objeto possa rodar no palco?

Calcular distância de um movieclip invisível.
Adicionar ao favoritos

GetMySQLData para Flash5 (primeira parte)

Clipes Inteligentes (SmartClip).

ListBox no FlashMX.

Detectando funções de browser usando ASP

Login e senha

Envio de um arquivo SWF por e-mail

Imagens transparentes usando PhotoShop, Fireworks e Flash.

Enviando variáveis do Flash para ASP.

Jogo tiro ao alvo

Alinhamento de objetos no Corel Draw

LoadVariables & OnClipEvent(data).
Hidden menu

Scroll velo over

Mouse thingy

Focus

Drag open menu

3d cube

Televisão

Botão comutador

Menu elástico

Mouse cross F5

Ir e voltar

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