ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

キーボードの状態をチェックする

ゲームに使えるようなキーボードの状態をチェックするクラスを作った。
基本的にKEY_DOWNとKEY_UPイベントでカーソルの上下左右とスペースキー、Enterキーの状態を更新しているだけ。
使い方は、まず、Key.init()でstageを引数に指定して初期化。
isPress()でキーが押されている状態が取得でき、isPush()で押されていない状態から押された状態に変化したときを取得できる。
あとはフレーム更新でキー入力の判定が終わったらKey.update()を呼び出す。isPush()を使わないならupdate()は呼び出さなくても良い。
update()はイベントで自動的に呼び出されるようにしたかったが、フレーム更新とキーボードイベントの順番の都合上、うまく行かず、他にいい方法を思いつかなかった。


実際に使ってみたテストプログラムがこちら。
wonderfl build flash online | 面白法人カヤック


クラスの本体のコードをちょっと長いけど載せておく。キーボードイベントの押されたキーの判定がベタに書いてしまっている。もうちょっと綺麗に書けそうな気がするけど。

// キーボードからの入力をチェックするクラスKey
// 使用法:
// 起動時にinit()で初期化する。引数はstage。
//     Key.init(stage);
// フレーム更新処理中キー入力の判定が終わったあとにupdate()を呼び出す。
//     Key.update();
// isPress(keycode)で押されているか取得。
// isPush(keycode)で押されていない状態から押されたときを取得
// 引数に渡すkeycodeは次のとおり。
//    UP カーソル上
//  DOWN カーソル下
//  LEFT カーソル左
// RIGHT カーソル右
// SPACE スペースキー
// ENTER Enterキー
//
// 使用例
//   onFrameUpdate() {
//        if( Key.isPress(Key.UP) ) {
//            // カーソル上が押されているときの処理
//        }
//        ...
//        Key.update(); // キーの判定が終わったらupdate()を呼ぶ
//    }
//
import flash.display.InteractiveObject;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.ui.Keyboard;

class Key
{
    public static const    UP:uint = 0;
    public static const  DOWN:uint = 1;
    public static const  LEFT:uint = 2;
    public static const RIGHT:uint = 3;
    public static const SPACE:uint = 4;
    public static const ENTER:uint = 5;
    private static const CODEMAX:uint = 6;

    private static var m_Press:Vector.<Boolean> = new Vector.<Boolean>(CODEMAX);
    private static var m_Push:Vector.<Boolean> = new Vector.<Boolean>(CODEMAX);
    
    public static function init(target:InteractiveObject):void {
        target.stage.focus = target;
        for(var i:int=0; i<CODEMAX; i++) {
            m_Press[i] = false;
            m_Push[i] = false;
        }
        
        target.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
        target.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
    }
    public static function update():void {
        for(var i:int=0; i<CODEMAX; i++) {
            m_Push[i] = false;
        }
    }
    
    public static function isPress(keycode:uint):Boolean {
        return m_Press[keycode];
    }
    public static function isPush(keycode:uint):Boolean {
        return m_Push[keycode];
    }

    private static function onKeyDown(event:KeyboardEvent):void {
        switch(event.keyCode) {
            case Keyboard.UP:
            if(m_Press[UP] == false) {
                m_Push[UP] = true;
            }
            m_Press[UP] = true;
            break;
            case Keyboard.DOWN:
            if(m_Press[DOWN] == false) {
                m_Push[DOWN] = true;
            }
            m_Press[DOWN] = true;
            break;
            case Keyboard.LEFT:
            if(m_Press[LEFT] == false) {
                m_Push[LEFT] = true;
            }
            m_Press[LEFT] = true;
            break;
            case Keyboard.RIGHT:
            if(m_Press[RIGHT] == false) {
                m_Push[RIGHT] = true;
            }
            m_Press[RIGHT] = true;
            break;
            case Keyboard.SPACE:
            if(m_Press[SPACE] == false) {
                m_Push[SPACE] = true;
            }
            m_Press[SPACE] = true;
            break;
            case Keyboard.ENTER:
            if(m_Press[ENTER] == false) {
                m_Push[ENTER] = true;
            }
            m_Press[ENTER] = true;
            break;
            default:
            break;
        }
    }
    private static function onKeyUp(event:KeyboardEvent):void {
        switch(event.keyCode) {
            case Keyboard.UP:
            m_Press[UP] = false;
            break;
            case Keyboard.DOWN:
            m_Press[DOWN] = false;
            break;
            case Keyboard.LEFT:
            m_Press[LEFT] = false;
            break;
            case Keyboard.RIGHT:
            m_Press[RIGHT] = false;
            break;
            case Keyboard.SPACE:
            m_Press[SPACE] = false;
            break;
            case Keyboard.ENTER:
            m_Press[ENTER] = false;
            break;
            default:
            break;
        }
    }
}