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風
[ツッコミを入れる]