トップ «前の日記(2006-12-11) 最新 次の日記(2006-12-21)» 編集

Route 477



2006-12-20

[Ruby/SDL] キーボード情報の扱い(Ver.2)

danさんのところで話がでてたので、思い出したように書いてみる。

前回から紆余曲折を経て、現在はこんな感じになってます。 最初にキーと通称(symbol)の対応を定義しておいて、以降のコードでは通称のみを使います。 こうすると、ゲーム内では「:up」というシンボル一つで「上キーとKキー*1とジョイパッドの上方向」を まとめて扱うことが出来て便利です。

class Input
  #ユーザ用
  define_key SDL::Key::ESCAPE, :exit
  define_key SDL::Key::UP    , :up
  define_key SDL::Key::DOWN  , :down
  define_key SDL::Key::LEFT  , :left
  define_key SDL::Key::RIGHT , :right
  define_key SDL::Key::K     , :up
  define_key SDL::Key::J     , :down
  define_key SDL::Key::H     , :left
  define_key SDL::Key::L     , :right
  define_key SDL::Key::RETURN, :ok
  define_key SDL::Key::Z     , :ok
  define_key SDL::Key::X     , :cancel
  define_pad 1, :ok         # ○
  define_pad 2, :cancel     # ×

  #NF用
  define_key SDL::Key::F1, :reset
  define_key SDL::Key::F10, :goal

  if DEBUG_MODE
    #デバッグ用(そのうち消す)
    define_key SDL::Key::W     , :toggle_window
    define_key SDL::Key::K0    , :fast_move
    define_key SDL::Key::V     , :event_sample

    #製作補助用
    define_key SDL::Key::R     , :reload_images
    define_key SDL::Key::I     , :inspect
    define_key SDL::Key::A     , :auto_reload
    define_key SDL::Key::Y     , :inspect_events

    #マップエディタ用
    define_pad 3, :put_chip   # □
    define_pad 0, :erase_chip # △
    define_pad 9, :yuutai     # select
    define_pad 6, :prev_chip  # L1
    define_pad 7, :next_chip  # R1
    define_key_shift SDL::Key::K1, :force_encount #!
    define_key SDL::Key::B     , :set_base_chip
    define_key SDL::Key::P     , :put_chip
    define_key SDL::Key::G     , :get_chip
    define_key SDL::Key::E     , :erase_chip
    define_key SDL::Key::COMMA , :prev_chip,   :repeats
    define_key SDL::Key::PERIOD, :next_chip,   :repeats
    define_key SDL::Key::S     , :save_map
    define_key SDL::Key::U     , :yuutai
    define_key SDL::Key::TAB   , :next_capital
  end
end

定義用メソッド(Rails風?)には以下のような種類があります。

define_key キー定数, シンボル
キーを定義する
define_key キー定数, シンボル, :repeats
キーを定義する(擬似キーリピートあり)
define_key_shift キー定数, シンボル
シフト+キーを定義する(ctrl,alt,metaもあるよ!)
define_pad ボタン番号, シンボル
パッドのボタンを定義する

パッドの上下左右は、自動的に :up, :down, :left, :right というシンボルに対応づけられます。固定です。

使い方は

input = Input.new
loop do
  input.clear #12/23追記:これを忘れてました。すいません
  input.poll

  input[:up]         #=>「上が押されていたか」
  input.pushed? :ok  #=>「OKボタンが押されたか」
  ..
end

という感じで、実装はinput.rbに。

*1 roguelike風