ActionScript: Move an object with keyboard with absolute controls

[:en]In this tip I will show you how to move an object with keyboard with absolute controls.

See also how to move an object with keyboard relative-camera control.

What is the absolute controls?

The direction of your object will be calculated depending the object orientation. (Biohazard, Micro Machines, Gears of War). This code is very usefull if you design a car game.

How to make an absolute control in Flash?

  • Get the arrow key status (key is up/key is down);
  • Move or rotate the object on enter frame with the new velocity (Left and Right keys: rotate, Up key: forward, Down key: backward);
// Assign 4 booleans for the 4 arrow keys
var keyUp = false;
var keyDown = false;
var keyLeft = false;
var keyRight = false;

// Add the keyboard event (KEY_DOWN) on the stage
stage.addEventListener(KeyboardEvent.KEY_DOWN, pressKey);
function pressKey(pEvent)
{
	// If an arrow key is down, switch the value to true to the assigned variable
	if (pEvent.keyCode == 38)
	{
		keyUp = true;
	}
	else if (pEvent.keyCode == 40)
	{
		keyDown = true;
	}
	else if (pEvent.keyCode == 37)
	{
		keyLeft = true;
	}
	else if (pEvent.keyCode == 39)
	{
		keyRight = true;
	}
}
// Add the keyboard event (KEY_UP) on the stage
stage.addEventListener(KeyboardEvent.KEY_UP, releaseKey);
function releaseKey(pEvent)
{
	// If the arrow key is up, switch the value to false to the assigned variable
	if (pEvent.keyCode == 38)
	{
		keyUp = false;
	}
	else if (pEvent.keyCode == 40)
	{
		keyDown = false;
	}
	else if (pEvent.keyCode == 37)
	{
		keyLeft = false;
	}
	else if (pEvent.keyCode == 39)
	{
		keyRight = false;
	}
}

// Set the velocity of the object
var speed = 6;
// And the rotation speed
var rotationSpeed = 5;

// Add an enter frame event on the moving object
myCircle.addEventListener(Event.ENTER_FRAME, circleEnterFrame);
function circleEnterFrame(pEvent)
{
	// Set the default velocity to 0 if no key is pressed
	var velocity = 0;
	if (keyUp)
	{
		// If the key up is pressed set the new velocity to the speed value
		velocity = speed;
	}
	if (keyDown)
	{
		// If the key down is pressed set the new velocity to the half speed value
		velocity =  -  speed / 2;
	}
	if (keyLeft)
	{
		// rotate the object
		pEvent.currentTarget.rotation -=  rotationSpeed;
	}
	if (keyRight)
	{
		// rotate the object
		pEvent.currentTarget.rotation +=  rotationSpeed;
	}

	// Convert the degreeAngle to the radian angle
	var angleRadian = pEvent.currentTarget.rotation / 180 * Math.PI;

	// Move the object with the radian angle and the object speed
	pEvent.currentTarget.x +=  Math.cos(angleRadian) * velocity;
	pEvent.currentTarget.y +=  Math.sin(angleRadian) * velocity;
}

[swf:/wp-content/uploads/2011/02/www.benoitfreslon.com_Move_an_object_with_keyboard_with_absolute_controls.swf 550 400]

Download source: www.benoitfreslon.com_Move_an_object_with_keyboard_with_absolute_controls[:fr]Dans ce tutoriel je vais vous montrer comment déplacer un objet avec le clavier en contrôle absolu en Flash.

Voir également comment déplacer un objet avec le clavier avec des contrôles relatifs à la caméra.

Contrôle absolu ? Kézako ?

La direction de votre objet va être calculée en fonction de l’orientation de votre objet. (Resident Evil, Micro Machines, Gears of War, etc.). Ce script est très utile pour les jeux de voitures.

Comment faire un contrôle absolu en Flash?

  • Récupérer les informations des touches du clavier (touche enfoncée, touche relâchée)
  • Déplacer ou tourner l’objet entre chaque frame avec la nouvelle vitesse (Touche gauche et droite : tourner l’objet, Haut : faire avancer l’objet, Bas ; faire reculer l’objet)
// Assigner 4 booléens pour chaque touche
var keyUp = false;
var keyDown = false;
var keyLeft = false;
var keyRight = false;
// Ajouter une écouteur d'événement clavier pour une touche pressée sur la scène
stage.addEventListener(KeyboardEvent.KEY_DOWN, pressKey);

function pressKey(pEvent) {
	// Si une touche est enfoncée, changer la valeur du boolean (true) assignée pour la touche correspondante
	if (pEvent.keyCode == 38) {
		keyUp = true;
	} else if (pEvent.keyCode == 40) {
		keyDown = true;
	} else if (pEvent.keyCode == 37) {
		keyLeft = true;
	} else if (pEvent.keyCode == 39) {
		keyRight = true;
	}
}
// Ajouter un écouteur d'événement clavier pour une touche relâchée sur la scène
stage.addEventListener(KeyboardEvent.KEY_UP, releaseKey);
function releaseKey(pEvent) {
	// Si une touche est relâchée, changer la valeur du boolean (false) assignée pour la touche correspondante
	if (pEvent.keyCode == 38) {
		keyUp = false;
	} else if (pEvent.keyCode == 40) {
		keyDown = false;
	} else if (pEvent.keyCode == 37) {
		keyLeft = false;
	} else if (pEvent.keyCode == 39) {
		keyRight = false;
	}
}

// Assigner la vitesse de l'objet à 6px/frame
var speed = 6;

// Et la vitesse de rotation en °
var rotationSpeed = 5;

// Ajouter un écouteur d'événement entre chaque frame sur l'objet en mouvement
myCircle.addEventListener(Event.ENTER_FRAME, circleEnterFrame);

function circleEnterFrame(pEvent) {
	// Assigner la vélocité initiale de l'objet à 0
	var velocity = 0;
	if (keyUp) {
		// Si la touche Haut est enfoncée on assigne la vitesse de l'objet à la vélocité courante
		velocity = speed;
	}
	if (keyDown) {
		// Si la touche Haut est enfoncée on assigne la vitesse de l'objet à la vélocité courante divisée par 2
		velocity =  -  speed / 2;
	}
	if (keyLeft) {
		// Faire tourner l'objet sur lui même
		pEvent.currentTarget.rotation -=  rotationSpeed;
	}
	if (keyRight) {
		//Faire tourner l'objet sur lui même
		pEvent.currentTarget.rotation +=  rotationSpeed;
	}

	// On convertie l'angle formé par l'objet en radian
	var angleRadian = pEvent.currentTarget.rotation / 180 * Math.PI;

	// On déplace l'objet avec l'angle, soit son orientation et sa vitesse courante donc sa vélocité
	pEvent.currentTarget.x +=  Math.cos(angleRadian) * velocity;
	pEvent.currentTarget.y +=  Math.sin(angleRadian) * velocity;
}

[swf:/wp-content/uploads/2011/02/www.benoitfreslon.com_Move_an_object_with_keyboard_with_absolute_controls.swf 550 400]

Télécharger la source : www.benoitfreslon.com_Move_an_object_with_keyboard_with_absolute_controls[:]

Author: Benoit Freslon