• User Newbie

    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

    image

    ... 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:

    image

    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&#40; pos.x < radius &#41; &#123; 
    		pos.x = radius; 
    		vel.x *= -_root.restitution; 
    	&#125;
    	
    	if&#40;this.hitTest&#40;_root.Ball_MC&#41;&#41;&#123;
    	//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;  
    	&#125;else&#123;
    		pos.x += vel.x; 
      		pos.y += vel.y;
    	&#125;
    
    
    	// Now update the ACTUAL position of the ball... 
    	_x = pos.x; 
    	_y = pos.y; 
    	
    	
    &#125;else&#123;
    	//trace&#40;"draggo"&#41;;
        old.x = pos.x; 
        old.y = pos.y; 
        pos.x = _x; 
        pos.y = _y; 
        vel.x = &#40; pos.x - old.x &#41; / 2; 
        vel.y = &#40; pos.y - old.y &#41; / 2; 
      &#125; 
    
    
    

    Qualcuno ha mai affrontato una cosa simile? Mi sapete dare una mano?