キーボードからにゃの入力にゃをペチペチ

インターフェイスにゃを作ってにゃ、継承してペチペチにゃと。
KeyListenerにゃを実装するとキーボードからにゃのイベントが取得できるようにゃににゃるっぽいですにゃ。
 

/**
 * 入力。
 */
interface InputDevice {
  /**
   * 更新処理。
   */
  public abstract void update();

  /**
   * リセット
   */
  public abstract void reset();

  /**
   * 現在の状態を取得。
   * @param index 取得するインデックス
   */
  public abstract int getCurrent( int index );

  /**
   * 1つ前の状態を取得。
   * @param index 取得するインデックス
   */
  public abstract int getPrevious( int index );

  /**
   * 変化のあったところを取得。
   * @param index 取得するインデックス
   */
  public abstract int getTrigger( int index );

  /**
   * 押下したところを取得。
   * @param index 取得するインデックス
   */
  public abstract int getPressed( int index );

  /**
   * 離されたところを取得。
   * @param index 取得するインデックス
   */
  public abstract int getReleased( int index );
}
import javax.swing.*;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

/**
 * キーボードからの入力。
 */
class InputDeviceKeyboard implements InputDevice {
  public static final int INPUT_UP      = 1 << 0;
  public static final int INPUT_DOWN    = 1 << 1;
  public static final int INPUT_LEFT    = 1 << 2;
  public static final int INPUT_RIGHT   = 1 << 3;
  public static final int INPUT_BUTTON1 = 1 << 4;
  public static final int INPUT_BUTTON2 = 1 << 5;
  public static final int INPUT_BUTTON3 = 1 << 6;
  public static final int INPUT_BUTTON4 = 1 << 7;
  public static final int INPUT_BUTTON5 = 1 << 8;
  public static final int INPUT_BUTTON6 = 1 << 9;
  public static final int INPUT_START   = 1 << 10;
  public static final int INPUT_SELECT  = 1 << 11;

  /**
   * キーボードからの入力。
   */
  public class Key implements KeyListener {
    Key( InputDeviceKeyboard idk ) {
      this.idk = idk;
    }

    /**
     * 
     */
    public void keyTyped( KeyEvent e ) {
    }

    /**
     * キーが押されたとき呼ばれる。
     */
    public void keyPressed( KeyEvent e ) {
      final int key = e.getKeyCode();
      switch (key) {
        case KeyEvent.VK_UP:    current |= INPUT_UP;    break;
        case KeyEvent.VK_DOWN:  current |= INPUT_DOWN;  break;
        case KeyEvent.VK_LEFT:  current |= INPUT_LEFT;  break;
        case KeyEvent.VK_RIGHT: current |= INPUT_RIGHT; break;
        case KeyEvent.VK_A: current |= INPUT_BUTTON1; break;
        case KeyEvent.VK_S: current |= INPUT_BUTTON2; break;
        case KeyEvent.VK_D: current |= INPUT_BUTTON3; break;
        case KeyEvent.VK_Z: current |= INPUT_BUTTON4; break;
        case KeyEvent.VK_X: current |= INPUT_BUTTON5; break;
        case KeyEvent.VK_C: current |= INPUT_BUTTON6; break;
      }
    }

    /**
     * キーが離されたとき呼ばれる。
     */
    public void keyReleased(KeyEvent e) {
      final int key = e.getKeyCode();
      switch(key) {
        case KeyEvent.VK_UP:    current &= ~INPUT_UP;    break;
        case KeyEvent.VK_DOWN:  current &= ~INPUT_DOWN;  break;
        case KeyEvent.VK_LEFT:  current &= ~INPUT_LEFT;  break;
        case KeyEvent.VK_RIGHT: current &= ~INPUT_RIGHT; break;
        case KeyEvent.VK_A: current &= ~INPUT_BUTTON1; break;
        case KeyEvent.VK_S: current &= ~INPUT_BUTTON2; break;
        case KeyEvent.VK_D: current &= ~INPUT_BUTTON3; break;
        case KeyEvent.VK_Z: current &= ~INPUT_BUTTON4; break;
        case KeyEvent.VK_X: current &= ~INPUT_BUTTON5; break;
        case KeyEvent.VK_C: current &= ~INPUT_BUTTON6; break;
      }
    }
    private InputDeviceKeyboard idk;
    public int current;
  }

  InputDeviceKeyboard( JComponent c ) {
    if(key == null) {
      key = new Key( this );
      // キーボードを受け付けるように
      // フォーカスを設定
      c.setFocusable( true );
      c.addKeyListener( key );
    }
    reset();
  }

  /**
   * 更新処理。
   */
  public void update() {
    trigger  =  key.current ^ current;
    pressed  =  key.current & trigger;
    released = ~key.current & trigger;
    previous = current;
    current  = key.current;
  }

  /**
   * リセット。
   */
  public void reset() {
    trigger = 0;
    pressed = 0;
    released = 0;
    previous = 0;
    current = 0;
  }

  /**
   * 現在の状態を取得。
   * @param index 取得するインデックス
   */
  public int getCurrent( int index ) {
    return current;
  }

  /**
   * 1つ前の状態を取得。
   * @param index 取得するインデックス
   */
  public int getPrevious( int index ) {
    return previous;
  }

  /**
   * 変化のあったところを取得。
   * @param index 取得するインデックス
   */
  public int getTrigger( int index ) {
    return trigger;
  }

  /**
   * 押下したところを取得。
   * @param index 取得するインデックス
   */
  public int getPressed( int index ) {
    return pressed;
  }

  /**
   * 離されたところを取得。
   * @param index 取得するインデックス
   */
  public int getReleased( int index ) {
    return released;
  }

  /** キー入力 */
  private static Key key = null;
  /** 変化のあったところ */
  private int trigger;
  /** 押下したところ */
  private int pressed;
  /** 離されたところ */
  private int released;
  /** 1つ前の状態 */
  private int previous;
  /** 現在の状態 */
  private int current;
}

 
ネットワーク用にゃの遅延処理にゃとかにゃは、未実装ですにゃ。*1

*1:ネットワークよくわからにゃいしにゃ〜〜