Ir para conteúdo

Arquivado

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

Thales Rodrigues

Como fazer o jogo parar de ficar lento

Recommended Posts

Como eu já falei em tópicos anteriores, estou trabalhando num jogo onde você tem uma torre no centro da tela e vem aparecendo uns mísseis, você tem que atirar neles antes que eles atinjam sua torre.

Mas tem um problema que vem me irritando faz tempo: O jogo começa a ficar lento ao longo do tempo, eu já tentei de tudo para acabar com isso mas não dá certo!

Eu não sei porque isso acontece, eu acho que é por causa daqueles erros que aparecem no painel de saída, que eu não consigo resolver.

 

TypeError: Error #1009: Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.
at TowerDefense_fla::MainTimeline/anima()TypeError: Error #1009: Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.
at TowerDefense_fla::MainTimeline/anima()

 

Aí vai o código da função anima caso seja necessário:

 

function anima(e:Event):void
{
	velVerde *=  aceleracao;
	missil = DisplayObject(e.target);
	missil.addEventListener(MouseEvent.CLICK, atirar);
	if (missil.hitTestObject(tiro))
	{
		tiro.parent.removeChild(tiro);
		if (efeitos)
		{
			explode.play();
		}
		explosao = new Explosao();
		addChild(explosao);
		explosao.x = missil.x;
		explosao.y = missil.y;
		quadroExplosao = 1;
		setChildIndex(explosao, 2);
		if (missil.hitTestObject(cinquenta))
		{
			multiplica = 5;
		}
		if (missil.hitTestObject(vinte))
		{
			multiplica = 2;
		}
		if (missil.hitTestObject(dez))
		{
			multiplica = 1;
		}
		if (missil.hitTestObject(cinco))
		{
			multiplica = 0.5;
		}
		if (missil.hitTestObject(dois))
		{
			multiplica = 0.2;
		}
		ganha = 10 * multiplica;
		pontos +=  ganha;
		ponto = new Ponto();
		addChild(ponto);
		ponto.x = missil.x;
		ponto.y = missil.y;
		setChildIndex(ponto, 2);
		ponto.quantidade.text = String(ganha);
		adicionarEvento();
		missil.removeEventListener(Event.ENTER_FRAME, anima);
		missil.parent.removeChild(missil);
	}
	if (vida == 0)
	{
		canal.stop();
		missil.removeEventListener(Event.ENTER_FRAME, anima);
		missil.parent.removeChild(missil);
		torre.removeEventListener(Event.ENTER_FRAME, gira);
	}
	if (missil.hitTestObject(torre))
	{
		if (efeitos)
		{
			explode2.play();
		}
		vida--;
		torre.gotoAndPlay(2);
		explosao = new Explosao();
		addChild(explosao);
		explosao.x = torre.x;
		explosao.y = torre.y;
		setChildIndex(explosao, 2);
		missil.removeEventListener(Event.ENTER_FRAME, anima);
		missil.parent.removeChild(missil);
	}
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu pesquisei, então decidi reaproveitar os mísseis que você explode. Mas não está dando certo, o jogo continua lento...

Eu tentei fazer um array que junta todos os mísseis explodidos. Para adicionar os mísseis no jogo eu uso um número aleatório (a variável "tipo"). Quando aquele tipo de míssil já foi adicionado (Todos os tipos eu coloco num array chamado "tipos"), eu mando o flash adicionar o último elemento do array que tem os mísseis explodidos. A função em si funciona, mas não resolve meu problema.

 

Essa é a condição que faz o míssil ser reaproveitado:

else if (tipos.indexOf(tipo) != -1)
	{
		trace('REAPROVEITOU');
		addChild(explodidos[posicao]);
		explodidos.pop();
		posicao--;
		var missilEvento:DisplayObject = DisplayObject(explodidos[posicao]);
		missilEvento.x = eixoX;
		missilEvento.y = eixoY;
		missilEvento.visible = true;
		missilEvento.addEventListener(Event.ENTER_FRAME, anima);
		missilEvento.addEventListener(Event.ENTER_FRAME, mexe1);
		anguloMissil = Math.atan2(torre.y - missilEvento.y,torre.x - missilEvento.x) * 180 / Math.PI;
		explodidos[posicao].rotation = anguloMissil;
		switch (tipo)
		{
			case 0 :
			case 4 :
			case 8 :
			case 16 :
				missil.addEventListener(Event.ENTER_FRAME, bonus);
				break;
			case 1 :
			case 2 :
			case 3 :
			case 11 :
				break;
			case 5 :
			case 6 :
			case 15 :
				missil.removeEventListener(Event.ENTER_FRAME, mexe1);
				missil.addEventListener(Event.ENTER_FRAME, mexe2);
				break;
			case 9 :
			case 7 :
				break;
			case 10 :
			case 13 :
			case 12 :
				break;
			case 14 :
			case 17 :
				missil.removeEventListener(Event.ENTER_FRAME, anima);
				missil.addEventListener(Event.ENTER_FRAME, double);
				break;
			case 18 :
			case 19 :
				missil.addEventListener(Event.ENTER_FRAME, flashbang);
				break;
			case 20 :
			case 21 :
				missil.removeEventListener(Event.ENTER_FRAME, mexe1);
				missil.addEventListener(Event.ENTER_FRAME, mexe4);
				break;
		}
	}

 

E aqui é o que faz o míssil explodir e adiciona ele ao array:

if (missil.hitTestObject(tiro))
	{
		tiro.parent.removeChild(tiro);
		if (efeitos)
		{
		}
		explode.play();
		explosao = new Explosao();
		addChild(explosao);
		explosao.x = missil.x;
		explosao.y = missil.y;
		quadroExplosao = 1;
		setChildIndex(explosao, 2);
		ganha = 10 * multiplica;
		pontos +=  ganha;
		ponto = new Ponto();
		addChild(ponto);
		ponto.x = missil.x;
		ponto.y = missil.y;
		setChildIndex(ponto, 2);
		ponto.quantidade.text = String(ganha);
		adicionarEvento();
		explodidos.push(missil);
		posicao++;
		//missil.parent.removeChild(missil); //Eu removi essa linha de código transformando-a num comentário
		missil.visible = false;
		missil.removeEventListener(Event.ENTER_FRAME, anima);
		missil.removeEventListener(Event.ENTER_FRAME, mexe1);
		missil.removeEventListener(Event.ENTER_FRAME, mexe2);
		missil.removeEventListener(Event.ENTER_FRAME, mexe3);
		missil.removeEventListener(Event.ENTER_FRAME, mexe4);
	}

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.