Particules Test PePea

by pepea28
--- Le Main
♥0 | Line 121 | Modified 2009-10-26 20:02:50 | MIT License
play

ActionScript3 source code

/**
 * Copyright pepea28 ( http://wonderfl.net/user/pepea28 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/m5f3
 */

package {

	import flash.display.Sprite;
	import flash.display.Shape;
	import flash.events.Event;
	import flash.utils.Timer;
	import flash.filters.BlurFilter;
  import flash.events.TimerEvent;

	/* --- Le Main */
	public class Main extends Sprite
	{
		public function Main():void
		{

		}
	}
	
}

	import flash.display.Sprite;
	import flash.display.Shape;
	import flash.events.Event;
	import flash.utils.Timer;
	import flash.filters.BlurFilter;
  import flash.events.TimerEvent;

  /**
	 * Classe représentant un émetteur de particules
	 */
	class Emetteur extends Sprite
	{

		public const PI:Number = 3.14;

		private var particules:Array; 							// ensemble de particules que gère à un temps donné l'émetteur courant
		private var directionParticules:Array;			// ensemble des directions pour chaque particule du tableau précédent
		private var intervalleTemps:Number = 50;		// intervalle de temps entre deux émissions (en millisecondes)

		private var direction:Number = (-3*PI)/4; 	// indique l'angle principal d'émission de particules
		private var intervalleAngle:Number = 0.05;	// indique l'angle de précision de l'émission de particules
		private var nombreParticules:Number;				// nombre de particules émis à chaque émission (chaque intervalle de temps)
		private var forceEmetteur:Number = 2.5;			// force de l'émetteur
		private var gravite:Number;									// gravité appliqué aux particules émises par l'émetteur
		private var timer:Timer;										// timer pour calculer l'intervalle entre deux émissions

		private var XInfLimite:Number = -250;
		private var XSupLimite:Number = 250;
		private var YInfLimite:Number = -250;
		private var YSupLimite:Number = 250;


			
		/* Constructeur de la classe Emetteur */
		public function Emetteur():void
		{
			/*/
			var rectangle:Shape = new Shape();
			rectangle.graphics.beginFill(0x0000FF);
			rectangle.graphics.drawRect(5, 5, 100, 30);
			this.addChild(rectangle);
			//*/
			particules = new Array();
			directionParticules = new Array();

			// on ajoute le listener sur le Enter Frame pour pouvoir gérer l'animation
			//this.addEventListener(Event.ENTER_FRAME, emittingHandler);

			timer = new Timer(intervalleTemps,0);
			timer.addEventListener(TimerEvent.TIMER, timerHandler);

		}

		/**
		 * Débute l'émission
		 */
		public function startEmit():void
		{
			timer.start(); // on démarre le timer
		}

		/**
		 * Stoppe l'émission de particules
		 */
		public function stopEmit():void
		{
			timer.stop();
			timer.reset();
		}

		/**
		 * Stoppe l'émission de particules et efface toutes les particules qui étaient présentes
		 */
		public function clearEmetteur():void
		{

		}

		public function isEmitting():Boolean
		{
			return timer.running;
		}

		public function getDirection():Number
		{
			return direction;
		}

		public function setDirection(dir:Number):void
		{
			direction = dir;
		}

		/**
		 * Gère l'émission et l'animation des particules
		 */
		public function emittingHandler(e:Event):void
		{
			// on parcourt toutes les particules et on calcule leur position
			// avant de les afficher
			var i:uint = 0;
			while (i < particules.length)
			{
				particules[i].x += Math.cos(directionParticules[i])*forceEmetteur;
				particules[i].y += Math.sin(directionParticules[i])*forceEmetteur;

				// on regarde si la particule ne sort pas de l'écran
				// si tel est le cas : on la dégage !
				if (particules[i].x > XSupLimite 		|| particules[i].y > YSupLimite
				 || particules[i].x < XInfLimite 	   	|| particules[i].y < YInfLimite)
				{
					this.removeChild(particules[i]);
					particules.splice(i,1); 			// on DELETE : -> on recrée forcément une particule
					directionParticules.splice(i,1); 	// on supprime également dans le tableau de directions pour pas perturber l'ordre
				}
				i++;
			}
		}

		/**
		 * Gère la création des particules toutes les intervalleTemps millisecondes
		 */
		private function timerHandler(e:TimerEvent):void
		{
			// on va créer un particule
			var p:Particule = new Particule();
			p.x = 0;
			p.y = 0;
			p.rotation = toDeg(direction);
			particules.push(p);
			directionParticules.push(direction+Math.random()*intervalleAngle*2);
			addChild(p);
		}

		private function toRad(deg:Number):Number
		{
			return  PI*(deg)/180;
		}

		private function toDeg(rad:Number):Number
		{
			return 180*(rad) /PI;
		}

	}


	import flash.display.Sprite;
	import flash.display.Shape;
	import flash.events.Event;
	import flash.utils.Timer;
	import flash.filters.BlurFilter;
      import flash.events.TimerEvent;
	 /* ------- CLASSE PARTICULE ------ */
	class Particule extends Sprite
	{
		public function Particule():void
		{
			var rectangle:Shape = new Shape();
			rectangle.graphics.beginFill(0x0000FF);
			rectangle.graphics.drawRect(5, 5, 10, 3);

			var blur:BlurFilter = new BlurFilter(2, 2, 5);

			rectangle.filters = [blur];
			this.addChild(rectangle);
		}

	}