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::process_joybuttondown(e)},
SDL::Event2::JoyButtonUp     => lambda {|e| Input::process_joybuttonup(e)},
SDL::Event2::MouseMotion     => lambda {|e| Input::process_mousemotion(e)},
SDL::Event2::MouseButtonDown => lambda {|e| Input::process_mousebuttondown(e)},
SDL::Event2::MouseButtonUp   => lambda {|e| Input::process_mousebuttonup(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 => false, :focus => false, :mini => false}
@@mouse_inner =
false
@@key_focus =
false
@@app_minimize =
false
@@initialized =
false

Class Method Summary collapse

Class Method Details

.after_execObject



332
333
334
335
336
337
338
339
# File 'lib/Miyako/API/input.rb', line 332

def Input::after_exec
  x = @@mouse[:pos][:x]
  y = @@mouse[:pos][:y]
  if (@@mouse[:click][:left] or @@mouse[:click][:middle] or @@mouse[:click][:right]) and !@@key_focus and x>=0 and x<Screen.w and y>=0 and y<Screen.h
    @@key_focus = true
    [:left, :middle, :right].each{|key| @@mouse[:click][key] = false }
  end
end

.btn_stateObject



595
596
597
# File 'lib/Miyako/API/input.rb', line 595

def Input::btn_state
  @@btn
end

.click?(btn) ⇒ Boolean

ボタンがクリックされたかを問い合わせるメソッド

ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り このメソッドを呼び出した後、そのボタンの返却値は、Input.updateが呼ばれない限りfalseになることに注意。

:left : 左ボタン :middle : 中ボタン(ホイールをクリック) :right : 右ボタン :any : 上記ボタンの少なくともどれか一つ

btn

問い合わせるボタンを示すシンボル(可変個)

返却値

ボタンが押されていれば true を返す

Returns:

  • (Boolean)


480
481
482
483
484
485
# File 'lib/Miyako/API/input.rb', line 480

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_intervalObject

ダブルクリックの間隔を取得する

間隔は、ミリ秒単位で取得できる

返却値

ボタンのクリック間隔



530
531
532
# File 'lib/Miyako/API/input.rb', line 530

def Input::click_interval
  return @@mouse[:click][:interval]
end

.click_interval=(v) ⇒ Object

ダブルクリックの間隔を設定する

間隔は、ミリ秒単位で設定できる

v

ボタンのクリック間隔



537
538
539
# File 'lib/Miyako/API/input.rb', line 537

def Input::click_interval=(v)
  @@mouse[:click][:interval] = v
end

.click_mouse_button(mode, btn) ⇒ Object

:nodoc:



274
275
276
277
278
# File 'lib/Miyako/API/input.rb', line 274

def Input::click_mouse_button(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_btnsObject

: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_modeObject

Alt+Enterキーを押したときにフル・ウィンドウモード切り替えを不可にする



585
586
587
# File 'lib/Miyako/API/input.rb', line 585

def Input::disenable_toggle_screen_mode
  @@toggle_screen_mode = false
end

.drag_and_drop?(btn) ⇒ Boolean

ドラッグアンドドロップが行われたかどうかを問い合わせる

ドラッグアンドドロップした際に使ったボタンの問い合わせは、 可変個数のシンボルで行う。指定できるボタンは以下の通り

:left

左ボタン

:middle

中ボタン(ホイールをクリック)

:right

右ボタン

:any

上記ボタンの少なくともどれか一つ

btn

問い合わせるボタンを示すシンボル(可変個)

返却値

ドラッグアンドドロップが成功していれば、true を返す

Returns:

  • (Boolean)


513
514
515
516
# File 'lib/Miyako/API/input.rb', line 513

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_modeObject

Alt+Enterキーを押したときにフル・ウィンドウモード切り替えの可否を切り替える



580
581
582
# File 'lib/Miyako/API/input.rb', line 580

def Input::enable_toggle_screen_mode
  @@toggle_screen_mode = true
end

.escape?Boolean

エスケープキーが押されたかどうかを問い合わせる

返却値

エスケープキーが押されていれば true を返す

Returns:

  • (Boolean)


415
416
417
# File 'lib/Miyako/API/input.rb', line 415

def Input::escape?
  return (@@btn[:pushed][:esc] == 1)
end

.get_drag_and_drop_rangeObject

ドラッグアンドドロップされた範囲を取得する

取得できる範囲は、以下のハッシュで取得できる。 => ドラッグが行われた x 座標, :drag_y => ドラッグが行われた y 座標, :drop_x => ドロップが行われた x 座業, :drop_y => ドロップが行われた y 座標

返却値

ドラッグアンドドロップが成功していれば、移動範囲を示すハッシュ、失敗していれば nil を返す



522
523
524
525
# File 'lib/Miyako/API/input.rb', line 522

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_amountObject

マウスの移動量を取得する

求める値は、:x=>n,:y=>nで示すハッシュとする 移動量は、右下方向を正とする

返却値

マウスカーソルの移動量を示すSize構造体



464
465
466
467
# File 'lib/Miyako/API/input.rb', line 464

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_positionObject

マウスの現在位置を取得する

求める値は、:x=>n,:y=>nで示すハッシュとする 原点は、画面領域の左上を:x=>0,:y=>0とする

返却値

マウスカーソルの位置を示すPoint構造体



439
440
441
442
# File 'lib/Miyako/API/input.rb', line 439

def Input::get_mouse_position
  return Point.new(-1,-1) unless @@enable_mouse
  return Point.new(@@mouse[:pos][:x],@@mouse[:pos][:y])
end

.initObject

入力部の初期化

Raises:



120
121
122
123
124
# File 'lib/Miyako/API/input.rb', line 120

def Input.init
  raise MiyakoError, "Already initialized!" if @@initialized
  @@joy = SDL::Joystick.open(0) if SDL::Joystick.num >= 1
  @@initialized = true
end

.joypad_disableObject

ゲームパッドを使用不可にする



147
148
149
# File 'lib/Miyako/API/input.rb', line 147

def Input.joypad_disable
  @@enable_joypad = false
end

.joypad_enableObject

ゲームパッドを使用可能にする



142
143
144
# File 'lib/Miyako/API/input.rb', line 142

def Input.joypad_enable
  @@enable_joypad= true
end

.joypad_enable?Boolean

ゲームパッドを使用可能かどうか問い合わせる

Returns:

  • (Boolean)


152
153
154
# File 'lib/Miyako/API/input.rb', line 152

def Input.joypad_enable?
  @@enable_joypad
end

.key_focus?Boolean

マウスカーソルが画面の内側に有るかどうかを問い合わせる

返却値

マウスカーソルが画面内ならtrueを返す

Returns:

  • (Boolean)


550
551
552
# File 'lib/Miyako/API/input.rb', line 550

def Input::key_focus?
  return @@key_focus
end

.key_focus_change?Boolean

マウスカーソルが画面の内側に有るかどうかを問い合わせる

返却値

マウスカーソルが画面内ならtrueを返す

Returns:

  • (Boolean)


569
570
571
# File 'lib/Miyako/API/input.rb', line 569

def Input::key_focus_change?
  return @@mouse[:focus]
end

.keyboad_enable?Boolean

キーボードを使用可能かどうか問い合わせる

Returns:

  • (Boolean)


137
138
139
# File 'lib/Miyako/API/input.rb', line 137

def Input.keyboad_enable?
  @@enable_keyboard
end

.keyboard_disableObject

キーボードを使用不可にする



132
133
134
# File 'lib/Miyako/API/input.rb', line 132

def Input.keyboard_disable
  @@enable_keyboard = false
end

.keyboard_enableObject

キーボードを使用可能にする



127
128
129
# File 'lib/Miyako/API/input.rb', line 127

def Input.keyboard_enable
  @@enable_keyboard = true
end

.mouse_cursor_hideObject

マウスカーソルを隠蔽する



431
432
433
# File 'lib/Miyako/API/input.rb', line 431

def Input::mouse_cursor_hide
  SDL::Mouse.hide
end

.mouse_cursor_inner?Boolean

マウスカーソルが画面の内側に有るかどうかを問い合わせる

返却値

マウスカーソルが画面内ならtrueを返す

Returns:

  • (Boolean)


543
544
545
546
# File 'lib/Miyako/API/input.rb', line 543

def Input::mouse_cursor_inner?
  return false unless @@enable_mouse
  return @@mouse_inner
end

.mouse_cursor_inner_change?Boolean

マウスカーソルが画面の内側に有るかどうかを問い合わせる

返却値

マウスカーソルが画面内ならtrueを返す

Returns:

  • (Boolean)


562
563
564
565
# File 'lib/Miyako/API/input.rb', line 562

def Input::mouse_cursor_inner_change?
  return false unless @@enable_mouse
  return @@mouse[:inner]
end

.mouse_cursor_showObject

マウスカーソルを表示する



426
427
428
# File 'lib/Miyako/API/input.rb', line 426

def Input::mouse_cursor_show
  SDL::Mouse.show
end

.mouse_disableObject

マウスを使用不可にする



162
163
164
# File 'lib/Miyako/API/input.rb', line 162

def Input.mouse_disable
  @@enable_mouse = false
end

.mouse_dxObject



452
453
454
# File 'lib/Miyako/API/input.rb', line 452

def Input::mouse_dx
  return @@enable_mouse ? @@mouse[:pos][:dx] : 0
end

.mouse_dyObject



456
457
458
# File 'lib/Miyako/API/input.rb', line 456

def Input::mouse_dy
  return @@enable_mouse ? @@mouse[:pos][:dy] : 0
end

.mouse_enableObject

マウスを使用可能にする



157
158
159
# File 'lib/Miyako/API/input.rb', line 157

def Input.mouse_enable
  @@enable_mouse = true
end

.mouse_enable?Boolean

マウスを使用可能かどうか問い合わせる

Returns:

  • (Boolean)


167
168
169
# File 'lib/Miyako/API/input.rb', line 167

def Input.mouse_enable?
  @@enable_mouse
end

.mouse_stateObject



599
600
601
# File 'lib/Miyako/API/input.rb', line 599

def Input::mouse_state
  @@mouse
end

.mouse_trigger?(btn) ⇒ Boolean

ボタンが押されているかを問い合わせるメソッド

ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り

:left

左ボタン

:middle

中ボタン(ホイールをクリック)

:right

右ボタン

:any

上記ボタンの少なくともどれか一つ

btn

問い合わせるボタンを示すシンボル(可変個)

返却値

ボタンが押されていれば true を返す

Returns:

  • (Boolean)


497
498
499
500
# File 'lib/Miyako/API/input.rb', line 497

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

.mouse_xObject



444
445
446
# File 'lib/Miyako/API/input.rb', line 444

def Input::mouse_x
  return @@enable_mouse ? @@mouse[:pos][:x] : -1
end

.mouse_yObject



448
449
450
# File 'lib/Miyako/API/input.rb', line 448

def Input::mouse_y
  return @@enable_mouse ? @@mouse[:pos][:y] : -1
end

.process_active(e) ⇒ Object

:nodoc:



254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
# File 'lib/Miyako/API/input.rb', line 254

def Input::process_active(e) #:nodoc:
  if e.state & 1 == 1
    return unless @@enable_mouse
    @@mouse[:inner] = true
    @@mouse_inner = e.gain
  end
  if e.state & 2 == 2
    @@mouse[:focus] = true
    @@key_focus = e.gain
    [:left, :middle, :right].each{|key| @@mouse[:click][key] = false }
  end
  if e.state & 4 == 4
    @@mouse[:mini] = true
    @@app_minimize = !e.gain
  end
end

.process_default(e) ⇒ Object

:nodoc:



271
272
# File 'lib/Miyako/API/input.rb', line 271

def Input::process_default(e) #:nodoc:
end

.process_joyaxis(e) ⇒ Object

:nodoc:



187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/Miyako/API/input.rb', line 187

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:



210
211
212
213
# File 'lib/Miyako/API/input.rb', line 210

def Input::process_joybuttondown(e) #:nodoc:
  return unless @@enable_joypad
  set_btn(@@num2bsym[e.button]) if e.button < BTNS
end

.process_joybuttonup(e) ⇒ Object

:nodoc:



215
216
217
218
# File 'lib/Miyako/API/input.rb', line 215

def Input::process_joybuttonup(e) #:nodoc:
  return unless @@enable_joypad
  reset_btn(@@num2bsym[e.button]) if e.button < BTNS
end

.process_keydown(e) ⇒ Object

:nodoc:



175
176
177
178
179
# File 'lib/Miyako/API/input.rb', line 175

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:



181
182
183
184
185
# File 'lib/Miyako/API/input.rb', line 181

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:



228
229
230
231
232
233
234
235
236
237
# File 'lib/Miyako/API/input.rb', line 228

def Input::process_mousebuttondown(e) #:nodoc:
  return unless @@enable_mouse
  set_mouse_button(:trigger, e.button)
  return unless @@mouse_inner
  click_mouse_button(:click, e.button)
  set_mouse_button(:drag, e.button)
  @@mouse[:drag][:x] = @@mouse[:pos][:x]
  @@mouse[:drag][:y] = @@mouse[:pos][:y]
  @@click_start_tick = SDL.getTicks
end

.process_mousebuttonup(e) ⇒ Object

:nodoc:



239
240
241
242
243
244
245
246
247
248
249
250
251
252
# File 'lib/Miyako/API/input.rb', line 239

def Input::process_mousebuttonup(e) #:nodoc:
  return unless @@enable_mouse
  reset_mouse_button(:trigger, e.button)
  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.button == SDL::Mouse::BUTTON_LEFT)
    @@mouse[:drop][:middle]  = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_MIDDLE)
    @@mouse[:drop][:right]   = @@mouse[:drag][:left] and (e.button == 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:



220
221
222
223
224
225
226
# File 'lib/Miyako/API/input.rb', line 220

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:



171
172
173
# File 'lib/Miyako/API/input.rb', line 171

def Input::process_quit(e) #:nodoc:
  @@quit = true
end

.pushed_all?(*inputs) ⇒ Boolean

指定のボタンがすべて押されたかを問い合わせるメソッド

inputs

ボタンを示すシンボル。複数指定可能

((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)

返却値

すべて押されていれば true を返す

Returns:

  • (Boolean)

Raises:



364
365
366
367
# File 'lib/Miyako/API/input.rb', line 364

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_amountObject

ボタンが押された方向を取得する

方向キーが押された情報を、2要素の配列[x,y]で示す。

各要素の値は以下の通り。 x ・・・ -1:左、0:変化なし、1:右

y ・・・ -1:上、0:変化なし、1:下

返却値

移動方向を示す配列



400
401
402
403
404
# File 'lib/Miyako/API/input.rb', line 400

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 を返す

Returns:

  • (Boolean)


373
374
375
376
# File 'lib/Miyako/API/input.rb', line 373

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 を返す

Returns:

  • (Boolean)


409
410
411
# File 'lib/Miyako/API/input.rb', line 409

def Input::quit?
  return @@quit
end

.quit_or_escape?Boolean

ウィンドウの「×」ボタンか、エスケープキーが押されたかどうかを問い合わせる

返却値

「×」ボタンが押されてる、もしくはエスケープキーが押されていれば true を返す

Returns:

  • (Boolean)


421
422
423
# File 'lib/Miyako/API/input.rb', line 421

def Input::quit_or_escape?
  return @@quit || (@@btn[:pushed][:esc] == 1)
end

.reset_btn(n) ⇒ Object

:nodoc:



299
300
301
# File 'lib/Miyako/API/input.rb', line 299

def Input::reset_btn(n) #:nodoc:
  @@btn.each_key{|k| @@btn[k][n] = 0}
end

.reset_mouse_button(mode, btn) ⇒ Object

:nodoc:



286
287
288
289
290
# File 'lib/Miyako/API/input.rb', line 286

def Input::reset_mouse_button(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:



292
293
294
295
296
297
# File 'lib/Miyako/API/input.rb', line 292

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:



280
281
282
283
284
# File 'lib/Miyako/API/input.rb', line 280

def Input::set_mouse_button(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 を返す

Returns:

  • (Boolean)


591
592
593
# File 'lib/Miyako/API/input.rb', line 591

def Input::toggle_screen_mode?
  return @@toggle_screen_mode
end

.trigger_all?(*inputs) ⇒ Boolean

指定のボタンがすべて押下状態かを問い合わせるメソッド

inputs

ボタンを示すシンボル。複数指定可能

((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)

返却値

すべて押下状態ならば true を返す

Returns:

  • (Boolean)

Raises:



345
346
347
348
# File 'lib/Miyako/API/input.rb', line 345

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_amountObject

ボタンが押下状態にある方向を取得する

方向キーが押下状態にある情報を、2要素の配列[x,y]で示す。

各要素の値は以下の通り。 x ・・・ -1:左、0:変化なし、1:右

y ・・・ -1:上、0:変化なし、1:下

返却値

移動方向を示す配列



386
387
388
389
390
# File 'lib/Miyako/API/input.rb', line 386

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 を返す

Returns:

  • (Boolean)


355
356
357
358
# File 'lib/Miyako/API/input.rb', line 355

def Input::trigger_any?(*inputs)
  inputs = @@syms if inputs.length == 0
  return inputs.inject(false){|r, v| r |= (@@btn[:trigger][v] == 1)}
end

.updateObject

入力装置からの情報を更新する

必ず1回は呼び出す必要がある (特に、ゲームループの最初に呼び出す必要がある また、このメソッドを呼び出すのは必ずメインスレッドから呼び出すこと



307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
# File 'lib/Miyako/API/input.rb', line 307

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
  }
  @@mouse[:inner] = false
  @@mouse[:focus] = false
  @@mouse[:mini] = 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

.window_minimize?Boolean

マウスカーソルが画面の内側に有るかどうかを問い合わせる

返却値

マウスカーソルが画面内ならtrueを返す

Returns:

  • (Boolean)


556
557
558
# File 'lib/Miyako/API/input.rb', line 556

def Input::window_minimize?
  return @@app_minimize
end

.window_minimize_change?Boolean

マウスカーソルが画面の内側に有るかどうかを問い合わせる

返却値

マウスカーソルが画面内ならtrueを返す

Returns:

  • (Boolean)


575
576
577
# File 'lib/Miyako/API/input.rb', line 575

def Input::window_minimize_change?
  return @@mouse[:mini]
end