Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dark.Magician

Como não caminhar sobre os obstaculos no Mapa?

Recommended Posts

Oláh,

 

Vou tentar ser o mais "curto e grosso" possivel, e para uma duvida o seguinte algoritmo:

- Tenho uma mapa quadrado n px por n px;

-- nesse mapa existem estradas, calçadas, casas e arvores;

--- Estradas e calçadas, o personagem pode caminhadar sobre;

--- As casas e arvores são obstaculos que o personagem não pode caminhar sobre;

uma referencia poderia ser os jogos do Pokémon ;)

 

minha solução para isso foi:

- criar todo o mapa (de exemplo) em uma .png no layer 1;

-- criar objetos invisiveis sobre os objetos referente ao mapa do layer 1 no layer 2;

--- Fazer uma Colisão onde, se o char colidir com o layer 2 ele simplesmente não faz nada, ou seja não caminha sobre o objeto;

 

essa solução funcionou perfeitamente, acontece que isso me torna as coisas mais complicadas, pois teria que fazer um mapa em .png ou .jpg com dimensoes superiores a 28.000 Px por 26.000 Px e ainda um layer posicionando cada objeto a referencia e isso preojudicaria muito mas muito o desenpenho da aplicação.

 

E a pergunta, essa éh uma solução cabivel e o mesmo e resultado em outros projetos ou existe uma solução mais simples, se sim Qual?

 

Obrigado,

William

Compartilhar este post


Link para o post
Compartilhar em outros sites

conheço 2 formas para resolver isso

 

 

1º) ao invés de trabalhar com vários objetos, um para cada área, trabalhe com apenas 1, e dentro dele você coloca todos os quadrados das áreas, dai é só fazer o hitTest apenas nesse que tem todos

 

porem, existe o problema do hitTest do flash ser meio "burro", digo burro pois ele não considera as curvas e outras formas complexas, para ele tudo é quadrado/retângulo, então para resolver isso você teria que fazer o hitTest de outra forma, com bitmapData

 

mas não se preocupe, tem uma classe pronta que faz isso http://forum.imasters.com.br/public/style_emoticons/default/joia.gif (já usei muito ela):

 

Complex HitTest em AS2

 

Complex HitTest em AS3

 

 

2º) uma forma mais "profissa" :D, de fazer seria trabalhar com o "método tile", basicamente,

você teria um array representando o seu mapa:

 

var mapa_arr:Array= [
 [1,1,1,1,1,1,1,1],
 [1,0,0,0,0,0,0,1],
 [1,0,0,0,0,0,0,1],
 [1,0,0,1,1,0,0,1],
 [1,0,0,1,1,0,0,1],
 [1,0,0,0,0,0,0,1],
 [1,0,0,0,0,0,0,1],
 [1,1,1,1,1,1,1,1]
];

esse array tem 8x8, se seu mapa tem 800x800px então cada quadrado dele tem 80px, os numero "1"

representa as áreas que o personagem não pode andar(tipo paredes ou casas),

e o "0" é onde ele pode andar

 

suponha que o personagem começa na posição [1, 1] onde esta "0", e ele vai para cima, onde tem "1" e ele não poderia ir:

 

var personX:Number = 1;
var personY:Number = 1;
function testaHit(posX:Number, posY:Number):Boolean {

	if (mapa_arr[posX][posY] == 1) {
  	   	 return false;		
	}
  	   	 return true;	
}

// personagem subiu, então diminui na coordenada Y
personY = personY - 1;
if(testaHit(personX, personY)){
    //pode mover
}else{
   //volta para onde estava
}

 

eu expliquei bem por cima, para ver algo mais detalhado eu recomendo esse tutorial, para quem trabalha com jogos em flash ele é bem conhecido

 

 

 

bem, acho que é isso, o 1º que mostrei é mais simples de fazer, e dá mais liberdade no design,

mas o 2º consome menos processamento, e ficará mais organizado, além de ser melhor se você

tiver que trabalhar com outros fatores como sobreposição dos obstáculos, e caso esses obstáculos

se movam no mapa

 

 

apesar de gostar do assunto, vou parar por aqui que já escrevi de mais ^_^

 

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.