- Home
- Categorie
- Digital Marketing
- Grafica, Visual Design & UX
- Gestione delle collisioni e bouncing di movieclip
-
Gestione delle collisioni e bouncing di movieclip
[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?