martedì 22 luglio 2008

[as2] Rilevare le collisioni con l'oggetto Math: fra un punto e un cerchio

Supponendo che il cerchio e il punto siano due movieClip, si può affermare che:

se la distanza tra il punto e il centro del cerchio è minore del raggio del cerchio, allora, il punto collide con il cerchio


schema di collisione




Procedura:

1 - Calcolo la differenza tra la X del cerchio e la X del punto e così anche per la Y (lati A e B)

var xDiff:Number=cerchio._x-punto._x;
var yDiff:Number=cerchio._y-cerchio._y;


2 - Applico il teorema di pitagora per calcolare la distanza fra il centro del cerchio e il punto (lato C)

var distance:Number=Math.sqtr(xDiff*xDiff+yDiff*yDiff);

3 - Se la distanza è minore del raggio c'è collisione


Vediamo la collisione traducendola in un esempio:

istanziate nello stage 3 clip, un cerchio, istanza cerchio_mc e due punti, punto1_mc e punto2_mc

Posizionate uno dei due punti all'interno del cerchio, la'ltro all'esterno.

Questo il codice:



//creiamo 3 oggetti per memorizzare le proprietà dei mc. Usare gli oggetti ci consente di separare tali dati dall'interfaccia, in modo che possiamo cancellare i mc dallo stage senza perdere queste info, che possiamo ritilizzare in un sefcondo momento
//
var punto1:Object = {};
//la sintassi di cui sopra corrisponde a scrivere var punto1:Object=new Object();
punto1.x = punto1_mc._x;
punto1.y = punto1_mc._y;
punto1.name=punto1_mc._name;
//
var punto2:Object = {};
punto2.x = punto2_mc._x;
punto2.y = punto2_mc._y;
punto2.name=punto2_mc._name;
//
var cerchio:Object = {};
cerchio.x = cerchio_mc._x;
cerchio.y = cerchio_mc._y;
cerchio.radius = cerchio_mc._width/2;
//
//funzione che calcola la collisiohne
function collPuntoCerchio(punto:Object, cerchio:Object):Void {
var xDiff:Number = cerchio.x-punto.x;
var yDiff:Number = cerchio.y-punto.y;
var distance:Number = Math.sqrt(xDiff*xDiff+yDiff*yDiff);
if (distance < cerchio.radius) {
trace(punto.name+": collision detected!");
} else {
trace(punto.name+": no collision..");
}
}
//
collPuntoCerchio(punto1,cerchio);
//
collPuntoCerchio(punto2, cerchio);

0 commenti: