Ir para conteúdo

POWERED BY:

Arquivado

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

the_flash

Arrastar retangulos pra dentro de um maior

Recommended Posts

Seguinte, no palco eu vou ter um retangulo maior que vai ser o board;

E varios retangulos menores de tamanhos diferentes, preciso arrastar os menores pra dentro do maior(board) e que eles se acomodem dentro do mesmo

 

Sendo que tem que haver uma distancia padrão entre os menores, e que quando tirar um menor, os demais vão pra direita e ocupem o seu espaço...

 

Consegui isso em partes, o código não é de alto nivel, rs

 

Se alguém puder dar uma força, vejam se ficou claro o que eu quero

 

 

 

Segue o código

 

 

plat = 5;	pedal01.onPress = function() {		this.startDrag();	};	pedal02.onPress = function() {		this.startDrag();	};	pedal03.onPress = function() {		this.startDrag();	};	pedal04.onPress = function() {		this.startDrag();	};	pedal05.onPress = function() {		this.startDrag();	};	pedal01.onRelease = pedal01.onReleaseOutside=function () {		this.stopDrag();		if (this.hitTest(_root.board)) {			this._x = _root.board._x+plat;			this._y = _root.board._y+5;			plat = plat+this._width+5;			p1b = true;		} else {			p1b = false;			plat = plat-this._width;		}	};	pedal02.onRelease = pedal02.onReleaseOutside=function () {		this.stopDrag();		if (this.hitTest(_root.board)) {			this._x = _root.board._x+plat;			this._y = _root.board._y+5;			plat = plat+this._width+5;			p1b = true;		} else {			p1b = false;			plat = plat-this._width;		}	};	pedal03.onRelease = pedal03.onReleaseOutside=function () {		this.stopDrag();		if (this.hitTest(_root.board)) {			this._x = _root.board._x+plat;			this._y = _root.board._y+5;			plat = plat+this._width+5;			p1b = true;		} else {			p1b = false;			plat = plat-this._width;		}	};	pedal04.onRelease = pedal04.onReleaseOutside=function () {		this.stopDrag();		if (this.hitTest(_root.board)) {			this._x = _root.board._x+plat;			this._y = _root.board._y+5;			plat = plat+this._width+5;			p1b = true;		} else {			p1b = false;			plat = plat-this._width;		}	};	pedal05.onRelease = pedal05.onReleaseOutside=function () {		this.stopDrag();		if (this.hitTest(_root.board)) {			this._x = _root.board._x+plat;			this._y = _root.board._y+5;			plat = plat+this._width+5;			p1b = true;		} else {			p1b = false;			plat = plat-this._width;		}	};

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, se não se importar eu mudei quase tudo, hehe.

 

Ao invés de trabalhar com uma variável que dá a distância (plats) eu usei uma array. Quando você arrastar um objeto para cima do board, ele vai adicionar esse objeto no final da array. E quando arrastar para fora, vai tirar esse movieclip da array.

 

Aí a array vai sempre conter os movieclips que devem estar no board e na ordem certa. Depois é só chamar uma função para organizar esses movieclips.

 

//Array que conterá os pedais que está dentro do boardvar plats:Array = Array();//Distancia entre um pedal e outrovar distancia:Number = 100;//Um loop para colocar a função para todos os pedais ao mesmo tempofor (var i:Number = 1; i <= 5; i++) {		//Pegando o pedal atual	var pedal_atual:MovieClip = _root["pedal0" + i];		//Colcando o onPress	pedal_atual.onPress = function() {		this.startDrag();	};		//...	pedal_atual.onRelease = pedal_atual.onReleaseOutside = function () {		this.stopDrag();				//Se tiver encostado no board		if (this.hitTest(_root.board)) {						//Já ajeita o y			this._y = _root.board._y + 5;						//Joga ele pra última posição			plats.removerItem(this);			plats.push(this);							//Arruma a posição de acordo com a array			arrumaPedais();					//Caso ele seja arrastado para fora do board		} else {						//Só remove ele da array			plats.removerItem(this);			arrumaPedais();		}	};}//Função para arrumar o _x dos pedaisfunction arrumaPedais() {	var n = plats.length;	for (var a:Number = 0; a < n; a++) {		plats[a]._x = a * distancia + board._x + 5;	}}//Prototype para procurar um elemento na array e exclui-lo por Francisco TeodoricoArray.prototype.removerItem = function(elemento) {	for (var z = 0; z < this.length; ++z) {		if (this[z] == elemento) {			this.splice(z, 1);		}	}	return false;};

Caramba, acho que ficou legal. :)

 

Flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, você merece um prêmio!!Ótimo, só tem um probleminha ainda...Quando eu arrasto os pedais pro boardvar distancia:Number = 100;ele tá dando 100 de distancia entre todos os pedais, na verdade teria que ser o tamanho de cada pedal + 100 (ou outro valor) e cada pedal tem um tamanhoEntendeu?[edit]Acho que não consegui explicar direito, eu usei pedais do mesmo tamanho e ficou perfeito, o problema aparece quando uso pedais de tamanhos diferentes, ai um pedal fica sobre o outro. (agora acho que expliquei bem)

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sim, achei que era fixo. Mas é fácil de mudar:

 

//Função para arrumar o _x dos pedaisfunction arrumaPedais() {	var n = plats.length;	for (var a:Number = 0; a < n; a++) {		distancia = 0;		for (var b:Number = 0; b < a; b++) {			distancia += plats[b]._width + 10;		}		plats[a]._x = distancia + board._x + 10;	}}

Uou, vou até guardar esse fla, hehe.

 

Flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou perfeito!Muito bom mesmo, me motivou a estudar mais.Só to pensando em uma coisa, o board é retangular e cabem duas fileiras de pedais...E os pedais variam de altura também, quando atingir o limite de largura na fileira de cima, o pedal vai pra fileira de baixo.Ex: Eu jogo um pedal de 100px de altura e 25px de largura e mais cinco pedais de 50px de altura e 25px de largura, atingido o limite, eu jogo mais um de 50px de altura e 25px de altura, automaticamente ele pula para a fileira de baixo e respeita a largura de 25px que o primeiro pedal já ocupou.E também, o pedal sendo maior que o espaço disponível (tanto na largura como na altura) tem que dar uma msg de erro ou voltar pra fora do board.Caramba, isso tá ficando complicado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Maluco, você tem sorte que eu gosto desses desafios mais "matemáticos", hehe. Demorei uns 15 minutos, mas ficou legal, diz aí?

 

//Arrays que conterão os pedais que está dentro do board//Linha 1var plats1:Array = Array();//Linha 2var plats2:Array = Array();//Distancia entre um pedal e outrovar distancia:Number = 0;//Um loop para colocar a função para todos os pedais ao mesmo tempofor (var i:Number = 1; i <= 5; i++) {	//Pegando o pedal atual	var pedal_atual:MovieClip = _root["pedal0" + i];	//Colcando o onPress	pedal_atual.onPress = function() {		this.startDrag();	};	//...	pedal_atual.onRelease = pedal_atual.onReleaseOutside = function () {		this.stopDrag();		//Se tiver encostado no board		if (this.hitTest(_root.board)) {			//Joga ele pra última posição			plats1.removerItem(this);			plats2.removerItem(this);			plats1.push(this);			//Arruma a posição de acordo com a array			arrumaPedais();			//Caso ele seja arrastado para fora do board		} else {			//Só remove ele da array			plats1.removerItem(this);			plats2.removerItem(this);			arrumaPedais();		}	};}//Função para arrumar o _x dos pedaisfunction arrumaPedais() {	//Arrumando a linha 1	arrumaLinha(plats1, 1);	//Arrumando linha 2	arrumaLinha(plats2, 2);}//Função que organiza uma linhafunction arrumaLinha(plats:Array, linha:Number) {	//Pegando o número de pedais da linha	var n = plats.length;	for (var a:Number = 0; a < n; a++) {		distancia = 0;		//... nós calculamos a distância em x...		for (var b:Number = 0; b < a; b++) {			//... de todos os mcs até ele			distancia += plats[b]._width + 10;		}		//Se a distância for maior que o tamanho do board + a margem		if (distancia + plats[a]._width > board._width - 20) {			//Se for da linha 1			if (linha == 1) {				//Move para a linha de baixo				plats2.push(plats[a]);				plats1.removerItem(plats[a]);			} else {				//Se for a linha 2 dá um alerta				trace("ta errado seu besta");			}		} else {			//Move x			plats[a]._x = distancia + board._x + 10;			//Dependendo da linha, move o y			linha == 1 ? plats[a]._y = board._y + 10 : plats[a]._y = board._y + 100;		}	}}//Prototype para procurar um elemento na array e exclui-lo por Francisco TeodoricoArray.prototype.removerItem = function(elemento) {	for (var z = 0; z < this.length; ++z) {		if (this[z] == elemento) {			this.splice(z, 1);		}	}	return false;};

Haha, aumentou só um pouquinho... http://forum.imasters.com.br/public/style_emoticons/default/yay.gif

 

Bons estudos, deixei tudo comentado, viu? Flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom mesmo! Recomenda algum livro de AS?Heheh :) Já to ficando sem graça aqui!Funcionou beleza! O unico ajuste que falta é que os pedais tem que ter altura variavel... Com altura fixa ficou show. E pode ser mais de duas fileiras.Mas se funcionar em duas já tá ótimo!

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.