Création de jeux (2eme partie) : tirer un projectile

Ce 2eme article est la suite du 1er : Création de jeux (1ere partie) : calcul d’un angle et d’une distance.

On va utiliser les formules du précédent article pour tirer un projectile quelconque vers la position de la souris.
On va juste limiter la distance du trait qui relie le centre de la scene à la position de la souris a 200px, cette distance représentera la vitesse de déplacement du projectile que l’on divisera par 10.

exemple (un clique sur la scene tir le projectile) :

code :

package {
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
 
 
	[SWF(width = 600, height = 600, backgroundColor = 0x0, frameRate = 30)]
 
	/**
	 * @author Lorenzo
	 */
	public class test2_DirectionVitesse extends Sprite {
 
		public function test2_DirectionVitesse():void {
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private var _shapeTrait:Shape;
		private var _shapeBille:Shape;
 
		private var _billeAngleRadian:Number = 0;
		private var _billeVitesse:Number = 0;
 
 
 
 
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			stage.scaleMode = 'noScale';
 
			// création d'un Shape "trait" positionnée au centre de la scene (représente un vecteur)
			_shapeTrait = this.addChild(new Shape()) as Shape;
			_shapeTrait.x = stage.stageWidth / 2;
			_shapeTrait.y = stage.stageHeight / 2;
 
			var g:Graphics = _shapeTrait.graphics;
			g.lineStyle(0, 0xFFFFFF, 1, false, 'none');
			g.lineTo(1, 0);
 
			// création d'un Shape "bille"
			_shapeBille = this.addChild(new Shape()) as Shape;
			_shapeBille.x = stage.stageWidth / 2;
			_shapeBille.y = stage.stageHeight / 2;
 
			g = _shapeBille.graphics;
			g.lineStyle(1, 0x00FFFF, 1);
			g.beginFill(0x0080C0, 1);
			g.drawCircle(0, 0, 10);
			g.endFill();
			g.moveTo(0, 0);
			g.lineTo(30, 0);
 
 
			// écouteurs
			stage.addEventListener(MouseEvent.MOUSE_MOVE, evtStageMouseMove);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, evtStageMouseDown);
		}
 
 
		private function evtStageMouseMove(ev:MouseEvent):void {
			var px:Number = ev.stageX - _shapeTrait.x;
			var py:Number = ev.stageY - _shapeTrait.y;
 
			// rotation du trait vers la position de la souris
			var rad:Number = Math.atan2(py, px);// calcul de l'angle entre 2 points en radian
			var deg:Number = rad * (180 / Math.PI);// conversion en degrée
			_shapeTrait.rotation = deg;
 
			// étirement du trait sur la position de la souris (limité a une distance de 200)
			var dist:Number = Math.sqrt(px * px + py * py);// calcul de la distance entre 2 points
			if ( dist > 200 ) {
				dist = 200;
			}
			_shapeTrait.scaleX = dist;
		}
 
 
		private function evtStageMouseDown(ev:MouseEvent):void {
			// lancer la bille en prenant en compte la rotation du trait pour la direction
			// et la longueur du trait pour representer la vitesse
 
			_shapeBille.x = stage.stageWidth / 2;
			_shapeBille.y = stage.stageHeight / 2;
			var px:Number = ev.stageX - _shapeBille.x;
			var py:Number = ev.stageY - _shapeBille.y;
 
			// la direction
			_billeAngleRadian = Math.atan2(py, px);
 
			// rotation de la bille pour qu'elle soit face a sa direction
			_shapeBille.rotation = _billeAngleRadian  * (180 / Math.PI);
 
			// represente la vitesse (1/10 de la distance);
			var dist:Number = Math.sqrt(px*px + py*py);// calcul de la distance entre 2 points
			_billeVitesse = dist / 10;
 
 
			stage.addEventListener(Event.ENTER_FRAME, evtStageEnterFrame);
		}
 
 
		/**
		 * Moteur de deplacement de la bille
		 */
		private function evtStageEnterFrame(e:Event):void {
			// calcul du décalage de la position de la bille par rapport a l'angle et la vitesse
			var dx:Number = _billeVitesse * Math.cos(_billeAngleRadian);
			var dy:Number = _billeVitesse * Math.sin(_billeAngleRadian);
			_shapeBille.x += dx;
			_shapeBille.y += dy;
 
			// tout remettre a zero des que la bille touche le bord de la scene
			if ( _shapeBille.x < 0 || _shapeBille.x > stage.stageWidth || _shapeBille.y < 0 || _shapeBille.y > stage.stageHeight ) {
				_shapeBille.x = stage.stageWidth / 2;
				_shapeBille.y = stage.stageHeight / 2;
				stage.removeEventListener(Event.ENTER_FRAME, evtStageEnterFrame);
			}
		}		
	}
}

Avec ces 2ers articles il est déjà possible de commencer plusieurs types de jeu, comme un mini-golf ou du billard, un jeu de tir, …

Laisser un commentaire

*