Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

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

    Codice:
    codice:
    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


    Codice:
    codice:
    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?
    Steve Austin, Astronaut - A man barely alive . . . Gentlemen, we can rebuild him . . . we have the technology. We have the capability to make the world's first bionic man. Steve Austin will be that man. Better than he was before, Stronger, Faster . .

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    306
    finalmente un thread davvero interessante!
    vediamo se riesco a darti una mano...
    allora abbiamo un clip che si muove secondo un vettore
    scomponiamo le componenti x e y del vettore, la y bisogna vedere se sarà un moto uniformemente accelerato a causa della gravità (i quadrati cadono dall'alto in basso)o un moto uniforme (i quadrati si muovono in uno spazio 2D come visto dall'alto)e la x penso gliela dia tu all'inizio, altrimenti cadrebbero tutti verticali e paralleli...
    allora quando due movie clip si toccano, tu prendi in considerazione le componenti x e y dei due vettori
    se ad esempio le due componenti x sono entrambe dello stesso segno, cioè i due clip si muovono nella stessa direzione sull'asse delle x, i loro segni rimangono uguali, altrimenti si invertono
    idem dicasi per le y

    esempio: mc1 --> velx = 2, vely = 3 - mc2 --> velx = -4, vely = 2
    al contatto i due mc continuano a cadere, ma in seguito all'impatto cambiano direzione relativamente all'asse x, quindi
    mc1 --> velx = -2, vely = 3 - mc2 --> velx = 4, vely = 2

    le y invece hanno lo stesso segno, e non cambiano

    chiaramente qui io presumo che non ci sia dissipazione di energia cinetica, ma tu hai parlato di frizione, quindi al contatto dovrai diminuire le velocità (solo le x se c'è gravità, anche le y se no)

    e per il movimento una cosa del genere
    onEnterFrame = function() = {
    mc1._x += mc1.velx
    mc1._y += mc1.vely

    fammi sapere se ci cavi qualcosa, e soprattutto sono curioso di vedere che ne viene fuori!
    }
    buonuomo.tomma@tiscali.it

  3. #3
    Originariamente inviato da ilGuccino
    finalmente un thread davvero interessante!
    vediamo se riesco a darti una mano...
    allora abbiamo un clip che si muove secondo un vettore
    scomponiamo le componenti x e y del vettore, la y bisogna vedere se sarà un moto uniformemente accelerato a causa della gravità (i quadrati cadono dall'alto in basso)o un moto uniforme (i quadrati si muovono in uno spazio 2D come visto dall'alto)e la x penso gliela dia tu all'inizio, altrimenti cadrebbero tutti verticali e paralleli...
    allora quando due movie clip si toccano, tu prendi in considerazione le componenti x e y dei due vettori
    se ad esempio le due componenti x sono entrambe dello stesso segno, cioè i due clip si muovono nella stessa direzione sull'asse delle x, i loro segni rimangono uguali, altrimenti si invertono
    idem dicasi per le y

    esempio: mc1 --> velx = 2, vely = 3 - mc2 --> velx = -4, vely = 2
    al contatto i due mc continuano a cadere, ma in seguito all'impatto cambiano direzione relativamente all'asse x, quindi
    mc1 --> velx = -2, vely = 3 - mc2 --> velx = 4, vely = 2

    le y invece hanno lo stesso segno, e non cambiano

    chiaramente qui io presumo che non ci sia dissipazione di energia cinetica, ma tu hai parlato di frizione, quindi al contatto dovrai diminuire le velocità (solo le x se c'è gravità, anche le y se no)

    e per il movimento una cosa del genere
    onEnterFrame = function() = {
    mc1._x += mc1.velx
    mc1._y += mc1.vely

    fammi sapere se ci cavi qualcosa, e soprattutto sono curioso di vedere che ne viene fuori!
    }

    Interessante, mi metto all'opera.
    Il fatto è cmq che la gravità non ci sarà (la mia è stata solo una prova), in sostanza saranno un po' come le palle di un biliardo: un moto uniforme. Ti ringrazio per l'input, ti faccio sapere quanto prima.

    Ciao.

    --
    Gianluca
    Steve Austin, Astronaut - A man barely alive . . . Gentlemen, we can rebuild him . . . we have the technology. We have the capability to make the world's first bionic man. Steve Austin will be that man. Better than he was before, Stronger, Faster . .

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    306
    me racumandi...
    fammi sapere
    ciao buon lavoro
    Tommaso
    buonuomo.tomma@tiscali.it

  5. #5
    Alla fine ho risolto, purtroppo per quanto valido il tuo ragionamento l'implementazione era moooolto più complessa e alla fine ho trovato un ragazzo che stava facendo un gioco sul biliardo che mi ha dato una mano.

    Cmq grazie ancora il tuo spunto mi è stato cmq utilissimo.
    Steve Austin, Astronaut - A man barely alive . . . Gentlemen, we can rebuild him . . . we have the technology. We have the capability to make the world's first bionic man. Steve Austin will be that man. Better than he was before, Stronger, Faster . .

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.