×
Namespaces

Variants
Actions

Archived:Detecção de colisão otimizada no Flash Lite

From Nokia Developer Wiki
Jump to: navigation, search

Archived.pngAquivado: Este artigo foi arquivado, pois o conteúdo não é mais considerado relevante para se criar soluções comerciais atuais. Se você achar que este artigo ainda é importante, inclua o template {{ForArchiveReview|escreva a sua justificativa}}.

Não recomendamos o desenvolvimento em Flash Lite para aparelhos atuais da Nokia. Todos os artigos relacionados a Flash Lite foram arquivados. A plataforma Nokia Asha e os aparelhos recentes S40 não possuem mais o Flash Lite. O uso de Flash Lite em Symbian é limitado. Por exemplo, informações relativas à plataforma Nokia Belle podem ser encontradas neste link (em Inglês). Informações específicas de Flash Lite para aparelhos S40 ANTIGOS e Symbian podem ser encontradas na Flash Lite Developers Library (em Inglês).

Article Metadata

Exemplo de código
Código fonte: Media:Collision.zip

Artigo
Tradução:
Por edprado
Última alteração feita por hamishwillee em 14 May 2013
--edprado 16:41, 12 April 2010 (UTC)


Contents

Introdução

A detecção de colisão tem um papel importante nas regras dentro de um jogo. Em muitos jogos, a colisão tem que ser identificada entre dois objetos. Por exemplo, em jogos no estilo space shooter, quando a bala colide com a nave, acontece uma explosão. Para testar as colisões existem várias maneiras, a mais simples para os usuários do Flash Lite, é usar a função hitTest().


A maneira mais simples

O código abaixo verifica a colisão entre dois Movieclips, chamados mc e mc2. Vamos assumir que eles já estão no Stage e possuem a mesma coordenada y(para simplificar). Agora, cole o seguinte código em uma camada(layer), no qual possuirá somente o código Action Script .

onEnterFrame = function () {
mc._x++;
if (mc._x>=Stage.width) {
mc._x = -mc._width;
}
if(mc.hitTest(mc2)) {
trace("Collided");
}
};

Agora, nós movemos o Movieclip(mc) no Stage. Assim, você observará que quando mc e mc2 colidirem, uma mensagem será mostrada na janela de Output através da função trace.

A função hitTest() no Flash requer muito processamento. Isto, ocorre porque ele utiliza um algoritmo genérico para checar a colisão. No nosso caso, colocando dois objetos circulares, isto não é necessário. Nós podemos simplificar o processo e reduzir o processamento envolvido por um simples código.

onEnterFrame = function () {
mc._x++;
if (mc._x>=Stage.width) {
mc._x = -mc._width;
}
if(Math.ceil(mc2._x)==Math.ceil((mc._x + mc._width)))
{ trace("collided"); }
};

Aqui, ambos os MovieClips compartilham o mesma coordenada y, nós verificamos a colisão apenas analisando os valores da coordenada x. Executando o código acima, você entenderá que a primeira colisão é detectada por este trecho de código. Nós somos forcados a usar o Math.ceil para converter o valor da coordenada x para um inteiro.


Abordagem Otimizada

Entretanto, isto pode ser um caso não muito real para dois corpos, pois não há variação no valor da coordenada y. Daqui por diante, nós vamos adicionar um algoritmo mais genérico para checar a colisão. A lógica neste teste seria calcular a distância entre os dois corpos e depois relaciona-los com a soma de suas larguras.

Agora, temos os dois mesmos Movieclips no Stage e movendo o mc2 suavemente para baixo(aumentando a coordenada y), nós demonstraremos mais um caso geral. O centro de cada objeto pode ser calculado por:

var center_of_mc = mc._x + mc._width/2, mc._y + mc._height/2;

Isto, funciona quando o ponto de referência do objeto é a posição superior esquerda (Top-Left). Agora, se a distância entre seus centros é menor que a soma de suas larguras, será dito que houve colisão. Vale salientar que a distância entre dois pontos pode ser calculada a partir de: Dist = Sqrt( square(x1-x2) + square(y1-y2))

Cole o seguinte trecho de código e teste você mesmo.

var widthsum = (mc._width+mc2._width)/2;
Y_coord = mc._y;
Mc2_x = mc2._x+mc2._width/2;
Mc2_y = mc2._y;
onEnterFrame = function () {
mc._x++;
if (mc._x>=Stage.width) {
mc._x = -mc._width;
}
distanceBetween = dist(mc._x+mc._width/2, Y_coord, Mc2_x, Mc2_y);
if (distanceBetween<widthsum) {
trace("collided");
}
};
function dist(x1:Number, y1:Number, x2:Number, y2:Number):Number {
sample = Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
return sample;
}

Você pode notar que o mc2 é imóvel então eu calculei o seu centro fora do onEnterFrame e isto aplica para a coordenada y e a soma de suas larguras. É interessante reduzir a computação dentro de laços de repetição(loops) ou dentro da função onEnterFrame. Este tipo de verificação, é a maneira básica para verificar colisões entre objetos circulares.


Download código-fonte

Um exemplo baseado neste artigo está disponível em Media:Collision.zip.

This page was last modified on 14 May 2013, at 10:20.
230 page views in the last 30 days.