Flash CS3 - Flash CS4

Free tutorials and scripts for all.
Actionscript 3.0

Collisioni multiple su superfici angolate

This is a discussion on Collisioni multiple su superfici angolate within the Articoli e tutorials forums, part of the Flash CS3 e Actionscript 3.0 category; Heilà ! Riguardo la trigonometria applicata ad Actionscript 3.0 , la volta scorsa abbiamo visto come controllare collisioni e rimbalzi su ...


Go Back   Forum Flash CS3 Flash CS4 > Flash CS3 e Actionscript 3.0 > Articoli e tutorials

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 06-12-07, 06:34
Administrator
 
Join Date: Jul 2007
Location: Cesena
Posts: 4,486
Rep Power: 6
Flep is on a distinguished road
Collisioni multiple su superfici angolate

Heilà !

Riguardo la trigonometria applicata ad Actionscript 3.0, la volta scorsa abbiamo visto come controllare collisioni e rimbalzi su superfici angolate.
Dato che l' esempio riportato era con una sola superficie, in questo tutorial vedremo come applicare le stesse formule trigonometriche applicate a più superfici angolate.
In sostanza non cambia molto, le formule utilizzate sono sempre le due che abbiamo visto:

rotazione delle coordinate del sistema:
Code:
x1=Math.cos(angle)*xx-Math.sin(angle)*yy;
y1=Math.cos(angle)*yy+Math.sin(angle)*xx;
riportare le coordinate allo stato iniziale:
Code:
x1=Math.cos(angle)*xx+Math.sin(angle)*yy;
y1=Math.cos(angle)*yy-Math.sin(angle)*xx;
Vediamo un esempio concreto...






Creo un FLA che salvo con nome ' trigonometria7.fla '.
Al suo interno disegno una linea orizzontale, la trasformo in MovieClip e la chiamo mc_line.
La istanzio 7 volte sullo stage, assegnando i rispettivi nomi istanza: line_0_mc, line_1_mc, line_2_mc, line_3_mc, line_4_mc, line_5_mc, line_6_mc .
Creo ora un' altra MovieClip con forma circolare come fosse una pallina e gli assegno nome istanza ball_mc.

Ora creo un altro livello, apro il pannello azioni e scrivo:
Code:
var lines_array:Array=new Array(line_0_mc,line_1_mc,line_2_mc,line_3_mc,line_4_mc,line_5_mc,line_6_mc);
lines_array[0].rotation=30;
lines_array[1].rotation=-20;
lines_array[2].rotation=-10;
lines_array[3].rotation=40;
lines_array[4].rotation=-30;
lines_array[6].rotation=30;

var vx:Number=0;
var vy:Number=0;
const GRAVITY:Number=.5;
const BOUNCE:Number=-.7;

addEventListener(Event.ENTER_FRAME,moveball);

function moveball(evt:Event):void
{
	vy+=GRAVITY;
	ball_mc.x+=vx;
	ball_mc.y+=vy;
	
	checkFloor();
	for(var i:int=0;i < lines_array.length;i++)
	{
		checkCollisions(lines_array[i]);
	}
}

function checkFloor():void
{
	if(ball_mc.y+ball_mc.height/2>stage.stageHeight)
	{
		ball_mc.y=stage.stageHeight-ball_mc.height/2;
		vy*=BOUNCE;
	}
}

function checkCollisions(m:MovieClip):void
{
	var bounds:Rectangle=m.getBounds(this);
	if(ball_mc.x > bounds.left &&ball_mc.x < bounds.right)
	{
		var angle:Number=m.rotation*Math.PI/180;
		var cosine:Number=Math.cos(angle);
		var sine:Number=Math.sin(angle);

		var x1:Number=ball_mc.x-m.x;
		var y1:Number=ball_mc.y-m.y;

		var y2:Number=cosine*y1-sine*x1;

		var vy1:Number=cosine*vy-sine*vx;

		if(y2 > -ball_mc.height/2&&y2 < vy1)
		{
			var x2:Number=cosine*x1+sine*y1;
			
			var vx1:Number=cosine*vx+sine*vy;
		
			y2=-ball_mc.height / 2;
			vy1*=BOUNCE;
			
			x1=cosine*x2-sine*y2;
			y1=cosine*y2+sine*x2;
			vx=cosine*vx1-sine*vy1;
			vy=cosine*vy1+sine*vx1;
			ball_mc.x=m.x+x1;
			ball_mc.y=m.y+y1;
		}
	}
}
Analizziamo il codice

Creo un Array in cui inserisco ogni nome istanza delle MovieClip linea che ho sullo stage
var lines_array:Array=new Array(line_0_mc,line_1_mc,line_2_mc,line_3_mc,line _4_mc,line_5_mc,line_6_mc);
assegno una rotazione ad ogni linea
lines_array[0].rotation=30;
lines_array[1].rotation=-20;
lines_array[2].rotation=-10;
lines_array[3].rotation=40;
lines_array[4].rotation=-30;
lines_array[6].rotation=30;

creo due variabili in cui inserisco i valori delle velocità della x e della y
var vx:Number=0;
var vy:Number=0;
una costante che contiene il valore della gravità
const GRAVITY:Number=.5;
una costante che contiene il valore dell' altezza del rimbalzo
const BOUNCE:Number=-.7;

aggiungo un ENTER_FRAME che chiama la funzione moveBall
addEventListener(Event.ENTER_FRAME,moveBall);

Nella funzione moveBall:
aumento progressivamente la velocità sull' asse y di ball_mc aggiungendogli la costante GRAVITY
vy+=GRAVITY;
do in pasto alle proprietà x e y di ball_mc i valori delle velocità ( vx e vy )
ball_mc.x+=vx;
ball_mc.y+=vy;
chiamo continuamente la funzione checkFloor che controllerà se ball_mc collide con la massima altezza dello stage ( come fosse il pavimento )
checkFloor();
all' interno di un ciclo chiamo continuamente la funzione checkCollisions passandogli come parametro ognuna delle MovieClip contenute nell' array ( le linee )
for(var i:int=0;i < lines_array.length;i++)
{
checkCollisions(lines_array[i]);
}

Nella funzione checkFloor:
controllo continuamente se ball_mc collide con la parte più bassa dell' SWF ( chiamatela come vi pare, la massima altezza o il pavimento... ) utilizzando la stessa tecnica vista nel tutorial della pallina che rimbalza.
if(ball_mc.y+ball_mc.height/2>stage.stageHeight)
{
ball_mc.y=stage.stageHeight-ball_mc.height/2;
vy*=BOUNCE;
}

Nella funzione checkCollisions eseguo la stessa identica tecnica utilizzata nel tutorial precedente a questo: trigonometria 7 tranne che per 2 righe in cui utilizzo il metodo getBounds():
creo una variabile di tipo Rectangle e gli assegno il valore che restituisce il metodo getBounds applicato alla linea che sto controllando.
In pratica questo metodo restituisce un rettangolo che ha la x, y, width e height di m ( la linea che sto controllando ).
Poi, utilizzando un if, conrollo che la x di ball_mc sia maggiore della massima area sinistra del rettangolo della linea che sto controllando e che sia minore della massima area destra del rettangolo della linea che sto conrollando.
Se provate a togliere questo controllo capirete meglio il suo scopo.
Tutto il resto, come ho già detto, lo abbiamo già visto.
var bounds:Rectangle=m.getBounds(this);
if(ball_mc.x > bounds.left &&ball_mc.x < bounds.right)
{
var angle:Number=m.rotation*Math.PI/180;
var cosine:Number=Math.cos(angle);
var sine:Number=Math.sin(angle);

var x1:Number=ball_mc.x-m.x;
var y1:Number=ball_mc.y-m.y;

var y2:Number=cosine*y1-sine*x1;

var vy1:Number=cosine*vy-sine*vx;

if(y2 > -ball_mc.height/2&&y2 < vy1)
{
var x2:Number=cosine*x1+sine*y1;

var vx1:Number=cosine*vx+sine*vy;

y2=-ball_mc.height / 2;
vy1*=BOUNCE;

x1=cosine*x2-sine*y2;
y1=cosine*y2+sine*x2;
vx=cosine*vx1-sine*vy1;
vy=cosine*vy1+sine*vx1;
ball_mc.x=m.x+x1;
ball_mc.y=m.y+y1;
}
}

Alla prossima !
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote

Reply

Bookmarks

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is On
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump

Similar Threads

Thread Thread Starter Forum Replies Last Post
Actionscript 3 how to send multiple data from as3 to php? janicehyy Actionscript 3.0 newbies 1 15-10-08 12:46
Multiple Choice mdwatkins Components 16 11-10-08 00:56
Collisioni Multiple tra Clip StefanoV Actionscript 3.0 avanzato 1 29-02-08 08:20
Rotazione di coordinate e collisioni in superfici angolate con Flash CS3 Flep Articoli e tutorials 0 27-11-07 06:23
Collisioni con Actionscript 3.0 - esempio 1 Flep Articoli e tutorials 0 21-09-07 09:12


All times are GMT. The time now is 22:04.


Powered by vBulletin versione 3.7.4
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0 RC4
Forum SiteMap


FlepStudio
by Filippo Lughi
P.IVA 03605860406