Añadir funciones al teclado con Actionscript 3
Esta es una sencilla clase que nos permitirá de forma fácil añadir la ejecución de una función al presionar una determinada tecla del teclado.
para ello crearemos una clase "Teclado" y la colocaremos en nuestro package de clases de actionscript 3.
La clase la extenderemos de EventDispatcher para poder lanzar eventos desde ella, y la escribiremos siguiendo un patrón Singleton ya que solo nos interesa tener un único controlador del teclado y queremos tener acceso global a él.
{
public class Teclado extends EventDispatcher
{
public static var _instancia:Teclado;
//-------------------------------------------
public function Teclado(s:Singleton,clip) {}
//-------------------------------------------
public static function getInstancia(clip:MovieClip):Teclado
{
if (_instancia == null)
{
_instancia = new Teclado(new Singleton(),clip);
}
return _instancia;
}
//-------------------------------------------
}
}
//-----------------------------------------
class Singleton {}
En la función getInstancia que es la que nos creará la instancia de la clase y nos dará acceso global a ella le pasaremos como parámetro el clip al que asignaremos el listener para el teclado. Ese clip lo registraremos en el constructor de la clase de igual manera que crearemos dos arrays uno para guardar las teclas a las que hemos asignado una función y otro para guardar referencia a esas funciones.
{
_clip = clip;
_funciones = new Array();
_teclas = new Array();
_clip.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
}
Ahora crearemos una función publica con la que registraremos las teclas con sus respectivas funciones a ejecutar.
{
_teclas.push(n);
_funciones.push(f);
}
Solo nos queda escribir la función onKeyDown que es la que se ejecuará al presionar una tecla del teclado. Esta función comprobará si la tecla presionada está dentro de la lista de teclas con una función asignada, y de ser así ejecutará dicha función.
{
var total:uint = _teclas.length
if (total> 0) {
for (var i:uint = 0; i <total ; i++) {
if (tecla.keyCode == _teclas[i])
{
_funciones[i](tecla.keyCode);
}
}
}
_tecla = tecla.keyCode;
dispatchEvent(new Event(Teclado.KEY_PRESS));
}
De más a más, Le añadiremos un dispatchEvent por si nos interesase detectar desde fuera de la clase el hecho de haber presionado una tecla. En la variable _tecla guaremos referncia del código de la última tecla presionada para acceder a ella al escuchar el dispatch. Deberemos crearnos un getter para esa variable.
Para utilizar esta clase, en nuestra pelicula FLA colocaremos esto:
var teclado:Teclado = Teclado.getInstancia(this);
teclado.addTecla(70,traceTecla);
teclado.addTecla(71,traceTecla);
teclado.addTecla(72,traceTecla);
function traceTecla(keycode)
{
trace("Presioné la tecla " + keycode);
}
Con esto haremos que al presionar la tecla con los keyCodes 70, 71 y 72 (las teclas F,G y H) se ejecute la función traceTecla (aunque podíamos haber asignado una función diferente a cada tecla).
Hay que fijarse que las funciones que queramos asignar han de recibir como parámetro el keyCode de la tecla (esto lo podemos omitir al ejecutar la función desde la clase, pero siempre va bien saber el keyCode que te ejecuta la función, sobretodo en funciones que son ejecutadas por varias teclas como en este caso).
Así que la clase completa queda asi:
{
import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.EventDispatcher;
//-------------------------------------------
public class Teclado extends EventDispatcher
{
public static var _instancia:Teclado;
public static var KEY_PRESS:String = "onKeyPress";
private var _clip:MovieClip;
private var _funciones:Array;
private var _teclas:Array;
private var _tecla:uint;
//-------------------------------------------
public function Teclado(s:Singleton,clip)
{
_clip = clip;
_funciones = new Array();
_teclas = new Array();
_clip.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
}
//-------------------------------------------
public static function getInstancia(clip:MovieClip):Teclado
{
if (_instancia == null) {
_instancia = new Teclado(new Singleton(),clip);
}
return _instancia;
}
//-----------------------------------------
public function addTecla(n:uint, f:Function):void
{
_teclas.push(n);
_funciones.push(f);
}
//-------------------------------------------
private function onKeyDown(tecla:KeyboardEvent):void
{
var total:uint = _teclas.length
if (total> 0) {
for (var i:uint = 0; i <total ; i++) {
if (tecla.keyCode == _teclas[i])
{
_funciones[i](tecla.keyCode);
}
}
}
_tecla = tecla.keyCode;
dispatchEvent(new Event(Teclado.KEY_PRESS));
}
//-------------------------------------------
public function get tecla():uint
{
return _tecla;
}
//-------------------------------------------
}
}
//-----------------------------------------
class Singleton
{
}
Post relacinonados:




November 30th, 1999 at 12:00 am
También se podrÃa usar un diccionario para relacionar las teclas con la función que ejecutan.
November 30th, 1999 at 12:00 am
PodrÃas mostrar como con 1 diccionario ??
November 30th, 1999 at 12:00 am
Que bien, de nuevo arriba tu blog
.
September 3rd, 2008 at 10:36 am
buff...me salvas de una buena, iba contra reloj....tu clase me ha salvado el pellejo
un saludo
p.d.: soy 'novato' en AS3 y pierdo muuucho tiempo todavia con algunas cosas demasiado basicas
November 4th, 2008 at 3:55 pm
muy buen comenterio pero tiene siertas cosas tontas
March 2nd, 2009 at 2:02 pm
ES MUY BUENA
October 5th, 2009 at 6:11 pm
saludos.
tengo una consulta, e estado desarrollando el codigo del menu en actionscript 2 y en actionsrcipt 3, pero ninguno me da como respuesta los ejemplos que muestras.
en actionscript 3 me dice que la variable Boton no ha sido definida. me puedes ayudar por favor.
Gracias