package { import flash.display.MovieClip; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import flash.utils.getTimer; /** Extends MovieClip to add keyboard driven motion. Arrow keys manipulate the Mover's position. To use: * right-click a movieclip symbol in the library and choose 'Linkage' * check the 'Export for ActionScript' checkbox * enter 'Mover' into the class field * make sure this class file is in the same folder as the fla containing the moveclip symbol * publish the fla */ public class Mover extends MovieClip { private var pressedDown:Boolean = false; // for tracking key state private var pressedLeft:Boolean = false; private var pressedRight:Boolean = false; private var pressedUp:Boolean = false; private var lastTime:Number; // for tracking time elapsed between frames private var speed:Number = 300; // pixels per sec public function Mover() { lastTime = getTimer(); stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown); // record keys being pressed stage.addEventListener(KeyboardEvent.KEY_UP, onUp); // record keys being released addEventListener(Event.ENTER_FRAME, onFrame); // update screen position every frame } private function dt():Number { var now:Number = getTimer(); // retrieve current ms var secElapsed:Number = (now - lastTime) / 1000; // calculate seconds elapsed since last ms lastTime = now; // store current for next time return secElapsed; } private function onDown(e:KeyboardEvent):void { // if an arrow key was pressed, update its state switch (e.keyCode) { case Keyboard.DOWN : pressedDown = true; break; case Keyboard.LEFT : pressedLeft = true; break; case Keyboard.RIGHT : pressedRight = true; break; case Keyboard.UP : pressedUp = true; break; } } private function onUp(e:KeyboardEvent):void { // if an arrow key was released, update its state switch (e.keyCode) { case Keyboard.DOWN : pressedDown = false; break; case Keyboard.LEFT : pressedLeft = false; break; case Keyboard.RIGHT : pressedRight = false; break; case Keyboard.UP : pressedUp = false; break; } } private function onFrame(e:Event):void { // calculate step size from speed and time elapsed var step:Number = dt() * speed; // create hypothetical new position based on current key states, // and adjust offstage values by wrapping to the other side var w:Number = stage.stageWidth; var h:Number = stage.stageHeight; var nextX:Number; var nextY:Number; if (pressedUp) { nextY = y - step; if (nextY < 0) { nextY += h; } y = nextY; } if (pressedDown) { nextY = y + step; if (nextY > h) { nextY -= h; } y = nextY; } if (pressedLeft) { nextX = x - step; if (nextX < 0) { nextX += w; } x = nextX; } if (pressedRight) { nextX = x + step; if (nextX > w) { nextX -= w; } x = nextX; } } } }