Created
May 3, 2011 01:39
-
-
Save Nutrox/952678 to your computer and use it in GitHub Desktop.
GameKeyboard Class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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