Código ActionScript :
package com.senocular.utils {
import flash.display.Stage;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
//La clase Proxy permite anular el comportamiento predeterminado
// de las operaciones de ActionScript.(por ejemplo, la recuperación
// o modificación de propiedades) de un objeto.
//La clase Proxy no tiene ningún constructor; no se debe intentar
//crear una instancia de Proxy. Por el contrario,
//se debe crear una subclase de la clase Proxy para anular métodos
//como getProperty y presentar un comportamiento personalizado.
//Si intenta utilizar un método de la clase Proxy sin anular el método,
// se emitirá una excepción.
//La clase Proxy es una sustitución de las funciones Object.__resolve y
//Object.addProperty de ActionScript 2.0, que ya no están disponibles
// en ActionScript 3.0. La función Object.addProperty() permitía crear
//dinámicamente métodos get y set en ActionScript 2.0.
//Aunque ActionScript 3.0 proporciona métodos get y set en tiempo de
//compilación, no es posible asignarlos dinámicamente a un objeto
//a no ser que se utilice la clase Proxy.
import flash.utils.Proxy;
//Para evitar interferencias con el espacio de nombres public, los
//métodos de la clase Proxy se encuentran en el espacio de nombres
//flash_proxy.
import flash.utils.flash_proxy;
//una clase dinámica es aquella que puede ser modificada, tanto sus
//propiedades como métodos, en tiempo de ejecución.
dynamic public class KeyObject extends Proxy {
//Las variables estáticas, que se asocian a una clase en lugar
//de a una instancia de una clase, son útiles para almacenar
//y compartir información que se aplica a toda una clase de objetos.
//Por ejemplo, una variable estática es adecuada si se desea
//almacenar un recuento del número de veces que se crea una
//instancia de una clase o si se desea almacenar el número máximo
//de instancias de la clase permitidas.
private static var stage:Stage;
//La clase Object se encuentra en la raíz de la jerarquía de clases de
//ActionScript. Los objetos se crean mediante constructores,
//empleando la sintaxis de operador new, y se le pueden asignar
//propiedades dinámicamente. Los objetos también pueden
//crearse mediante la asignación de un literal de objeto
private static var keysDown:Object;
public function KeyObject(stage:Stage) {
construct(stage);
}
public function construct(stage:Stage):void {
KeyObject.stage = stage;
keysDown = new Object();
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
//eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
}
//Apartir de acá para abajo me trabé
// ¿Qué hace este método? - ¿Qué es override?
flash_proxy override function getProperty(name:*):* {
return (name in Keyboard) ? Keyboard[name] : -1;
}
public function isDown(keyCode:uint):Boolean {
return Boolean(keyCode in keysDown);
}
public function deconstruct():void {
stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
stage.removeEventListener(KeyboardEvent.KEY_UP, keyReleased);
keysDown = new Object();
KeyObject.stage = null;
}
private function keyPressed(evt:KeyboardEvent):void {
keysDown[evt.keyCode] = true;
}
private function keyReleased(evt:KeyboardEvent):void {
delete keysDown[evt.keyCode];
}
}
} 