Skip to content

Instantly share code, notes, and snippets.

@Nutrox
Created May 3, 2011 01:39
Show Gist options
  • Save Nutrox/952678 to your computer and use it in GitHub Desktop.
Save Nutrox/952678 to your computer and use it in GitHub Desktop.
GameKeyboard Class
package com.retromodular
{
import com.retromodular.listeners.IKeyboardListener;
import flash.events.KeyboardEvent;
import flash.utils.Dictionary;
/**
*/
public final class GameKeyboard extends GameSystem
{
static internal const instance:GameKeyboard = new GameKeyboard();
private const listeners:Array = new Array(); // <IKeyboardListener>
private const pressedKeys:Dictionary = new Dictionary(); // <uint> = <uint>
/**
*/
public function GameKeyboard()
{
if( instance )
{
throw new Error("GameKeyboard class cannot be instantiated");
}
}
/**
*/
public function addListener( listener:IKeyboardListener ):Boolean
{
if( listeners.lastIndexOf( listener ) == -1 )
{
listeners.push( listener );
return true;
}
return false;
}
/**
*/
public function removeListener( listener:IKeyboardListener ):Boolean
{
var i:int = listeners.lastIndexOf( listener );
if( i != -1 )
{
listeners.splice( i, 1 );
return true;
}
return false;
}
/**
*/
public function pressKey( code:uint ):Boolean
{
if( pressedKeys[code] == null )
{
broadcastKeyPress( pressedKeys[code] = code );
return true;
}
return false;
}
/**
*/
public function releaseKey( code:uint ):Boolean
{
if( pressedKeys[code] != null )
{
delete pressedKeys[code];
broadcastKeyRelease( code );
return true;
}
return false;
}
/**
*/
public function releaseKeys():void
{
for each( var code:uint in pressedKeys )
{
releaseKey( code );
}
}
/**
*/
public function isKeyPressed( code:uint ):Boolean
{
return pressedKeys[code] != null;
}
/**
*/
internal override function initialize( booting:Boolean=false ):void
{
super.initialize( booting );
if( booting )
{
game.stage.addEventListener( KeyboardEvent.KEY_DOWN, event_onKeyDown );
game.stage.addEventListener( KeyboardEvent.KEY_UP, event_onKeyUp );
return;
}
for each( var code:uint in pressedKeys )
{
delete pressedKeys[code];
}
}
/**
*/
internal override function shutdown():void
{
game.stage.removeEventListener( KeyboardEvent.KEY_DOWN, event_onKeyDown );
game.stage.removeEventListener( KeyboardEvent.KEY_UP, event_onKeyUp );
super.shutdown();
}
/**
*/
private function broadcastKeyPress( code:uint ):void
{
for each( var listener:IKeyboardListener in listeners )
{
listener.onKeyPress( code );
}
}
/**
*/
private function broadcastKeyRelease( code:uint ):void
{
for each( var listener:IKeyboardListener in listeners )
{
listener.onKeyRelease( code );
}
}
/**
*/
private function event_onKeyDown( event:KeyboardEvent ):void
{
pressKey( event.keyCode );
}
/**
*/
private function event_onKeyUp( event:KeyboardEvent ):void
{
releaseKey( event.keyCode );
}
}// EOC
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment