Rariel 0 Denunciar post Postado Agosto 22, 2010 Bem eu inseri no palco vários objetos clicando em determinado botões que criei, esses objetos vão sendo incluídos dentro de uma matriz a medida que são criados, ou seja crio um objeto no placo através do botão e ele fica guardado na matriz, na ordem de inserção, até ai tudo bem. Ai esse objetos inseridos no palco eu posso movimentar par ao lugar que eu quiser, e é claro quando eu movimentos eles no palco ele assumem um determinada coordenada certo. Bem o problema é o seguinte eu preciso ordenar os objetos dentro da matriz pela ordem de menor coordenada dos objetos no placo, ex: se eu tenho um objeto no palco que estão nas coordenas (50,60) mas na matriz esse objeto esta na terceira posição e se esse objeto for o que esta na menor coordenada no palco eu tenho que passar ele por exemplo para a primeira posição da matriz, e assim por diante, o próximo com menor coordenada passar para segunda posição, o terceiro com menor coordenada no palco para o terceira posição na matriz e assim por diante. Aqui esta o código que fiz, mas só consegui fazer para as coordenas y, ou seja, as verticais, quando faço para as coordenadas x do erro. for (var l1 in ListaIdCopia) { for (var l2 in ListaIdCopia) { if (ListaIdCopia[l1].y < ListaIdCopia[l2].y) { troca[0] = ListaIdCopia[l2]; ListaIdCopia[l2] = ListaIdCopia[l1]; ListaIdCopia[l1] = troca[0]; } } } Compartilhar este post Link para o post Compartilhar em outros sites
Foxn 3 Denunciar post Postado Agosto 22, 2010 Pra resolver esse problema eu preciso saber, qual sua prioridade? Imagine, tenho o elemento a em (x:0, y:10) e o elemento b em (x:10,y:0). Quer dizer, o elemento a está acima do elemento b mas está atrás dele, então neste caso quem é prioridade neste caso? 1 - A posição x é mais importante? 2 - A posição y é mais importante? 3 - Uma correlação entre as duas posições será sua referência? Att, Compartilhar este post Link para o post Compartilhar em outros sites
Foxn 3 Denunciar post Postado Agosto 22, 2010 Esquece o que eu disse antes, você já afirmou que quer uma correlação entre os dois então vamos fazer o seguinte. Tomando como base o ponto (x:0,y:0) do palco, vamos calcular qual elemento está mais próximo desta posição para definir sua ordem na lista. A ligação entre os ponto forma uma reta que pode ser fechada em um triângulo retângulo, sendo assim a hipotenusa representa a distância que temos de descobrir. Então vamos ao cálculo: var CO:Number; // Cateto Oposto var CA:Number; // Cateto Adjacente var H1:Number; // Hipotenusa do primeiro elemento var H2:Number; // Hipotenusa do segundo elemento var Contar:Number; // Conta a posição onde o elemento vai ficar var Lista:Array; // Quarda todos os elementos var l1:Number; // Lista o primeiro grupo var l2:Number; // Lista o segundo grupo for(l1 in Lista) { // Conta o total de elementos para definir a posição deste elemento. // Inicialmente ele fica na última posição. Contar = Lista.length; // Calculando a distância entre o ponto zero e a posição do primeiro elemento. CO = Math.abs(Lista[l1].y); CA = Math.abs(Lista[l1].x); H1 = Math.sqrt(Math.pow(CO,2)+Math.pow(CA,2)); for(l2 in Lista) { // Calculando a distância entre o ponto zero e a posição do segundo elemento. CO = Math.abs(Lista[l2].y); CA = Math.abs(Lista[l2].x); H2 = Math.sqrt(Math.pow(CO,2)+Math.pow(CA,2)); // Comparando, se o primeiro elemento estiver mais próximo do ponto zero em relação ao segundo. if(H1 <= H2) { // Então ele ganha uma posição na lista. Contar --; } } // esta é a posição que ele deveria ocupar na lista trace(Contar); } Não cheguei a testar, mas acho que funciona. Att, Compartilhar este post Link para o post Compartilhar em outros sites
brunobispo 20 Denunciar post Postado Agosto 23, 2010 var itens:Array = [m1, m2, m3]; // MovieClips no palco function refreshOrder(array:Array, target:DisplayObject):Array { // a array a ser reorganizada e target sendo um MovieClip cujas coordenadas servem como base às distâncias dos outros return array.sort( function(a:Object, b:Object):Number { var distanceA:Number = Math.sqrt(a.x - target.x) * Math.sqrt(a.y - target.y); var distanceB:Number = Math.sqrt(b.x - target.x) * Math.sqrt(b.y - target.y); if(distanceA < distanceB) { return -1; } else if(distanceA > distanceB) { return 2; } else { return 0; } } ); } itens = refreshOrder(itens, B); trace(itens.map(function(element:*, index:int, arr:Array){return element.name})); // Só para retornar o nome da instância de cada um Compartilhar este post Link para o post Compartilhar em outros sites