Création de jeux (3eme partie) : déplacement simple d’un véhicule

Cet article va expliquer la manière la plus simple de déplacer un objet (véhicule) avec les touches du clavier.
Le mode de déplacement expliqué dans cet article est vraiment limité et ne pourra être appliqué qu’a certain type de jeu dont ceux qui utilisent un déplacement sur un axe ou avec des angles prédéfinis et une vitesse constante (genre pacman (angle = 90° + vitesse fixe).

exemple (utilisation des touches fléchés pour déplacer le véhicule) :

code :

package {
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.ui.Keyboard;
 
 
 
	[SWF(width = 600, height = 600, backgroundColor = 0x0, frameRate = 30)]
 
	/**
	 * @author Lorenzo
	 */
	public class test3_DeplacementSimple extends Sprite {
 
		public function test3_DeplacementSimple():void {
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
 
		private var _shapeVoiture:Shape;
		private var _angleVoiture:Number = 0;
		private var _vitesseVoiture:Number = 0;
 
 
 
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			stage.scaleMode = 'noScale';
 
			// création d'une Shape "voiture"
			_shapeVoiture = this.addChild(new Shape()) as Shape;
			_shapeVoiture.x = stage.stageWidth / 2;
			_shapeVoiture.y = stage.stageHeight / 2;
 
			var g:Graphics = _shapeVoiture.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(KeyboardEvent.KEY_DOWN, evtStageKeyDown);
			stage.addEventListener(Event.ENTER_FRAME, evtStageEnterFrame);
		}
 
 
		/**
		 * rotation et acceleration linéaire (bof.. peut être utile pour certain types de jeu)
		 */
		private function evtStageKeyDown(ev:KeyboardEvent):void {
			if (ev.keyCode == Keyboard.LEFT) {
				_angleVoiture -= 6;
			}
			if (ev.keyCode == Keyboard.RIGHT) {
				_angleVoiture += 6;
			}
			if (ev.keyCode == Keyboard.UP) {
				_vitesseVoiture += 1;
			}
			if (ev.keyCode == Keyboard.DOWN) {
				_vitesseVoiture -= 1;
			}
			if ( _vitesseVoiture > 10 ) {
				_vitesseVoiture = 10;
			}else if ( _vitesseVoiture < -10 ) {
				_vitesseVoiture = -10;
			}
		}
 
		/**
		 * Deplacement de la voiture
		 */
		private function evtStageEnterFrame(ev:Event):void {
			var angleRad:Number = _angleVoiture * Math.PI / 180;
			var dx:Number = _vitesseVoiture * Math.cos(angleRad);
			var dy:Number = _vitesseVoiture * Math.sin(angleRad);
			_shapeVoiture.x += dx;
			_shapeVoiture.y += dy;
			_shapeVoiture.rotation = _angleVoiture;
		}
	}
}

On peut remarquer un paquet de probleme en testant le SWF :

  • le moteur ne prend en compte qu’une seule touche a la fois
  • ce genre de déplacement ne peut pas être utilisé pour un vaisseau ou une voiture
  • trop linéaire
  • quasiment impossible d’arrêter le véhicule
  • …..

Dans le prochain article on verra une autre soluce qui conviendra bien mieux au déplacement d’un véhicule quelconque !

Laisser un commentaire

*