ActionScript: Move object with smooth acceleration and deceleration with inertia

Aujourd’hui voici un exemple de code pour créer un effet d’accélération et d’inertie en Flash ActionScript 3.0.

Le personnage va commencer à accélérer si on appuie sur une flèche. Il atteindra sa vitesse maximale puis il ralentira si on relâche la touche.

[swf:/wp-content/uploads/2013/09/Flash_acceleration_benoifreslon.com_.swf 550 400]

Vous pouvez télécharger le code source ici : Flash_acceleration_benoifreslon.com

// Copyrights
// Benoît Freslon
// https://www.benoitfreslon.com

import flash.events.KeyboardEvent;
import flash.events.MouseEvent;

// Constantes (Vous pouvez modifier ces valeurs)
const acceleration:Number = 0.1;
const decceleration:Number = 0.9;
const speedMax:Number = 5;

// Variables
var speedX:Number = 0;
var speedY:Number = 0;

// Etats des touches
var leftPressed:Boolean = false;
var rightPressed:Boolean = false;
var upPressed:Boolean = false;
var downPressed:Boolean = false;

// Evénements clavier
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
function keyDown(e:KeyboardEvent):void {
	switch (e.keyCode) {
		case 37 :
			leftPressed = true;
			break;
		case 38 :
			upPressed = true;
			break;
		case 39 :
			rightPressed = true;
			break;
		case 40 :
			downPressed = true;
			break;
	}
}
function keyUp(e:KeyboardEvent):void {
	switch (e.keyCode) {
		case 37 :
			leftPressed = false;
			break;
		case 38 :
			upPressed = false;
			break;
		case 39 :
			rightPressed = false;
			break;
		case 40 :
			downPressed = false;
			break;
	}
}

// Evénement répété toutes les images
pig.addEventListener(Event.ENTER_FRAME, enterFrame);
function enterFrame(e:Event):void {

	// Si un touche est enfoncée on augmente la valeur de la vitesse avec la valeur d'accélération

	if (upPressed) {
		speedY -=  acceleration;
	} else if (downPressed) {
		speedY +=  acceleration;
	} else {
		// Si la touche haut et bas sont relâchées alors on diminue la vitesse avec la valeur de decceleration
		speedY *=  decceleration;
	}

	if (leftPressed) {
		speedX -=  acceleration;
	} else if (rightPressed) {
		speedX +=  acceleration;
	} else {
		speedX *=  decceleration;
	}

	// Ne pas oublier de limiter les vitesses
	if (speedX > speedMax) {
		speedX = speedMax;
	}
	if (speedX  <-speedMax) { speedX = - speedMax; } if (speedY > speedMax) {
		speedY = speedMax;
	}
	if (speedY <-speedMax) {
		speedY =  -  speedMax;
	}

	// Déplacer le cochon constamment
	pig.x +=  speedX;
	pig.y +=  speedY;

	// Affiche les valeurs sur l'interface
	tValues.text = "speedX: " + speedX + "\nspeedY: " + speedY;

}

// RAZ du cochon
stage.addEventListener(MouseEvent.CLICK , click);
function click(e:MouseEvent):void {
	pig.x = stage.stageWidth / 2;
	pig.y = stage.stageHeight / 2;
}