[Flash MX 2004, Actionscript 2.0]
Ciao a tutti,
vorrei realizzare una cosa di questo tipo:
su uno stage vorrei "buttare" n movieclip dove n è un numero tra 5 e 15, questi movieclip sono semplicemente dei box colorati che si dispongono random. come in figura
... e la parte semplice è finita
Ora arriva il difficile:
I movieclip non si devono sovrapporre ma rimbalzare tra loro, sbattere è disporsi sullo stage, in pratica, rimabalzano ma hanno una frizione che li rallentano.
E qui sono un po' in panico, mi sono studiato formule di Newton varie, visto dei tutorial e cercato in giro , ma l'effetto di "scontro" tra i quadrati non riesco a capire come farlo. Non capisco come posso calcolare la nuova direzione e la nuova velocità di un movieclip dopo lo scontro come in figura:
Ho fatto questa [url=http://www.rossionline.net/temp/test2004.fla]PROVA dove ci sono 2 quadrati uno soggetto a gravità e uno no.
entrambi rimbalzano , frizionano con i lati dello stage e questa è già x me una vittoria. vorrei che facesseto lo stesso tra loro ho provato ad usare l'hitTest ma sono un po' in alto mare:
Il concetto è molto semplice: per ogni istanza di MC ho applicato i seguenti actionscript:
onClipEvent(load) {
//inizializzo gli oggetti
var vel:Object = { x: 0, y: 0 };
var pos:Object = { x: _x, y: _y };
var old:Object = { x: _x, y: _y };
var radius:Number = this._width / 2;
var movie:Object = { width: 400, height: 300 };
var dragging:Boolean = false;
}
e poi con un EnterFrame gestisco il movimento
onClipEvent(enterFrame) {
if(!dragging) {
vel.y *= _root.friction;
vel.x *= _root.friction;
if( pos.y + radius > movie.height ) {
//controllo se sbatte contro il pavimento
pos.y = movie.height - radius;
vel.y *= -_root.restitution;
vel.x *= _root.friction;
}
if( pos.x + radius > movie.width ) {
//controllo se sbatte contro i lati
pos.x = movie.width - radius;
vel.x *= -_root.restitution;
}
if( pos.x < radius ) {
pos.x = radius;
vel.x *= -_root.restitution;
}
if(this.hitTest(_root.Ball_MC)){
//controllo se c'è sovrapposizione dei MC
//QUI NON SO COME FARE PER GESTIRE IL RIMBALZO
vel.y *= -_root.restitution;
vel.x *= _root.friction;
pos.x += vel.x;
pos.y += vel.y;
}else{
pos.x += vel.x;
pos.y += vel.y;
}
// Now update the ACTUAL position of the ball...
_x = pos.x;
_y = pos.y;
}else{
//trace("draggo");
old.x = pos.x;
old.y = pos.y;
pos.x = _x;
pos.y = _y;
vel.x = ( pos.x - old.x ) / 2;
vel.y = ( pos.y - old.y ) / 2;
}
Qualcuno ha mai affrontato una cosa simile? Mi sapete dare una mano?