vomito un po' di actionscript...
vedi cosa ti può servire...
fai un copia-incolla per vederne l'effetto.
codice:
numElementi = 6;
latoQuadrato = 50;
distanzaAggancio = latoQuadrato/2;
oggettiStatici = new Array();//qui ci metto gli oggetti fermi a cui voglio agganciarmi
oggettiTrascinabili = new Array();//qui gli oggetti da trascinare
//creo dinamicamente gli oggetti statici e li posiziono
//sullo stage
for (i=0; i<numElementi; i++) {
_root.createEmptyMovieClip("oggettoStatico"+i, i);
disegnaContornoQuadrato(_root["oggettoStatico"+i], latoQuadrato, 0x000000);
_root["oggettoStatico"+i]._y = latoQuadrato/2;
_root["oggettoStatico"+i]._x = latoQuadrato/2+3*latoQuadrato/2*i;
_root["oggettoStatico"+i].colore = new Color(_root["oggettoStatico"+i]);
oggettiStatici.push(_root["oggettoStatico"+i]);
}
//creo dinamicamente gli oggetti tarscinabili e li posiziono
//sullo stage
for (i=0; i<numElementi; i++) {
_root.createEmptyMovieClip("oggettoTrascinabile"+i, i+numElementi);
disegnaRiempimentoQuadrato(_root["oggettoTrascinabile"+i], latoQuadrato, 0xCCCCCC);
disegnaContornoQuadrato(_root["oggettoTrascinabile"+i], latoQuadrato, 0x000000);
_root["oggettoTrascinabile"+i]._y = 2*latoQuadrato;
_root["oggettoTrascinabile"+i]._x = latoQuadrato/2+3*latoQuadrato/2*i;
oggettiTrascinabili.push(_root["oggettoTrascinabile"+i]);
}
//assegno il comportamento agli oggetti trascinabili
for (i=0; i<oggettiTrascinabili.length; i++) {
//quando clicco sull'oggetto da trascinare
oggettiTrascinabili[i].onPress = function() {
delete this.onEnterFrame;//fermo il clip se si stava spostando
ordinaProfonditàOggettiTrascinati(oggettiTrascinabili, this);//porto l'oggetto cliccato in primo piano
this.onMouseMove = function() {
//cambio colore agli oggetti statici quando il mouse si muove
for (var j = 0; j<oggettiStatici.length; j++) {
if (distanza(oggettiStatici[j], this)<distanzaAggancio) {
oggettiStatici[j].colore.setRGB(0xFF0000);//rosso se sono vicino
} else {
oggettiStatici[j].colore.setRGB(0x000000);//nero se sono lontano
}
}
};
this.startDrag(false);//trascino
};
oggettiTrascinabili[i].onRelease = function() {
//quando rilascio il mouse
delete this.onMouseMove;//smetto di cambiare colore
for (var j = 0; j<oggettiStatici.length; j++) {
//controllo se un oggetto statico è vicino per agganciarlo
if (distanza(oggettiStatici[j], this)<distanzaAggancio) {
//sposto l'oggetto trascinabile nella posizione dell'oggetto statico agganciato
spostaLentamente(this, oggettiStatici[j]._x, oggettiStatici[j]._y);
}
}
this.stopDrag();//smetto di trascinare
};
}
//funzioni per disegnare
function disegnaRiempimentoQuadrato(clip, lato, colore) {
with (clip) {
beginFill(colore, 100);
lineTo(0, lato);
lineTo(lato, lato);
lineTo(lato, 0);
lineTo(0, 0);
endFill();
}
}
function disegnaContornoQuadrato(clip, lato, colore) {
with (clip) {
lineStyle(0, colore, 100);
lineTo(0, lato);
lineTo(lato, lato);
lineTo(lato, 0);
lineTo(0, 0);
endFill();
}
}
//funzione per modificare profondità oggetti
function ordinaProfonditàOggettiTrascinati(array, oggetto) {
swap = true;
while (swap) {
swap = false;
for (i=0; i<array.length; i++) {
if (oggetto.getDepth() == array[i].getDepth()-1) {
oggetto.swapDepths(array[i]);
swap = true;
}
}
}
}
//funzione per calcolare la distanza tra due clip
function distanza(clip1, clip2) {
return Math.sqrt((clip1._x-clip2._x)*(clip1._x-clip2._x)+(clip1._y-clip2._y)*(clip1._y-clip2._y));
}
//funzione per spostare lentamente il clip in una posizione
function spostaLentamente(clip, x, y) {
clip.onEnterFrame = function() {
this._x += (x-this._x)/2;
this._y += (y-this._y)/2;
};
}