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, …