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風