giovedì 24 luglio 2008

[as2] Rilevare le collisioni con l'oggetto Math: fra due cerchi (indipendente dai frame)

Come già osservato con il metodo hitTest(), se un oggetto si muove abbastanza velocemente da non trovarsi esattamente su di un frame al momento del controllo della collisione, allora nessuna collisione sarà rilevata.

Con questo metodo possiamo prevedere se una collisione potrebbe avvenire fra due due fotogrammi.

Basandovi sul principio secondo il quale se la distanza fra due cerchi è < = alla somma dei loro raggi allora c'è una collisione, dobbiamo:




1 - Scrivere l'equazione della posizione xy dei due cerchi basata sulla velocità x e y

2 - Usare l'equazione di cui sopra per scrivere una equazione che vincoli la distanza fra i due cerchi

3 - Usare la somma dei raggi per la distanza e utilizzarla in funzione del tempo

4 - fare questa operazione ad ogni frame. Se il tempo è < = 1 allora la collisione è avvenuta fra il precedente e il corrente frame.







Di seguito il codice:



game = {};
game.numBalls = 2;
for (var i = 1; i<=game.numBalls; ++i) {
var name = "ball"+i;
game[name] = {};
game[name].clip = _root[name];
game[name].xpos = game[name].clip._x;
game[name].ypos = game[name].clip._y;
game[name].radius = game[name].clip._width/2;
game[name].xmov = 0;
game[name].ymov = 0;
}
game.ball1.xmov = 1;
game.ball1.ymov = 2;
game.ball2.ymov = 1;
function moveBalls() {
for (var i = 1; i<=game.numBalls; ++i) {
var ob = game["ball"+i];
ob.tempx = ob.xpos+ob.xmov;
ob.tempy = ob.ypos+ob.ymov;
}
}
function renderBalls() {
for (var i = 1; i<=game.numBalls; ++i) {
var ob = game["ball"+i];
ob.xpos = ob.tempx;
ob.ypos = ob.tempy;
ob.clip._x = ob.xpos;
ob.clip._y = ob.ypos;
}
}
function ballToBallDetection(b1, b2) {
//settiamo le velocità
var xmov1 = b1.xmov;
var ymov1 = b1.ymov;
var xmov2 = b2.xmov;
var ymov2 = b2.ymov;
//variabili di posizione
var xl1 = b1.xpos;
var yl1 = b1.ypos;
var xl2 = b2.xpos;
var yl2 = b2.ypos;
//costanti
var R = b1.radius+b2.radius;
var a = -2*xmov1*xmov2+xmov1*xmov1+xmov2*xmov2;
var b = -2*xl1*xmov2-2*xl2*xmov1+2*xl1*xmov1+2*xl2*xmov2;
var c = -2*xl1*xl2+xl1*xl1+xl2*xl2;
var d = -2*ymov1*ymov2+ymov1*ymov1+ymov2*ymov2;
var e = -2*yl1*ymov2-2*yl2*ymov1+2*yl1*ymov1+2*yl2*ymov2;
var f = -2*yl1*yl2+yl1*yl1+yl2*yl2;
var g = a+d;
var h = b+e;
var k = c+f-R*R;
//equazione quadratica
var sqRoot = Math.sqrt(h*h-4*g*k);
var t1 = (-h+sqRoot)/(2*g);
var t2 = (-h-sqRoot)/(2*g);
if (t1>0 && t1 <= 1) {
var whatTime = t1;
var ballsCollided = true;
}
if (t2>0 && t2<=1) {
if (whatTime == null || t2 < t1) {
var whatTime = t2;
var ballsCollided = true;
}
}
if (ballsCollided) {
//collisione
trace("collisione");
}
}
_root.onEnterFrame = function() {
moveBalls();
ballToBallDetection(game.ball1, game.ball2);
renderBalls();
};

0 commenti: