Ir para conteúdo

POWERED BY:

Arquivado

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

KaXaSA

[problema] jogo em flash, movimento + animação.

Recommended Posts

opa beleza http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Antes de tudo pra resumir é um jogo no estilo zelda (movimentação, aquela visão aerea do personagem...), acho que não preciso dar mais detalhes mas caso seja necessario mais tarde eu posto um fla.

 

Eu consigo fazer o personagem se movimentar (todas as direções) e conforme você segura os direcionais ele executa a animação do personagem andando this.gotoAndStop("frame da animação") até ai tudo funcionando perfeitamente, o problema são as animações das diagonais que não rodam, a imagem fica estática dando aquela bela impressão do personagem deslizando pela tela :wacko: eu acredito que seja algo bem óbvio mas não consigo arrumar x_x''

se alguem puder ajudar e souber como resolver eu agradeço, e se alguem tiver alguma sugestão pra otimizar o código fique a vontade http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

class yeti extends MovieClip {
	//-----------------------Variaveis----------------------------
	var teclaAnterior:Number = 0;
	var velocidade_yeti:Number;
	//--------------------Funções/Movimentos----------------------
	function yeti() {
		this.gotoAndStop();
		this.onEnterFrame = movimento;
	}
	function movimento() {
		//verificação de tecla pressionada (ver ultimas linhas do código)
		if (!Key.isDown(teclaAnterior)) {
			teclaAnterior = 0;
			//Mover para esquerda e executar animação do movimento "esquerda"
			if (Key.isDown(Key.LEFT) && !Key.isDown(Key.RIGHT)) {
				teclaAnterior = 1;
				this.gotoAndStop("esquerda");
				this._x -= velocidade_yeti;
			}
			//Mover para direita  e executar animação do movimento "direita"		  
			if (Key.isDown(Key.RIGHT) && !Key.isDown(Key.LEFT)) {
				teclaAnterior = 1;
				this.gotoAndStop("direita");
				this._x += velocidade_yeti;
			}
			//Mover para cima e executar animação do movimento "sobe"			
			if (Key.isDown(Key.UP) && !Key.isDown(Key.DOWN)) {
				teclaAnterior = 1;
				this.gotoAndStop("sobe");
				this._y -= velocidade_yeti;
			}
			//Mover para baixo  e executar animação do movimento "desce"			
			if (Key.isDown(Key.DOWN) && !Key.isDown(Key.UP)) {
				teclaAnterior = 1;
				this.gotoAndStop("desce");
				this._y += velocidade_yeti;
			}
			//Mover para diagonal superior esquerda   
			if (Key.isDown(Key.LEFT) && Key.isDown(Key.UP) && !Key.isDown(Key.RIGHT) && !Key.isDown(Key.DOWN)) {
				teclaAnterior = 2;
				this.gotoAndStop("sobeDE");
			}
			//Mover para diagonal inferior esquerda							  
			if (Key.isDown(Key.LEFT) && Key.isDown(Key.DOWN) && !Key.isDown(Key.RIGHT) && !Key.isDown(Key.UP)) {
				teclaAnterior = 2;
				this.gotoAndStop("desceDE");
			}
			//Mover para diagonal superior direita   
			if (Key.isDown(Key.RIGHT) && Key.isDown(Key.UP) && !Key.isDown(Key.LEFT) && !Key.isDown(Key.DOWN)) {
				teclaAnterior = 2;
				this.gotoAndStop("sobeDD");
			}
			//Mover para diagonal inferior direita							  
			if (Key.isDown(Key.RIGHT) && Key.isDown(Key.DOWN) && !Key.isDown(Key.LEFT) && !Key.isDown(Key.UP)) {
				teclaAnterior = 2;
				this.gotoAndStop("desceDD");
			}
			// se 'teclaAnterior' for == 0, ou seja, nenhuma tecla está precionada então executar animação do personagem parado. 
			if (teclaAnterior == 0) {
				this.gotoAndStop("parado");
			}
		}
	}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só uma primeira observação: this.gotoAndStop(); no constructor parece ser algo obsoleto.

 

Seguindo mais ou menos uma mesma linha:

 

function movimento() {
	this.dirx = 0;
	this.diry = 0;
	//horizontal
	if (Key.isDown(Key.LEFT)) {
		this.dirx = -1;
	} else if (Key.isDown(Key.RIGHT)) {
		this.dirx = 1;
	}
	//vertical   
	if (Key.isDown(Key.UP)) {
		this.diry = -1;
	} else if (Key.isDown(Key.DOWN)) {
		this.diry = 1;
	}
	//velocidade   
	this._x += this.dirx * velocidade_yeti;
	this._y += this.diry * velocidade_yeti;
	//frame de animação
	if (this.dirx == 1) {
		switch (this.diry) {
			case 0 : this.gotoAndStop("direita"); break;
			case 1 : this.gotoAndStop("desceDD"); break;
			case -1 : this.gotoAndStop("sobeDD"); break;
		}
	} else if (this.dirx == -1) {
		switch (this.diry) {
			case 0 : this.gotoAndStop("esquerda"); break;
			case 1 : this.gotoAndStop("desceDE"); break;
			case -1 : this.gotoAndStop("sobeDE"); break;
		}
	} else if (this.diry == 1) {
		this.gotoAndStop("desce");
	} else if (this.diry == -1) {
		this.gotoAndStop("sobe");
	} else {
		this.gotoAndStop("parado");
	}
}

Tipo, primeiro verifica os movimentos horizontais e verticais separadamente (repare que, nessa configuração, ao pressionar esquerda e direita ao mesmo tempo o sistema escolhe a esquerda; para vertical a prioridade é o cima). Aí simplesmente move o personagem de acordo com as velocidades x e y encontradas pelas teclas.

 

A parte da animação não ficou muito bonita, mas deu pra apresentar a idéia. Primeiro considero a velocidade horizontal e a vertical juntas (ou não, no case 0). E depois, já que já foram verificadas as diagonais, só vê se há apenas movimento vertical ou se está parado.

 

Ah, não sei se você já viu, mas leia esse ótimo tuto. Algumas soluções em action são meio antigas, mas dá pra pegar o espírito e adaptar legal. Caso tenha problemas com o inglês, procure aqui no fórum que tem um cara que começou a traduzir esse tutorial inteiro, não sei como está o andamento.

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

nossa cara vlw acabou me tirando outras dúvidas além de ter dado uma bela enxugada no código, e esse link que você passou é ótimo ensina muita coisa, eu já havia visto mas como o código está meio desatualizado eu me perdia fácil :X, mas realmente o cara fez um belo de um tutorial, muito completo só preciso estudar um pouco mais X).

 

vo ver agora se da tudo certinho http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

[]'s

 

edit:. agora todas as animações incluindo as diagonais funcionam perfeitamente :-D thx.

 

edit1:. to montando o sisteminha pra tela seguir o personagem provavelmente vou ter que modificar o código pra fazer com que em vez do personagem o mapa e os objetos de colisão se movimentem. *torcendo pra dar tudo certo*

 

edit2:. tudo funcionando agora se o personagem chega perto dos limites da tela quem se move é o mapa e o MC com as áreas de colisão ^-^' efeito de camera 100%, outra coisa, juro que até agora não entedi o que eu fiz na colisão mas funcionou:

(...)
		if (_root.obstaculo.hitTest(getBounds(_root).xMax, _y, true)) {
			_x = _x-velocidade_yeti;
		}
		if (_root.obstaculo.hitTest(getBounds(_root).xMin, _y, true)) {
			_x = _x+velocidade_yeti;
		}
		if (_root.obstaculo.hitTest(_x, getBounds(_root).yMax, true)) {
			_y = _y-velocidade_yeti;
		}
		if (_root.obstaculo.hitTest(_x, getBounds(_root).yMin, true)) {
			_y = _y+velocidade_yeti;
(...)
alguem me explica a primeira linha do hitTest até o true, por favor :o, eu até meio que entendi mas quando fui tentar fazer de outra forma não deu certo ai eu me confundi todo... :| e pq o _y e o _x do código tem que ficar em posições diferente?

esse 'obstaculo' é o meu movieclip com o contorno do mapa, que são justamente as áreas que o personagem não pode invadir.

 

o único problema desse código é que o hitTest pega uma área do movieclip personagem que eu não gostaria que pegasse, que é justamente aquele retangulo que fica em volta do personagem quando a imagem está em um movieclip, dai sempre que o personaem bate em um 'obstaculo' fica aquele lindo espaço entre ele e o objeto. Se eu entender o código talvez eu consiga fazer um movieclip dentro do mc do personagem, com um retangulo em alpha 0% que ficaria localizado nas pernas do personagem e assim que ocorresse a colisão dos 'obstaculos' com esse retangulo quem tomaria a ação seria o personagem, acho que isso resolveria o meu problema. *maravilha 3:50 da madruga não tomei banho ainda, o tempo voa, amanha com a cabeça mais fresca (sem piadinhas plx) quem sabe eu consiga arrumar XD*

[]'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.