Module: Miyako::Input
- Defined in:
- lib/Miyako/API/input.rb
Overview
入力管理モジュール
本モジュールでは、キーボードやマウス、ゲームパッドなどの入力装置からの情報を管理する。メソッドのほとんどは、「押されたかどうか」などの問い合わせメソッドで構成されている。本モジュールでは、以下のボタンが使用可能。キー(ボタン)すべてシンボルとして定義
- :btn1 ~ :btn12
-
ゲームパッドの 1~12 に対応するボタン、もしくはキーボード上の z~n、a~hの各ボタンに対応
- :down,:left_,:right,:up
-
ゲームパッドの方向ボタンとキーボードの方向キーに対応
- :spc
-
スペースバーに対応
- :ent
-
Enterキーに対応
- :esc
-
エスケープキーに対応
- :alt
-
Altキー(左右)に対応
- :ctl
-
コントロールキー(左右)に対応
- :sft
-
シフトキー(左右)に対応
また、本モジュールのメソッドに “trigger”, “pushed” の2つのメソッドがあるが、“trigger”系メソッドは、「押されていたら常にtrue」を示すのに対して、“pushed”系メソッドは、「押した瞬間のみtrue、次の更新(Input.update)の時以降は、ボタンを放して再び押されるまでfalse」という機能を持つ
Constant Summary collapse
- BTNS =
使用するボタン数(ボタン1〜ボタン12)
12
- @@joy =
nil
- @@quit =
false
- @@toggle_screen_mode =
true
- @@click_start_tick =
0
- @@syms =
[:btn1, :btn2, :btn3, :btn4, :btn5, :btn6, :btn7, :btn8, :btn9, :btn10, :btn11, :btn12, :down, :left, :right, :up, :spc, :ent, :esc, :alt, :ctl, :sft]
- @@mods =
[SDL::Key::MOD_LALT, SDL::Key::MOD_RALT, SDL::Key::MOD_LCTRL, SDL::Key::MOD_RCTRL, SDL::Key::MOD_LSHIFT, SDL::Key::MOD_RSHIFT]
- @@btn2sym =
{SDL::Key::Z => :btn1, SDL::Key::X => :btn2, SDL::Key::C => :btn3, SDL::Key::A => :btn4, SDL::Key::S => :btn5, SDL::Key::D => :btn6, SDL::Key::Q => :btn7, SDL::Key::W => :btn8, SDL::Key::E => :btn9, SDL::Key::V => :btn10, SDL::Key::B => :btn11, SDL::Key::N => :btn12, SDL::Key::KP2 => :down, SDL::Key::DOWN => :down, SDL::Key::KP4 => :left, SDL::Key::LEFT => :left, SDL::Key::KP6 => :right, SDL::Key::RIGHT => :right, SDL::Key::KP8 => :up, SDL::Key::UP => :up, SDL::Key::SPACE => :spc, SDL::Key::RETURN => :ent, SDL::Key::ESCAPE => :esc, SDL::Key::MOD_LALT => :alt, SDL::Key::MOD_RALT => :alt, SDL::Key::MOD_LCTRL => :ctl, SDL::Key::MOD_RCTRL => :ctl, SDL::Key::MOD_LSHIFT => :sft, SDL::Key::MOD_RSHIFT => :sft}
- @@num2bsym =
[:btn1, :btn2, :btn3, :btn4, :btn5, :btn6, :btn7, :btn8, :btn9, :btn10, :btn11, :btn12]
- @@enable_keyboard =
true
- @@enable_joypad =
true
- @@enable_mouse =
true
- @@btn =
{:trigger => create_btns, :pushed => create_btns, :pre => create_btns}
- @@move_amount =
[{:down => 0, :left => -1, :right => 1, :up => 0}, {:down => 1, :left => 0, :right => 0, :up => -1}]
- @@process =
{SDL::Event2::Active => lambda {|e| Input::process_active(e)}, SDL::Event2::Quit => lambda {|e| Input::process_quit(e)}, SDL::Event2::KeyDown => lambda {|e| Input::process_keydown(e)}, SDL::Event2::KeyUp => lambda {|e| Input::process_keyup(e)}, SDL::Event2::JoyAxis => lambda {|e| Input::process_joyaxis(e)}, SDL::Event2::JoyButtonDown => lambda {|e| Input::(e)}, SDL::Event2::JoyButtonUp => lambda {|e| Input::(e)}, SDL::Event2::MouseMotion => lambda {|e| Input::process_mousemotion(e)}, SDL::Event2::MouseButtonDown => lambda {|e| Input::(e)}, SDL::Event2::MouseButtonUp => lambda {|e| Input::(e)}}
- @@mouse =
{:pos => {:x => 0, :y => 0, :dx => 0, :dy => 0}, :trigger => {:left => false, :middle => false, :right => false}, # 2008.06.11 :click => {:left => false, :middle => false, :right => false, :interval => 200}, :drag => {:left => false, :middle => false, :right => false, :x => 0, :y => 0}, :drop => {:left => false, :middle => false, :right => false, :succeed => true}, :inner => true}
- @@initialized =
false
Class Method Summary collapse
-
.click?(btn) ⇒ Boolean
ボタンがクリックされたかを問い合わせるメソッド ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り このメソッドを呼び出した後、そのボタンの返却値は、Input.updateが呼ばれない限りfalseになることに注意。.
-
.click_interval ⇒ Object
ダブルクリックの間隔を取得する 間隔は、ミリ秒単位で取得できる 返却値:: ボタンのクリック間隔.
-
.click_interval=(v) ⇒ Object
ダブルクリックの間隔を設定する 間隔は、ミリ秒単位で設定できる v:: ボタンのクリック間隔.
-
.click_mouse_button(mode, btn) ⇒ Object
:nodoc:.
-
.create_btns ⇒ Object
:nodoc:.
-
.disenable_toggle_screen_mode ⇒ Object
Alt+Enterキーを押したときにフル・ウィンドウモード切り替えを不可にする.
-
.drag_and_drop?(btn) ⇒ Boolean
ドラッグアンドドロップが行われたかどうかを問い合わせる ドラッグアンドドロップした際に使ったボタンの問い合わせは、 可変個数のシンボルで行う。指定できるボタンは以下の通り.
-
.enable_toggle_screen_mode ⇒ Object
Alt+Enterキーを押したときにフル・ウィンドウモード切り替えの可否を切り替える.
-
.escape? ⇒ Boolean
エスケープキーが押されたかどうかを問い合わせる 返却値:: エスケープキーが押されていれば true を返す.
-
.get_drag_and_drop_range ⇒ Object
ドラッグアンドドロップされた範囲を取得する 取得できる範囲は、以下のハッシュで取得できる。 => ドラッグが行われた x 座標, :drag_y => ドラッグが行われた y 座標, :drop_x => ドロップが行われた x 座業, :drop_y => ドロップが行われた y 座標 返却値:: ドラッグアンドドロップが成功していれば、移動範囲を示すハッシュ、失敗していれば nil を返す.
-
.get_mouse_amount ⇒ Object
マウスの移動量を取得する 求める値は、:x=>n,:y=>nで示すハッシュとする 移動量は、右下方向を正とする 返却値:: マウスカーソルの移動量を示すSize構造体.
-
.get_mouse_position ⇒ Object
マウスの現在位置を取得する 求める値は、:x=>n,:y=>nで示すハッシュとする 原点は、画面領域の左上を:x=>0,:y=>0とする 返却値:: マウスカーソルの位置を示すPoint構造体.
-
.init ⇒ Object
入力部の初期化.
-
.joypad_disable ⇒ Object
ゲームパッドを使用不可にする.
-
.joypad_enable ⇒ Object
ゲームパッドを使用可能にする.
-
.joypad_enable? ⇒ Boolean
ゲームパッドを使用可能かどうか問い合わせる.
-
.keyboad_enable? ⇒ Boolean
キーボードを使用可能かどうか問い合わせる.
-
.keyboard_disable ⇒ Object
キーボードを使用不可にする.
-
.keyboard_enable ⇒ Object
キーボードを使用可能にする.
-
.mouse_cursor_hide ⇒ Object
マウスカーソルを隠蔽する.
-
.mouse_cursor_inner? ⇒ Boolean
マウスカーソルが画面の内側に有るかどうかを問い合わせる 返却値:: マウスカーソルが画面内ならtrueを返す.
-
.mouse_cursor_show ⇒ Object
マウスカーソルを表示する.
-
.mouse_disable ⇒ Object
マウスを使用不可にする.
-
.mouse_enable ⇒ Object
マウスを使用可能にする.
-
.mouse_enable? ⇒ Boolean
マウスを使用可能かどうか問い合わせる.
-
.mouse_trigger?(btn) ⇒ Boolean
ボタンが押されているかを問い合わせるメソッド ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り.
-
.process_active(e) ⇒ Object
:nodoc:.
-
.process_default(e) ⇒ Object
:nodoc:.
-
.process_joyaxis(e) ⇒ Object
:nodoc:.
-
.process_joybuttondown(e) ⇒ Object
:nodoc:.
-
.process_joybuttonup(e) ⇒ Object
:nodoc:.
-
.process_keydown(e) ⇒ Object
:nodoc:.
-
.process_keyup(e) ⇒ Object
:nodoc:.
-
.process_mousebuttondown(e) ⇒ Object
:nodoc:.
-
.process_mousebuttonup(e) ⇒ Object
:nodoc:.
-
.process_mousemotion(e) ⇒ Object
:nodoc:.
-
.process_quit(e) ⇒ Object
:nodoc:.
-
.pushed_all?(*inputs) ⇒ Boolean
指定のボタンがすべて押されたかを問い合わせるメソッド inputs:: ボタンを示すシンボル。複数指定可能 ((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている) 返却値:: すべて押されていれば true を返す.
-
.pushed_amount ⇒ Object
ボタンが押された方向を取得する 方向キーが押された情報を、2要素の配列[x,y]で示す。.
-
.pushed_any?(*inputs) ⇒ Boolean
指定のボタンのどれかが押されたかを問い合わせるメソッド inputs:: ボタンを示すシンボル。複数指定可能 ((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている) 返却値:: すべて押されていれば true を返す.
-
.quit? ⇒ Boolean
ウィンドウの「閉じる」ボタンが選択されたかどうかを問い合わせる Windowsの場合、ウィンドウ右上の「×」ボタンを押したときに相当 返却値:: 「×」ボタンが押されていれば true を返す.
-
.quit_or_escape? ⇒ Boolean
ウィンドウの「×」ボタンか、エスケープキーが押されたかどうかを問い合わせる 返却値:: 「×」ボタンが押されてる、もしくはエスケープキーが押されていれば true を返す.
-
.reset_btn(n) ⇒ Object
:nodoc:.
-
.reset_mouse_button(mode, btn) ⇒ Object
:nodoc:.
-
.set_btn(n) ⇒ Object
:nodoc:.
-
.set_mouse_button(mode, btn) ⇒ Object
:nodoc:.
-
.toggle_screen_mode? ⇒ Boolean
Alt+Enterキーを押したときにフル・ウィンドウモード切り替えができるかどうかを問い合わせる 返却値:: 切り替えができるときは true を返す.
-
.trigger_all?(*inputs) ⇒ Boolean
指定のボタンがすべて押下状態かを問い合わせるメソッド inputs:: ボタンを示すシンボル。複数指定可能 ((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている) 返却値:: すべて押下状態ならば true を返す.
-
.trigger_amount ⇒ Object
ボタンが押下状態にある方向を取得する 方向キーが押下状態にある情報を、2要素の配列[x,y]で示す。.
-
.trigger_any?(*inputs) ⇒ Boolean
指定のボタンがどれかが押下状態かを問い合わせるメソッド 引数を省略した場合は、「どれかのキーが押下状態か」を問い合わせる。 inputs:: ボタンを示すシンボル。複数指定可能 ((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている)。 返却値:: どれかが押下状態ならば true を返す.
-
.update ⇒ Object
入力装置からの情報を更新する 必ず1回は呼び出す必要がある (特に、ゲームループの最初に呼び出す必要がある また、このメソッドを呼び出すのは必ずメインスレッドから呼び出すこと.
Class Method Details
.click?(btn) ⇒ Boolean
ボタンがクリックされたかを問い合わせるメソッド
ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通りこのメソッドを呼び出した後、そのボタンの返却値は、Input.updateが呼ばれない限りfalseになることに注意。
:left : 左ボタン:middle : 中ボタン(ホイールをクリック) :right : 右ボタン:any : 上記ボタンの少なくともどれか一つ
- btn
-
問い合わせるボタンを示すシンボル(可変個)
- 返却値
-
ボタンが押されていれば true を返す
437 438 439 440 441 442 |
# File 'lib/Miyako/API/input.rb', line 437 def Input::click?(btn) return false unless @@enable_mouse btns = (btn == :any ? [:left, :middle, :right] : [btn]) ret = btns.inject(false){|r, f| r |= @@mouse[:click][f]} return ret end |
.click_interval ⇒ Object
ダブルクリックの間隔を取得する
間隔は、ミリ秒単位で取得できる
- 返却値
-
ボタンのクリック間隔
487 488 489 |
# File 'lib/Miyako/API/input.rb', line 487 def Input::click_interval return @@mouse[:click][:interval] end |
.click_interval=(v) ⇒ Object
ダブルクリックの間隔を設定する
間隔は、ミリ秒単位で設定できる
- v
-
ボタンのクリック間隔
494 495 496 |
# File 'lib/Miyako/API/input.rb', line 494 def Input::click_interval=(v) @@mouse[:click][:interval] = v end |
.click_mouse_button(mode, btn) ⇒ Object
:nodoc:
259 260 261 262 263 |
# File 'lib/Miyako/API/input.rb', line 259 def Input::(mode, btn) #:nodoc: @@mouse[mode][:left] = (btn == SDL::Mouse::BUTTON_LEFT) @@mouse[mode][:middle] = (btn == SDL::Mouse::BUTTON_MIDDLE) @@mouse[mode][:right] = (btn == SDL::Mouse::BUTTON_RIGHT) end |
.create_btns ⇒ Object
:nodoc:
77 78 79 80 81 82 83 84 85 |
# File 'lib/Miyako/API/input.rb', line 77 def Input::create_btns #:nodoc: return {:btn1 => 0, :btn2 => 0, :btn3 => 0, :btn4 => 0, :btn5 => 0, :btn6 => 0, :btn7 => 0, :btn8 => 0, :btn9 => 0, :btn10 => 0, :btn11 => 0, :btn12 => 0, :down => 0, :left => 0, :right => 0, :up => 0, :spc => 0, :ent => 0, :esc => 0, :alt => 0, :ctl => 0, :sft => 0} end |
.disenable_toggle_screen_mode ⇒ Object
Alt+Enterキーを押したときにフル・ウィンドウモード切り替えを不可にする
511 512 513 |
# File 'lib/Miyako/API/input.rb', line 511 def Input::disenable_toggle_screen_mode @@toggle_screen_mode = false end |
.drag_and_drop?(btn) ⇒ Boolean
ドラッグアンドドロップが行われたかどうかを問い合わせる
ドラッグアンドドロップした際に使ったボタンの問い合わせは、可変個数のシンボルで行う。指定できるボタンは以下の通り
- :left
-
左ボタン
- :middle
-
中ボタン(ホイールをクリック)
- :right
-
右ボタン
- :any
-
上記ボタンの少なくともどれか一つ
- btn
-
問い合わせるボタンを示すシンボル(可変個)
- 返却値
-
ドラッグアンドドロップが成功していれば、true を返す
470 471 472 473 |
# File 'lib/Miyako/API/input.rb', line 470 def Input::drag_and_drop?(btn) return false unless @@enable_mouse return @@mouse[:drop][:succeed] && (btn == :any ? (@@mouse[:drop][:left] || @@mouse[:drop][:middle] || @@mouse[:drop][:right]) : @@mouse[:click][btn]) end |
.enable_toggle_screen_mode ⇒ Object
Alt+Enterキーを押したときにフル・ウィンドウモード切り替えの可否を切り替える
506 507 508 |
# File 'lib/Miyako/API/input.rb', line 506 def Input::enable_toggle_screen_mode @@toggle_screen_mode = true end |
.escape? ⇒ Boolean
エスケープキーが押されたかどうかを問い合わせる
- 返却値
-
エスケープキーが押されていれば true を返す
388 389 390 |
# File 'lib/Miyako/API/input.rb', line 388 def Input::escape? return (@@btn[:pushed][:esc] == 1) end |
.get_drag_and_drop_range ⇒ Object
ドラッグアンドドロップされた範囲を取得する
取得できる範囲は、以下のハッシュで取得できる。=> ドラッグが行われた x 座標, :drag_y => ドラッグが行われた y 座標, :drop_x => ドロップが行われた x 座業, :drop_y => ドロップが行われた y 座標
- 返却値
-
ドラッグアンドドロップが成功していれば、移動範囲を示すハッシュ、失敗していれば nil を返す
479 480 481 482 |
# File 'lib/Miyako/API/input.rb', line 479 def Input::get_drag_and_drop_range return nil unless @@enable_mouse return @@mouse[:drop][:succeed] ? {:drag_x => @@mouse[:drag][:x], :drag_y => @@mouse[:drag][:y], :drop_x => @@mouse[:pos][:x], :drop_y => @@mouse[:pos][:y]} : nil end |
.get_mouse_amount ⇒ Object
マウスの移動量を取得する
求める値は、:x=>n,:y=>nで示すハッシュとする移動量は、右下方向を正とする
- 返却値
-
マウスカーソルの移動量を示すSize構造体
421 422 423 424 |
# File 'lib/Miyako/API/input.rb', line 421 def Input::get_mouse_amount return Size.new(0,0) unless @@enable_mouse return Size.new(@@mouse[:pos][:dx],@@mouse[:pos][:dy]) end |
.get_mouse_position ⇒ Object
マウスの現在位置を取得する
求める値は、:x=>n,:y=>nで示すハッシュとする原点は、画面領域の左上を:x=>0,:y=>0とする
- 返却値
-
マウスカーソルの位置を示すPoint構造体
412 413 414 415 |
# File 'lib/Miyako/API/input.rb', line 412 def Input::get_mouse_position return Point.new(-1,-1) unless @@enable_mouse return Point.new(@@mouse[:pos][:x],@@mouse[:pos][:y]) end |
.init ⇒ Object
入力部の初期化
117 118 119 120 121 |
# File 'lib/Miyako/API/input.rb', line 117 def Input.init raise MiyakoError, "Already initialized!" if @@initialized @@joy = SDL::Joystick.open(0) if SDL::Joystick.num >= 1 @@initialized = true end |
.joypad_disable ⇒ Object
ゲームパッドを使用不可にする
144 145 146 |
# File 'lib/Miyako/API/input.rb', line 144 def Input.joypad_disable @@enable_joypad = false end |
.joypad_enable ⇒ Object
ゲームパッドを使用可能にする
139 140 141 |
# File 'lib/Miyako/API/input.rb', line 139 def Input.joypad_enable @@enable_joypad= true end |
.joypad_enable? ⇒ Boolean
ゲームパッドを使用可能かどうか問い合わせる
149 150 151 |
# File 'lib/Miyako/API/input.rb', line 149 def Input.joypad_enable? @@enable_joypad end |
.keyboad_enable? ⇒ Boolean
キーボードを使用可能かどうか問い合わせる
134 135 136 |
# File 'lib/Miyako/API/input.rb', line 134 def Input.keyboad_enable? @@enable_keyboard end |
.keyboard_disable ⇒ Object
キーボードを使用不可にする
129 130 131 |
# File 'lib/Miyako/API/input.rb', line 129 def Input.keyboard_disable @@enable_keyboard = false end |
.keyboard_enable ⇒ Object
キーボードを使用可能にする
124 125 126 |
# File 'lib/Miyako/API/input.rb', line 124 def Input.keyboard_enable @@enable_keyboard = true end |
.mouse_cursor_hide ⇒ Object
マウスカーソルを隠蔽する
404 405 406 |
# File 'lib/Miyako/API/input.rb', line 404 def Input::mouse_cursor_hide SDL::Mouse.hide end |
.mouse_cursor_inner? ⇒ Boolean
マウスカーソルが画面の内側に有るかどうかを問い合わせる
- 返却値
-
マウスカーソルが画面内ならtrueを返す
500 501 502 503 |
# File 'lib/Miyako/API/input.rb', line 500 def Input::mouse_cursor_inner? return false unless @@enable_mouse return @@mouse[:inner] end |
.mouse_cursor_show ⇒ Object
マウスカーソルを表示する
399 400 401 |
# File 'lib/Miyako/API/input.rb', line 399 def Input::mouse_cursor_show SDL::Mouse.show end |
.mouse_disable ⇒ Object
マウスを使用不可にする
159 160 161 |
# File 'lib/Miyako/API/input.rb', line 159 def Input.mouse_disable @@enable_mouse = false end |
.mouse_enable ⇒ Object
マウスを使用可能にする
154 155 156 |
# File 'lib/Miyako/API/input.rb', line 154 def Input.mouse_enable @@enable_mouse = true end |
.mouse_enable? ⇒ Boolean
マウスを使用可能かどうか問い合わせる
164 165 166 |
# File 'lib/Miyako/API/input.rb', line 164 def Input.mouse_enable? @@enable_mouse end |
.mouse_trigger?(btn) ⇒ Boolean
ボタンが押されているかを問い合わせるメソッド
ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り
- :left
-
左ボタン
- :middle
-
中ボタン(ホイールをクリック)
- :right
-
右ボタン
- :any
-
上記ボタンの少なくともどれか一つ
- btn
-
問い合わせるボタンを示すシンボル(可変個)
- 返却値
-
ボタンが押されていれば true を返す
454 455 456 457 |
# File 'lib/Miyako/API/input.rb', line 454 def Input::mouse_trigger?(btn) return false unless @@enable_mouse return btn == :any ? (@@mouse[:trigger][:left] || @@mouse[:trigger][:middle] || @@mouse[:trigger][:right]) : @@mouse[:trigger][btn] end |
.process_active(e) ⇒ Object
:nodoc:
251 252 253 254 |
# File 'lib/Miyako/API/input.rb', line 251 def Input::process_active(e) #:nodoc: return unless @@enable_mouse @@mouse[:inner] = e.gain if e.state == 1 end |
.process_default(e) ⇒ Object
:nodoc:
256 257 |
# File 'lib/Miyako/API/input.rb', line 256 def Input::process_default(e) #:nodoc: end |
.process_joyaxis(e) ⇒ Object
:nodoc:
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/Miyako/API/input.rb', line 184 def Input::process_joyaxis(e) #:nodoc: return unless @@enable_joypad if e.axis == 0 if e.value >= 16384 set_btn(:right) elsif e.value < -16384 set_btn(:left) else reset_btn(:left) reset_btn(:right) end elsif e.axis == 1 if e.value >= 16384 set_btn(:down) elsif e.value < -16384 set_btn(:up) else reset_btn(:down) reset_btn(:up) end end end |
.process_joybuttondown(e) ⇒ Object
:nodoc:
207 208 209 210 |
# File 'lib/Miyako/API/input.rb', line 207 def Input::(e) #:nodoc: return unless @@enable_joypad set_btn(@@num2bsym[e.]) if e. < BTNS end |
.process_joybuttonup(e) ⇒ Object
:nodoc:
212 213 214 215 |
# File 'lib/Miyako/API/input.rb', line 212 def Input::(e) #:nodoc: return unless @@enable_joypad reset_btn(@@num2bsym[e.]) if e. < BTNS end |
.process_keydown(e) ⇒ Object
:nodoc:
172 173 174 175 176 |
# File 'lib/Miyako/API/input.rb', line 172 def Input::process_keydown(e) #:nodoc: return unless @@enable_keyboard set_btn(@@btn2sym[e.sym]) if @@btn2sym.include?(e.sym) @@mods.each{|m| set_btn(@@btn2sym[m]) if e.mod & m == m} end |
.process_keyup(e) ⇒ Object
:nodoc:
178 179 180 181 182 |
# File 'lib/Miyako/API/input.rb', line 178 def Input::process_keyup(e) #:nodoc: return unless @@enable_keyboard reset_btn(@@btn2sym[e.sym]) if @@btn2sym.include?(e.sym) @@mods.each{|m| reset_btn(@@btn2sym[m]) if e.mod & m == m} end |
.process_mousebuttondown(e) ⇒ Object
:nodoc:
225 226 227 228 229 230 231 232 233 234 |
# File 'lib/Miyako/API/input.rb', line 225 def Input::(e) #:nodoc: return unless @@enable_mouse (:trigger, e.) return unless @@mouse[:inner] (:click, e.) (:drag, e.) @@mouse[:drag][:x] = @@mouse[:pos][:x] @@mouse[:drag][:y] = @@mouse[:pos][:y] @@click_start_tick = SDL.getTicks end |
.process_mousebuttonup(e) ⇒ Object
:nodoc:
236 237 238 239 240 241 242 243 244 245 246 247 248 249 |
# File 'lib/Miyako/API/input.rb', line 236 def Input::(e) #:nodoc: return unless @@enable_mouse (:trigger, e.) click_interval = SDL.getTicks - @@click_start_tick if click_interval < @@mouse[:click][:interval] [:left, :middle, :right].each{|b| @@mouse[:drag][b] = false } else @@mouse[:drop][:left] = @@mouse[:drag][:left] and (e. == SDL::Mouse::BUTTON_LEFT) @@mouse[:drop][:middle] = @@mouse[:drag][:left] and (e. == SDL::Mouse::BUTTON_MIDDLE) @@mouse[:drop][:right] = @@mouse[:drag][:left] and (e. == SDL::Mouse::BUTTON_RIGHT) @@mouse[:drop][:succeed] = [:left,:middle,:right].inject(false){|r,i| r |= @@mouse[:drag][i]} && @@mouse[:inner] [:left, :middle, :right].each{|b| @@mouse[:drag][b] = false } end end |
.process_mousemotion(e) ⇒ Object
:nodoc:
217 218 219 220 221 222 223 |
# File 'lib/Miyako/API/input.rb', line 217 def Input::process_mousemotion(e) #:nodoc: return unless @@enable_mouse @@mouse[:pos][:x] = e.x @@mouse[:pos][:y] = e.y @@mouse[:pos][:dx] = e.xrel @@mouse[:pos][:dy] = e.yrel end |
.process_quit(e) ⇒ Object
:nodoc:
168 169 170 |
# File 'lib/Miyako/API/input.rb', line 168 def Input::process_quit(e) #:nodoc: @@quit = true end |
.pushed_all?(*inputs) ⇒ Boolean
指定のボタンがすべて押されたかを問い合わせるメソッド
- inputs
-
ボタンを示すシンボル。複数指定可能
((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)
- 返却値
-
すべて押されていれば true を返す
337 338 339 340 |
# File 'lib/Miyako/API/input.rb', line 337 def Input::pushed_all?(*inputs) raise MiyakoError, "No setting any buttons! : trigger_any?" if inputs.length == 0 return inputs.inject(true){|r, v| r &= (@@btn[:pushed][v] == 1)} end |
.pushed_amount ⇒ Object
ボタンが押された方向を取得する
方向キーが押された情報を、2要素の配列[x,y]で示す。
各要素の値は以下の通り。x ・・・ -1:左、0:変化なし、1:右
y ・・・ -1:上、0:変化なし、1:下
- 返却値
-
移動方向を示す配列
373 374 375 376 377 |
# File 'lib/Miyako/API/input.rb', line 373 def Input::pushed_amount amt = [0, 0] [:down, :left, :right, :up].each{|d| [0, 1].each{|n| amt[n] += @@btn[:pushed][d] * @@move_amount[n][d]} } return amt end |
.pushed_any?(*inputs) ⇒ Boolean
指定のボタンのどれかが押されたかを問い合わせるメソッド
- inputs
-
ボタンを示すシンボル。複数指定可能
((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている)
- 返却値
-
すべて押されていれば true を返す
346 347 348 349 |
# File 'lib/Miyako/API/input.rb', line 346 def Input::pushed_any?(*inputs) inputs = @@syms if inputs.length == 0 return inputs.inject(false){|r, v| r |= (@@btn[:pushed][v] == 1)} end |
.quit? ⇒ Boolean
ウィンドウの「閉じる」ボタンが選択されたかどうかを問い合わせる
Windowsの場合、ウィンドウ右上の「×」ボタンを押したときに相当
- 返却値
-
「×」ボタンが押されていれば true を返す
382 383 384 |
# File 'lib/Miyako/API/input.rb', line 382 def Input::quit? return @@quit end |
.quit_or_escape? ⇒ Boolean
ウィンドウの「×」ボタンか、エスケープキーが押されたかどうかを問い合わせる
- 返却値
-
「×」ボタンが押されてる、もしくはエスケープキーが押されていれば true を返す
394 395 396 |
# File 'lib/Miyako/API/input.rb', line 394 def Input::quit_or_escape? return @@quit || (@@btn[:pushed][:esc] == 1) end |
.reset_btn(n) ⇒ Object
:nodoc:
284 285 286 |
# File 'lib/Miyako/API/input.rb', line 284 def Input::reset_btn(n) #:nodoc: @@btn.each_key{|k| @@btn[k][n] = 0} end |
.reset_mouse_button(mode, btn) ⇒ Object
:nodoc:
271 272 273 274 275 |
# File 'lib/Miyako/API/input.rb', line 271 def Input::(mode, btn) #:nodoc: @@mouse[mode][:left] = false if (btn == SDL::Mouse::BUTTON_LEFT) @@mouse[mode][:middle] = false if (btn == SDL::Mouse::BUTTON_MIDDLE) @@mouse[mode][:right] = false if (btn == SDL::Mouse::BUTTON_RIGHT) end |
.set_btn(n) ⇒ Object
:nodoc:
277 278 279 280 281 282 |
# File 'lib/Miyako/API/input.rb', line 277 def Input::set_btn(n) #:nodoc: @@btn[:trigger][n] = 1 return if @@btn[:pre][n] == 1 @@btn[:pushed][n] = 1 @@btn[:pre][n] = 1 end |
.set_mouse_button(mode, btn) ⇒ Object
:nodoc:
265 266 267 268 269 |
# File 'lib/Miyako/API/input.rb', line 265 def Input::(mode, btn) #:nodoc: @@mouse[mode][:left] = (btn == SDL::Mouse::BUTTON_LEFT) @@mouse[mode][:middle] = (btn == SDL::Mouse::BUTTON_MIDDLE) @@mouse[mode][:right] = (btn == SDL::Mouse::BUTTON_RIGHT) end |
.toggle_screen_mode? ⇒ Boolean
Alt+Enterキーを押したときにフル・ウィンドウモード切り替えができるかどうかを問い合わせる
- 返却値
-
切り替えができるときは true を返す
517 518 519 |
# File 'lib/Miyako/API/input.rb', line 517 def Input::toggle_screen_mode? return @@toggle_screen_mode end |
.trigger_all?(*inputs) ⇒ Boolean
指定のボタンがすべて押下状態かを問い合わせるメソッド
- inputs
-
ボタンを示すシンボル。複数指定可能
((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)
- 返却値
-
すべて押下状態ならば true を返す
318 319 320 321 |
# File 'lib/Miyako/API/input.rb', line 318 def Input::trigger_all?(*inputs) raise MiyakoError, "No setting any buttons! : trigger_all?" if inputs.length == 0 return inputs.inject(false){|r, v| r &= (@@btn[:trigger][v] == 1)} end |
.trigger_amount ⇒ Object
ボタンが押下状態にある方向を取得する
方向キーが押下状態にある情報を、2要素の配列[x,y]で示す。
各要素の値は以下の通り。x ・・・ -1:左、0:変化なし、1:右
y ・・・ -1:上、0:変化なし、1:下
- 返却値
-
移動方向を示す配列
359 360 361 362 363 |
# File 'lib/Miyako/API/input.rb', line 359 def Input::trigger_amount amt = [0, 0] [:down, :left, :right, :up].each{|d| [0, 1].each{|n| amt[n] += @@btn[:trigger][d] * @@move_amount[n][d]} } return amt end |
.trigger_any?(*inputs) ⇒ Boolean
指定のボタンがどれかが押下状態かを問い合わせるメソッド
引数を省略した場合は、「どれかのキーが押下状態か」を問い合わせる。
- inputs
-
ボタンを示すシンボル。複数指定可能
((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている)。
- 返却値
-
どれかが押下状態ならば true を返す
328 329 330 331 |
# File 'lib/Miyako/API/input.rb', line 328 def Input::trigger_any?(*inputs) inputs = @@syms if inputs.length == 0 return inputs.inject(false){|r, v| r |= (@@btn[:trigger][v] == 1)} end |
.update ⇒ Object
入力装置からの情報を更新する
必ず1回は呼び出す必要がある(特に、ゲームループの最初に呼び出す必要があるまた、このメソッドを呼び出すのは必ずメインスレッドから呼び出すこと
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 |
# File 'lib/Miyako/API/input.rb', line 292 def Input::update SDL::Joystick.updateAll @@btn[:pushed].each_key{|p| @@btn[:pushed][p] = 0 } [:dx, :dy].each{|e| @@mouse[:pos][e] = 0 } [:left, :middle, :right].each{|e| @@mouse[:click][e] = false @@mouse[:drop][e] = false } e_list = [] while e = SDL::Event2.poll e_list << e end e_list.reverse.each{|e| @@process[e.class].call(e) if @@btn[:trigger][:alt] == 1 && @@btn[:pushed][:ent]==1 && @@toggle_screen_mode Screen.toggle_mode @@btn[:trigger][:alt] = 0 @@btn[:pushed][:ent] = 0 end } end |