Ir para conteúdo

POWERED BY:

Arquivado

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

Weverton N

Posicionar MCs randomicamente de modo que não encostem.

Recommended Posts

Galera... to fazendo uma pagina do site que estou produzindo onde ele pega 4 mcs e coloca os valores dele no palco randomicamente...

O porém é que algumas vezes eles ficam perto demais ou ficam um em cima do outro.. e isso eu não queria que acontecesse..

 

Alguém sabe ou tem uma função pronta para que esses mcs não fiquem um em cima do outro.. ou até melhor, que fiquem numa distância no mínimo de uns 50px um do outro?

 

Segue abaixo o link do swf:

http://www.iddg.com.br/links.swf

(vai apertando F5 pra ver que cada vez que entra ele posiciona os links em um lugar)

 

e do .fla:

http://www.iddg.com.br/links.zip

 

 

Ve ae se alguém me da essa ajudinha...

Compartilhar este post


Link para o post
Compartilhar em outros sites

use getProperty pra obter a posição do objeto.

 

antes de setar o posicionamento de algum objeto, verifique se já nao existe algum objeto em determinada area

 

pra fazer o calculo da area você deve ter as coordenadas de X e Y e a partir delas fazer a soma de W e H

 

AREA = a partir do ponto X + W, até o ponto Y + H.

 

/----W-----\X-----------Y\|			   | :|			   | H|			   | :|_________|/

Compartilhar este post


Link para o post
Compartilhar em outros sites

use getProperty pra obter a posição do objeto.antes de setar o posicionamento de algum objeto, verifique se já nao existe algum objeto em determinada areapra fazer o calculo da area você deve ter as coordenadas de X e Y e a partir delas fazer a soma de W e HAREA = a partir do ponto X + W, até o ponto Y + H.

/----W-----\X-----------Y\|			   | :|			   | H|			   | :|_________|/
Uhm.. era isso que já tinha pensado em fazer, so não sabia como.. mas agora lendo ae da maneira que você falou já comecei a ter uma idéia, vou testar aqui, se conseguir eu posto a solução!

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que deve ter algum script pronto, mas nao sei onde encontrar porque nao sei qual palavra pesquisar.estou fazendo um teste aqui tb. faz o seu aí que depois a gente compara.

Compartilhar este post


Link para o post
Compartilhar em outros sites

montei um.

 

está cheio de bug.

 

o problema nele é que quando encontra as pociçoes conflitantes ele seta a posicao X e Y de forma aleatoria.

 

vou ver um jeito de nao aribuir aleatoriamente

 

 

pra usar, crie 2 MCs e dê os nomes de instancia "mc1" e "mc2"

 

no primeiro frame do primeiro layer ou qq outro layer coloque o script abaixo

 

ACTIONSCRIPT
raiz   = _root;

scr_w  = 200; // task area width

scr_h  = 200; // task area height

 

mvs    = new Array();

mvs[1] = 'mc1';

mvs[2] = 'mc2';

 

low    = 0;

ladd   = 10;

mc_qtd = mvs.length;

mvsPr  = new Array();

 

for( i = 1; i < mc_qtd; i++ ){

        mvsPr[i]    = new Array();

        mvsPr[i]['W']      = raiz[ mvs[i] ]._width;

        mvsPr[i]['H']      = raiz[ mvs[i] ]._height;

        mvsPr[i]['X']      = raiz[ mvs[i] ]._x;

        mvsPr[i]['Y']      = raiz[ mvs[i] ]._y;

        mvsPr[i]['W2']     = Number( scr_w - mvsPr[i]['W'] );

        mvsPr[i]['H2']     = Number( scr_h - mvsPr[i]['H'] );

 

        // setting positions   

        px = setXY(i,0,false);

        py = setXY(i,1,false);

 

        mvsPr[i]['X']     = px;

        mvsPr[i]['Y']     = py; 

        //trace( 'z: ' + px );

        check_positions( i );

        //

        if( i > 1 && (np = check_positions( mvsPr, i )) ){

                mvsPr[i]['X'] = np[0];

                mvsPr[i]['Y'] = np[1]

        }

        //

}

 

function setXY(n,nn,recursive){

        var xx = new Array();

        xx[0] = ( random_p(0) + ladd );

        xx[1] = ( random_p(1) + ladd );

        raiz[ mvs[n] ]._x = xx[0];

        raiz[ mvs[n] ]._y = xx[1];

 

        // desativado. serve pra controle recursivo.

        /*

        if( recursive ){

                mvsPr['X']     = px;

                mvsPr['Y']     = py; 

                check_positions( n );

        }

        */

       

        return xx[nn];

}

 

function random_p(n){

        var xx = new Array();

        xx[0]  = ( Math.floor(Math.random() * ( mvsPr[i]['W2'] - low) ) ) + low;

        xx[1]  = ( Math.floor(Math.random() * ( mvsPr[i]['H2'] - low) ) ) + low;

        return xx[n];

}

 

function check_positions( n ){

       

        var j, mr1, mn1, mr2, mn2, msg_status;

        var newxy = new Array();

        var newp = false;

        var cpx = mvsPr[n]['X'];

        var cpy = mvsPr[n]['Y'];

        var mr  = mvsPr[n]['W'] + cpx;

        var mn  = mvsPr[n]['H'] + cpy;

       

        for( j = 1; j < n; j++ ){

                mn1 = mvsPr[j]['X'];

                mr1 = mvsPr[j]['X'] + mvsPr[j]['W'];

                mn2 = mvsPr[j]['Y'];

                mr2 = mvsPr[j]['Y'] + mvsPr[j]['H'];

                msg_status = '';

                if( ( cpx < mr1 && cpx > mn1 ) || ( mr < mr1 && mr > mn1 ) ){

                        // same X coordinate. need checkout Y coordinate

                        if( ( cpy < mr2 && cpy > mn2 ) || ( mn < mr2 && mn > mn2 ) ){

                                // same Y coordinate. new coordinate is needed

                                newxy[0] = setXY(n,0,false);

                                newxy[1] = setXY(n,1,false);

                                newp = true;

                                //trace(newxy[0] + ' XXX ' + newxy[1]);

                                msg_status = "NEW X, Y coordinate was adjusted";

                        }else{

                        msg_status = "Y coordinate checkout was needed";

                        //break;

                        }

                }else{

                msg_status = "coordinate checkout was not needed";

                //break;

                }

                // for debug

                msg  = '';

                msg += 'ncpx: ' + cpx;

                msg += 'ncpy: ' + cpy;

                msg += 'nmr: '  + mr;

                msg += 'nmn: '  + mn;

                msg += 'nmn1: ' + mn1;

                msg += 'nmn2: ' + mn2;

                msg += 'nmr1: ' + mr2;

                msg += 'nmr2: ' + mr2;

                msg += 'nnmsg_status: ' + msg_status.toUpperCase();

                msg += 'n------------------------------------------------------------';

                msg += 'nX Rule checkout';

                msg += 'n    IF this is true';

                msg += 'n      ' + cpx + ' < ' + mr1 + ' && ' + cpx + ' > ' + mn1;

                msg += 'n      ' + mr + ' < ' + mr1 + ' && ' + mr + ' > ' + mn1;

                msg += 'n    THEN Y checkout is needed';

 

                msg += 'nnY Rule checkout';

                msg += 'n    IF this is true';

                msg += 'n      ' + cpy + ' < ' + mr2 + ' && ' + cpy + ' > ' + mn2;

                msg += 'n      ' + mn + ' < ' + mr2 + ' && ' + mn + ' > ' + mn2;

                msg += 'n    THEN NEW X, Y coordinate adjust is needed';

                msg += 'n------------------------------------------------------------';

                //

               

                trace(msg);

 

        }

        if( newp ){

        return newxy;

        }else{

        return newp;

        }

       

}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

montei um.

 

está cheio de bug.

 

o problema nele é que quando encontra as pociçoes conflitantes ele seta a posicao X e Y de forma aleatoria.

 

vou ver um jeito de nao aribuir aleatoriamente

 

 

pra usar, crie 2 MCs e dê os nomes de instancia "mc1" e "mc2"

 

no primeiro frame do primeiro layer ou qq outro layer coloque o script abaixo

 

ACTIONSCRIPTraiz = _root;

scr_w = 200; // task area width

scr_h = 200; // task area height

 

mvs = new Array();

mvs[1] = 'mc1';

mvs[2] = 'mc2';

 

low = 0;

ladd = 10;

mc_qtd = mvs.length;

mvsPr = new Array();

 

for( i = 1; i < mc_qtd; i++ ){

mvsPr = new Array();

mvsPr['W'] = raiz[ mvs ]._width;

mvsPr['H'] = raiz[ mvs ]._height;

mvsPr['X'] = raiz[ mvs ]._x;

mvsPr['Y'] = raiz[ mvs ]._y;

mvsPr['W2'] = Number( scr_w - mvsPr['W'] );

mvsPr['H2'] = Number( scr_h - mvsPr['H'] );

 

// setting positions

px = setXY(i,0,false);

py = setXY(i,1,false);

 

mvsPr['X'] = px;

mvsPr['Y'] = py;

//trace( 'z: ' + px );

check_positions( i );

//

if( i > 1 && (np = check_positions( mvsPr, i )) ){

mvsPr['X'] = np[0];

mvsPr['Y'] = np[1];

}

//

}

 

function setXY(n,nn,recursive){

var xx = new Array();

xx[0] = ( random_p(0) + ladd );

xx[1] = ( random_p(1) + ladd );

raiz[ mvs[n] ]._x = xx[0];

raiz[ mvs[n] ]._y = xx[1];

 

// desativado. serve pra controle recursivo.

/*

if( recursive ){

mvsPr['X'] = px;

mvsPr['Y'] = py;

check_positions( n );

}

*/

 

return xx[nn];

}

 

function random_p(n){

var xx = new Array();

xx[0] = ( Math.floor(Math.random() * ( mvsPr['W2'] - low) ) ) + low;

xx[1] = ( Math.floor(Math.random() * ( mvsPr['H2'] - low) ) ) + low;

return xx[n];

}

 

function check_positions( n ){

 

var j, mr1, mn1, mr2, mn2, msg_status;

var newxy = new Array();

var newp = false;

var cpx = mvsPr[n]['X'];

var cpy = mvsPr[n]['Y'];

var mr = mvsPr[n]['W'] + cpx;

var mn = mvsPr[n]['H'] + cpy;

 

for( j = 1; j < n; j++ ){

mn1 = mvsPr[j]['X'];

mr1 = mvsPr[j]['X'] + mvsPr[j]['W'];

mn2 = mvsPr[j]['Y'];

mr2 = mvsPr[j]['Y'] + mvsPr[j]['H'];

msg_status = '';

if( ( cpx < mr1 && cpx > mn1 ) || ( mr < mr1 && mr > mn1 ) ){

// same X coordinate. need checkout Y coordinate

if( ( cpy < mr2 && cpy > mn2 ) || ( mn < mr2 && mn > mn2 ) ){

// same Y coordinate. new coordinate is needed

newxy[0] = setXY(n,0,false);

newxy[1] = setXY(n,1,false);

newp = true;

//trace(newxy[0] + ' XXX ' + newxy[1]);

msg_status = "NEW X, Y coordinate was adjusted";

}else{

msg_status = "Y coordinate checkout was needed";

//break;

}

}else{

msg_status = "coordinate checkout was not needed";

//break;

}

// for debug

msg = '';

msg += 'ncpx: ' + cpx;

msg += 'ncpy: ' + cpy;

msg += 'nmr: ' + mr;

msg += 'nmn: ' + mn;

msg += 'nmn1: ' + mn1;

msg += 'nmn2: ' + mn2;

msg += 'nmr1: ' + mr2;

msg += 'nmr2: ' + mr2;

msg += 'nnmsg_status: ' + msg_status.toUpperCase();

msg += 'n------------------------------------------------------------';

msg += 'nX Rule checkout';

msg += 'n IF this is true';

msg += 'n ' + cpx + ' < ' + mr1 + ' && ' + cpx + ' > ' + mn1;

msg += 'n ' + mr + ' < ' + mr1 + ' && ' + mr + ' > ' + mn1;

msg += 'n THEN Y checkout is needed';

 

msg += 'nnY Rule checkout';

msg += 'n IF this is true';

msg += 'n ' + cpy + ' < ' + mr2 + ' && ' + cpy + ' > ' + mn2;

msg += 'n ' + mn + ' < ' + mr2 + ' && ' + mn + ' > ' + mn2;

msg += 'n THEN NEW X, Y coordinate adjust is needed';

msg += 'n------------------------------------------------------------';

//

 

trace(msg);

 

}

if( newp ){

return newxy;

}else{

return newp;

}

 

}

beleza.. vou ver aqui, não deu tempo de fazer o meu, pq so tenho os arquivos do site la em casa.. mas vou testar o seu aqui e ver se rola.

Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom hinom...

no seu codigo ae eu tentei dar uma olhada mas achei meio confuso (não pq está mal feito, mas pq não está focado especialmente na minha necessidade), mas msm assim obrigado.. tive um tempinho aqui e criei uma função que posiciona os mcs ae:

 

ACTIONSCRIPT
//variáveis

var myMCs:Array = new Array(mc1, mc2, mc3);

var raiz = _root;

var distW = distH =20; //distancia nas laterais

//importa as classes

import mx.transitions.*;

import mx.transitions.easing.*;

//função para definir os tamanhos

function defineX(i) {

        //define como emcima por padrão

        var emCima = true;

        //enquanto estiver em cima

        while (emCima) {

                //define as variaveis randomicas para x e y

                X = random(500);

                Y = random(350);

                //numero de emcimas

                nCima = 0;

                trace("KIT de "+i+" - X:"+X+" Y:"+Y+" nCima:"+nCima);

                //faz o loop para averiguar se está emcima

                for (a=1; a<=i; a++) {

                        var mc = myMCs[i-1];

                        //ve se está em um local que não dá para ir

                        if ((X>Stage.width-mc._width) || (Y>Stage.height-mc._height)) {

                                trace("está em um lugar muito distante");

                                nCima++;

                                break;

                        }

                        //comparar se o valor X está em cima de algum mc, se não for o primeiro  

                        if (i>1) {

                                var mcBase = myMCs[a-1];

                                if ((X>(mcBase._x+mcBase._width+distW)) || ((X+distH+mc._width)<mcBase._x)) {

                                        //se não estiver, ele não faz nada

                                        trace(i+": "+a+": não está em cima");

                                } else {

                                        trace(i+": "+a+": NO X está em cima de "+mcBase+"._x:"+mcBase._x+" _y:"+mcBase._y);

                                        //se estiver sobrepondo na largura, ve se está na altura

                                        if ((Y<(mcBase._y+mcBase._height+distH)) && ((Y+mc._height+distH)>mcBase._y)) {

                                                trace(i+": "+a+": NO Y está em cima de "+mcBase+"._x:"+mcBase._x+" _y:"+mcBase._y);

                                                //adiciona mais um emcima

                                                nCima++;

                                                //quebra o for

                                                break;

                                        }

                                }

                                //se for o primeiro

                        } else {

                                trace("é o primeiro");

                                emCima = false;

                                break;

                        }

                }

                //faz a verificação para ver se tem algo em cima e quebrar o while

                if (nCima == 0) {

                        //muda a variável para quebrar o loop

                        emCima = false;

                }

        }

        return [X, Y];

}

for (i=1; i<=myMCs.length; i++) {

        var clip = myMCs[i-1];

        clip.num = i;

        clip.numArray = i;

        var AeL = defineX(i);

        clip._x = AeL[0];

        clip._y = AeL[1];

        trace("O x,y de "+clip+" é:"+clip._x+","+clip._y);

        //TransitionManager.start(clip, {type:Fly, direction:Transition.IN, duration:3, easing:Elastic.easeOut, startPoint:9});

}

 

 

Dae é so colocar os mcs no array myMCs, que ele posiciona sem problemas.

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.