Você faz hitTest dentro de um for no EnterFrame?

Flash games Add comments

Então você faz hitTestObject no for dentro de um EnterFrame, hein? Deixa eu adivinhar:

hero.addEventListener(Event.ENTERFRAME, testaColisao);
function testaColisao(evt:Event):void{
       var hero:MovieClip=MovieClip(evt.currentTarget);
       var inimigo:MovieClip;
 
       for(var i:int=0; i < inimigos.lenght; i++){
              inimigo=MovieClip(inimigos[i]);
 
              if(hero.hitTestObject(inimigo)){
                     trace("bateu!!!");
              }
       }
}

Tá loco!!!

Quem sabe você pensa diferente e faz com um Array bidimensional? A idéia é que cada vez que (por exemplo), seu hero se mover ou se cenário se moverem, você muda o índice do Array. Se tem alguma coisa com que colidir, o ínidice é 1. Se não, é 0.

var mapa:Array= [
 [0,0,0,0,0,0,0,0],
 [0,0,0,0,1,0,0,0],
 [0,0,0,0,1,0,0,0],
 [0,0,0,0,1,0,0,0],
 [0,0,0,0,0,0,0,0],
 [0,0,0,1,1,1,0,0],
 [0,0,0,0,0,0,0,0],
 [0,0,0,0,0,0,0,0]
];
 
var vel:int=200/mapa[0].length;
var indiceX:int=4;
var indiceY:int=7;
 
stage.addEventListener(KeyboardEvent.KEY_DOWN, moveCenario);
function moveCenario(evt:KeyboardEvent) {
	if (evt.keyCode==Keyboard.LEFT) {
		if (mapa[indiceY][indiceX-1]!=1) {
			indiceX-=1;
                            fundo.x+=vel;
	}
}

Neste exemplo o cenário anda apenas quando a tecla LEFT do teclado é pressionada. A posição inicial (os valores inicias das variáveis indiceX e indiceY) é dada pela posição do hero no cenário.
O resultado é este (clique sobre a]o swf para dar foco e use a tecla LEFT):

Você precisa ter o Flash player 9 para ver este conteúdo

O código que está aí não está completo… Você só vai conseguir dar um passo para cima (na verdade, é o cenário que se move) e vai dar de “cara” na parede.  Além disso, se você baixar o fla, vai perceber que não implementei controles de cenário (impedir a movimentação quando chegar nos extremos). Mas tudo isso é implementável. Esta base é usada por engines “isométricas” para controlar tanto a movimentação quanto as colisões e profundidades (o que está na frente e o que está atrás).

Uma engine bem conhecida é esta aqui: http://code.google.com/p/as3isolib/

E se você achou bala esse código (porque eu acho!) pode ler muito mais sobre isso neste site, que é uma importante referência para quem faz games (fpara flash): http://www.tonypa.pri.ee/

1258893321_Flash Baixe aqui o fla

PS: Este post foi escrito porque meus alunos de projeto de games, o Beto e o William me torraram a paciência até eu explicar como fazia isso. Eu não podia deixar eles fazendo hitTest no for dentro de um EnterFrame para um cenário com 5.000 pixels de largura. Boa sorte meninos! Quero ver esse jogo funcionando!

3 Responses to “Você faz hitTest dentro de um for no EnterFrame?”

  1. Beto Says:

    Aewww Gabriela professora =D
    só temos uma pequena correção feita em aula né?
    Podemos verificar nossa array uma posição a frente de nosso personagem(o “cara”, instanciado no projeto.). Já que eu sou muito chato (hahahahaha), vim postar aqui a solução =D

    No if (evt.keyCode==Keyboard.LEFT) {
    //aqui basta aplicar [indiceX-1]
    if (mapa[indiceY][indiceX-1]!=1) {
    indiceX-=1;
    if (mapa[indiceY][indiceX]!=1) {
    fundo.x+=vel;

    Ai tudo funciona. Ae =D

    Hey, Professora, mas estou em casa e fazendo aquela idéia de o personagem ter 5 pixels e caminhar dentro de um quadrado e a cada 25 pixels ele verifica o indice. Pois bem, este é o códiogo:

    if (evt.keyCode==Keyboard.RIGHT) {
    if((cara.x+cara.width)/25){
    if (mapa[indiceY][indiceX+1]!=1) {
    indiceX+=1;
    fundo.x-=vel;
    }
    }
    }

    Mas não está funcionando.
    O que pode estar errado?
    Um abraço do teu aluno Beto.
    PS: sim, o jogo vai funcionar, nem que eu tenha que deixar de dormir algumas semanas. rsrsrs. valeu

  2. gabrielaperry Says:

    Pois é, eu fiquei falando em “resto da divisão” e acabei não falando como usar o operador módulo… Fica assim:

    if (evt.keyCode==Keyboard.RIGHT) {
    if((cara.x+cara.width)%25 == 0){ //Se o resto da divisão por 25 for zero, ou seja, se é múltiplo de 25 :0)
    if (mapa[indiceY][indiceX+1]!=1) {
    indiceX+=1;
    fundo.x-=vel;
    }
    }
    }

    Vamos que uma hora sai!

  3. Leonardo Hessel Says:

    Fiz algo do tipo em AS2 quando fiz um game do PACMAN, mas “sim” fiz a loucura do hitTest dentro de um for.

    Na verdade fiz somente para registrar as posições, isto só ocorria no loader do game, após isto o “pacman” já sabia por onde ele poderia passar.

    Tudo isto para não ter que montar o array bidimensional, acredito que fica muito!! mais facil. Pois as areas que montei possuem um linkage ( Caminho, Parede ). Assim qualquer pessoa pode montar o cenario como preferir.

    E sem dúvidas o array bidimensional é 100% desempenho.

    Parabéns pelo post.

Leave a Reply

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in