Ir para conteúdo

POWERED BY:

Arquivado

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

GilbertoRicci

[Resolvido] Trazer objetos para frente.

Recommended Posts

Olá,

 

Estou criando um joguinho em Flash CS5.5 onde vários movieClips, criados dinamicamente, se movem para lugares aleatórios da tela. Porém, quando um objeto passa por cima do outro, ás vezes o objeto que está mais "atrás" na tela fica "tapando" o objeto que está mais "na frente" (o objeto com o a coordenada Y menor fica por cima do maior). Eu gostaria que, no meu jogo, o objeto que está na frente ficasse por cima do de trás.

 

Qual seria a melhor maneira para fazer os objetos com o maior Y aparecerem por cima dos com o menor Y? Eu pensei em criar um evento de timer que organizasse a lista de objetos do stage de tempos em tempos, mas não sei se é o melhor caminho...

 

Alguem tem alguma sugestão?

 

 

 

Agradeço desde já pela ajuda e peço desculpas caso a minha dúvida não tenha ficado muito clara.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sua ideia está certa, Gilberto. Você só teria problemas, entretanto, com o desempenho. Calcular as posições deliberadamente teria um alto custo de processamento.

Como eu me inspirei aqui e sou um cara legal, segue uma script aqui que faz o que você precisa. Você pode ver a utilização desse script nesse link.

 

package
{
import flash.display.DisplayObjectContainer;
import flash.display.DisplayObject;
import flash.events.Event;
import flash.display.Sprite;

public class IndexByYExample extends Sprite
{
	public var container:DisplayObjectContainer; // define o container que armazena seus objetos
	private var _childs:Vector.<DisplayObject>; // armazena os objetos do container
	private var _invalid:Boolean; // determina que os objeto precisarão ser reordenados na próxima renderização (próximo frame)

	public function IndexByYExample()
	{
		stage.addEventListener(Event.RENDER, _stageRenderHandler); // ouve quando o stage for renderizado
		container.addEventListener(Event.ENTER_FRAME, _childEnterFrameHandler, false); // pede que cada objeto verifique se sobrepõe um outro.

		setupChildList(); // configura o vector _childs com os elementos do container
	}

	public function setupChildList():void {
		_childs = new Vector.<DisplayObject>(container.numChildren); // cria um vector para armazenar esses objetos
		for (var i:uint; i < container.numChildren; i++) {
			_childs[i] = container.getChildAt(i); // adiciona cada objeto no vector
		}
	}

	public function reorder():void {
		_invalidate(); // solicita o reordenamento
	}

	private function _reorderNow():void {
		_childs = _childs.sort(orderFunction); // ordena o vector
		function orderFunction(a:DisplayObject, b:DisplayObject):Number { // função de ordenamento
			if (b.y > a.y) return 1; // se a coordenada y do objeto for maior que a do outro
			else if (b.y < a.y) return -1; // se for menor
			else return 0; // se for igual
		}

		for (var i:uint; i < _childs.length; i++) {
			if (container.getChildIndex(_childs[i]) == i) continue;
			container.setChildIndex(_childs[i], i); // redefine o ordenamento visual do objeto com base em sua posição ordenada da vector
		}

		_invalid = false;
	}

	private function _invalidate():void {
		stage.invalidate(); // avisa o stage que esperamos a notificação de renderização
		_invalid = true;
	}

	private function _stageRenderHandler(e:Event):void {
		_reorderNow(); // re-ordena
	}

	private function _childEnterFrameHandler(e:Event):void {
		if (_invalid) return;

		var child:DisplayObject = DisplayObject(e.target);
		for each (var c:DisplayObject in _childs) {
			if (child.hitTestObject(c)) { // verifica se cada objeto sobrepõe outro
				_invalidate(); // caso positivo, avisa que na próxima renderização eles devem ordenados
				return;
			}
		}
	}
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não querendo abusar mais já abusando poderia colocar o código dos movieclips que estão se movimentando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não querendo abusar mais já abusando poderia colocar o código dos movieclips que estão se movimentando?

 

Claro. Na verdade é muito mais simples do que parece.

 

package
{
import flash.display.MovieClip;
import com.greensock.TweenLite;

public class Objeto extends MovieClip
{
	public function Objeto() {
		_go();
	}

	private function _go():void {
		TweenLite.to(this, .07 + Math.random() * .5, {x:x - 10 + Math.random() * 20, y:y - 10 + Math.random() * 20, onComplete:_go});
	}
}
}

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.