cyross-ruby-miyako 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. data/README +977 -0
  2. data/Rakefile +7 -0
  3. data/img/cursor.png +0 -0
  4. data/img/cursors.png +0 -0
  5. data/img/dice.png +0 -0
  6. data/img/wait_cursor.png +0 -0
  7. data/img/win_base.png +0 -0
  8. data/img/window.png +0 -0
  9. data/install_miyako.rb +75 -0
  10. data/lib/Miyako/API/audio.rb +198 -0
  11. data/lib/Miyako/API/basic_data.rb +431 -0
  12. data/lib/Miyako/API/bitmap.rb +35 -0
  13. data/lib/Miyako/API/choices.rb +308 -0
  14. data/lib/Miyako/API/collision.rb +444 -0
  15. data/lib/Miyako/API/diagram.rb +573 -0
  16. data/lib/Miyako/API/drawing.rb +110 -0
  17. data/lib/Miyako/API/fixedmap.rb +315 -0
  18. data/lib/Miyako/API/font.rb +384 -0
  19. data/lib/Miyako/API/input.rb +440 -0
  20. data/lib/Miyako/API/layout.rb +451 -0
  21. data/lib/Miyako/API/map.rb +403 -0
  22. data/lib/Miyako/API/map_event.rb +198 -0
  23. data/lib/Miyako/API/modules.rb +109 -0
  24. data/lib/Miyako/API/movie.rb +151 -0
  25. data/lib/Miyako/API/parts.rb +154 -0
  26. data/lib/Miyako/API/plane.rb +131 -0
  27. data/lib/Miyako/API/screen.rb +257 -0
  28. data/lib/Miyako/API/shape.rb +362 -0
  29. data/lib/Miyako/API/sprite.rb +338 -0
  30. data/lib/Miyako/API/sprite_animation.rb +461 -0
  31. data/lib/Miyako/API/spriteunit.rb +113 -0
  32. data/lib/Miyako/API/story.rb +224 -0
  33. data/lib/Miyako/API/textbox.rb +496 -0
  34. data/lib/Miyako/API/viewport.rb +435 -0
  35. data/lib/Miyako/API/yuki.rb +779 -0
  36. data/lib/Miyako/EXT/miyako_cairo.rb +60 -0
  37. data/lib/Miyako/EXT/raster_scroll.rb +138 -0
  38. data/lib/Miyako/EXT/slides.rb +136 -0
  39. data/lib/Miyako/miyako.rb +172 -0
  40. data/miyako.png +0 -0
  41. data/miyako_banner.png +0 -0
  42. data/miyako_no_katana/extconf.rb +34 -0
  43. data/miyako_no_katana/miyako_no_katana.c +3301 -0
  44. data/sample/Animation1/m1ku.rb +89 -0
  45. data/sample/Animation1/m1ku_arm_0.png +0 -0
  46. data/sample/Animation1/m1ku_arm_1.png +0 -0
  47. data/sample/Animation1/m1ku_arm_2.png +0 -0
  48. data/sample/Animation1/m1ku_arm_3.png +0 -0
  49. data/sample/Animation1/m1ku_back.jpg +0 -0
  50. data/sample/Animation1/m1ku_body.png +0 -0
  51. data/sample/Animation1/m1ku_eye_0.png +0 -0
  52. data/sample/Animation1/m1ku_eye_1.png +0 -0
  53. data/sample/Animation1/m1ku_eye_2.png +0 -0
  54. data/sample/Animation1/m1ku_eye_3.png +0 -0
  55. data/sample/Animation1/m1ku_hair_front.png +0 -0
  56. data/sample/Animation1/m1ku_hair_rear.png +0 -0
  57. data/sample/Animation1/readme.txt +72 -0
  58. data/sample/Animation2/lex.rb +95 -0
  59. data/sample/Animation2/lex_back.png +0 -0
  60. data/sample/Animation2/lex_body.png +0 -0
  61. data/sample/Animation2/lex_roadroller.png +0 -0
  62. data/sample/Animation2/lex_wheel_0.png +0 -0
  63. data/sample/Animation2/lex_wheel_1.png +0 -0
  64. data/sample/Animation2/lex_wheel_2.png +0 -0
  65. data/sample/Animation2/readme.txt +72 -0
  66. data/sample/Animation2/song_title.png +0 -0
  67. data/sample/Diagram_sample/back.png +0 -0
  68. data/sample/Diagram_sample/chr01.png +0 -0
  69. data/sample/Diagram_sample/chr02.png +0 -0
  70. data/sample/Diagram_sample/cursor.png +0 -0
  71. data/sample/Diagram_sample/diagram_sample_yuki2.rb +283 -0
  72. data/sample/Diagram_sample/readme.txt +87 -0
  73. data/sample/Diagram_sample/wait_cursor.png +0 -0
  74. data/sample/Room3/blue.rb +250 -0
  75. data/sample/Room3/ending.rb +175 -0
  76. data/sample/Room3/green.rb +185 -0
  77. data/sample/Room3/image/akamatsu.png +0 -0
  78. data/sample/Room3/image/aoyama.png +0 -0
  79. data/sample/Room3/image/congra.png +0 -0
  80. data/sample/Room3/image/congratulation.png +0 -0
  81. data/sample/Room3/image/congratulation_bg.png +0 -0
  82. data/sample/Room3/image/cursor.png +0 -0
  83. data/sample/Room3/image/midori.png +0 -0
  84. data/sample/Room3/image/mittsu_no_oheya.png +0 -0
  85. data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
  86. data/sample/Room3/image/room_blue.png +0 -0
  87. data/sample/Room3/image/room_green.png +0 -0
  88. data/sample/Room3/image/room_red.png +0 -0
  89. data/sample/Room3/image/start.png +0 -0
  90. data/sample/Room3/image/three_doors.png +0 -0
  91. data/sample/Room3/image/wait_cursor.png +0 -0
  92. data/sample/Room3/main.rb +102 -0
  93. data/sample/Room3/main_component.rb +58 -0
  94. data/sample/Room3/readme.txt +76 -0
  95. data/sample/Room3/red.rb +200 -0
  96. data/sample/Room3/room3.rb +26 -0
  97. data/sample/Room3/title.rb +171 -0
  98. data/sample/fixed_map_test/cursor.png +0 -0
  99. data/sample/fixed_map_test/fixed_map_sample.rb +149 -0
  100. data/sample/fixed_map_test/map.csv +19 -0
  101. data/sample/fixed_map_test/map_01.png +0 -0
  102. data/sample/fixed_map_test/map_sample.rb +121 -0
  103. data/sample/fixed_map_test/mapchip.csv +23 -0
  104. data/sample/fixed_map_test/monster.png +0 -0
  105. data/sample/fixed_map_test/readme.txt +72 -0
  106. data/sample/map_test/chara.rb +50 -0
  107. data/sample/map_test/chr1.png +0 -0
  108. data/sample/map_test/cursor.png +0 -0
  109. data/sample/map_test/main_parts.rb +48 -0
  110. data/sample/map_test/main_scene.rb +137 -0
  111. data/sample/map_test/map.png +0 -0
  112. data/sample/map_test/map2.png +0 -0
  113. data/sample/map_test/map_layer.csv +127 -0
  114. data/sample/map_test/map_manager.rb +92 -0
  115. data/sample/map_test/map_test.rb +23 -0
  116. data/sample/map_test/mapchip.csv +21 -0
  117. data/sample/map_test/oasis.rb +65 -0
  118. data/sample/map_test/readme.txt +87 -0
  119. data/sample/map_test/route.rb +144 -0
  120. data/sample/map_test/sea.png +0 -0
  121. data/sample/map_test/town.rb +68 -0
  122. data/sample/map_test/wait_cursor.png +0 -0
  123. data/sample/map_test/window.png +0 -0
  124. data/win/miyako_no_katana.so +0 -0
  125. metadata +194 -0
@@ -0,0 +1,440 @@
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.0
5
+ Copyright (C) 2007-2008 Cyross Makoto
6
+
7
+ This library is free software; you can redistribute it and/or
8
+ modify it under the terms of the GNU Lesser General Public
9
+ License as published by the Free Software Foundation; either
10
+ version 2.1 of the License, or (at your option) any later version.
11
+
12
+ This library is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ Lesser General Public License for more details.
16
+
17
+ You should have received a copy of the GNU Lesser General Public
18
+ License along with this library; if not, write to the Free Software
19
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ ++
21
+ =end
22
+
23
+ module Miyako
24
+
25
+ #==入力管理モジュール
26
+ #本モジュールでは、キーボードやマウス、ゲームパッドなどの入力装置からの情報を管理する。
27
+ #メソッドのほとんどは、「押されたかどうか」などの問い合わせメソッドで構成されている。
28
+ #本モジュールでは、以下のボタンが使用可能。キー(ボタン)すべてシンボルとして定義
29
+ #:btn1 ~ :btn12: ゲームパッドの 1~12 に対応するボタン、もしくはキーボード上の z~n、a~hの各ボタンに対応
30
+ #:down,:left,:right,up: ゲームパッドの方向ボタンとキーボードの方向キーに対応
31
+ #:spc: スペースバーに対応
32
+ #:ent: Enterキーに対応
33
+ #:esc: エスケープキーに対応
34
+ #:alt: Altキー(左右)に対応
35
+ #:ctl: コントロールキー(左右)に対応
36
+ #:sft: シフトキー(左右)に対応
37
+ #
38
+ #また、本モジュールのメソッドに "trigger", "pushed" の2つのメソッドがあるが、
39
+ #"trigger"系メソッドは、「押されていたら常にtrue」を示すのに対して、
40
+ #"pushed"系メソッドは、「押した瞬間のみtrue、次の更新(Input.update)の時以降は、
41
+ #ボタンを放して再び押されるまでfalse」という機能を持つ
42
+ module Input
43
+ BTNS = 12 # 使用するボタン数(ボタン1〜ボタン12)
44
+ @@joy = nil
45
+ @@joy = SDL::Joystick.open(0) if SDL::Joystick.num >= 1
46
+ @@quit = false
47
+ @@toggle_screen_mode = true
48
+ @@click_start_tick = 0
49
+
50
+ @@syms = [:btn1, :btn2, :btn3, :btn4, :btn5, :btn6, :btn7, :btn8, :btn9, :btn10, :btn11, :btn12,
51
+ :down, :left, :right, :up, :spc, :ent, :esc, :alt, :ctl, :sft]
52
+
53
+ @@mods = [SDL::Key::MOD_LALT, SDL::Key::MOD_RALT, SDL::Key::MOD_LCTRL, SDL::Key::MOD_RCTRL,
54
+ SDL::Key::MOD_LSHIFT, SDL::Key::MOD_RSHIFT]
55
+
56
+ @@btn2sym = {SDL::Key::Z => :btn1, SDL::Key::X => :btn2, SDL::Key::C => :btn3,
57
+ SDL::Key::A => :btn4, SDL::Key::S => :btn5, SDL::Key::D => :btn6,
58
+ SDL::Key::Q => :btn7, SDL::Key::W => :btn8, SDL::Key::E => :btn9,
59
+ SDL::Key::V => :btn10, SDL::Key::B => :btn11, SDL::Key::N => :btn12,
60
+ SDL::Key::KP2 => :down, SDL::Key::DOWN => :down,
61
+ SDL::Key::KP4 => :left, SDL::Key::LEFT => :left,
62
+ SDL::Key::KP6 => :right, SDL::Key::RIGHT => :right,
63
+ SDL::Key::KP8 => :up, SDL::Key::UP => :up,
64
+ SDL::Key::SPACE => :spc,
65
+ SDL::Key::RETURN => :ent,
66
+ SDL::Key::ESCAPE => :esc,
67
+ SDL::Key::MOD_LALT => :alt, SDL::Key::MOD_RALT => :alt,
68
+ SDL::Key::MOD_LCTRL => :ctl, SDL::Key::MOD_RCTRL => :ctl,
69
+ SDL::Key::MOD_LSHIFT => :sft, SDL::Key::MOD_RSHIFT => :sft}
70
+
71
+ @@num2bsym = [:btn1, :btn2, :btn3, :btn4, :btn5, :btn6,
72
+ :btn7, :btn8, :btn9, :btn10, :btn11, :btn12]
73
+
74
+ def Input::create_btns #:nodoc:
75
+ return {:btn1 => 0, :btn2 => 0, :btn3 => 0,
76
+ :btn4 => 0, :btn5 => 0, :btn6 => 0,
77
+ :btn7 => 0, :btn8 => 0, :btn9 => 0,
78
+ :btn10 => 0, :btn11 => 0, :btn12 => 0,
79
+ :down => 0, :left => 0, :right => 0, :up => 0,
80
+ :spc => 0, :ent => 0, :esc => 0,
81
+ :alt => 0, :ctl => 0, :sft => 0}
82
+ end
83
+
84
+ @@btn = {:trigger => create_btns,
85
+ :pushed => create_btns,
86
+ :pre => create_btns}
87
+
88
+ @@move_amount = [{:down => 0, :left => -1, :right => 1, :up => 0},
89
+ {:down => 1, :left => 0, :right => 0, :up => -1}]
90
+
91
+ @@process = {SDL::Event2::Active => lambda {|e| Input::process_active(e)},
92
+ SDL::Event2::Quit => lambda {|e| Input::process_quit(e)},
93
+ SDL::Event2::KeyDown => lambda {|e| Input::process_keydown(e)},
94
+ SDL::Event2::KeyUp => lambda {|e| Input::process_keyup(e)},
95
+ SDL::Event2::JoyAxis => lambda {|e| Input::process_joyaxis(e)},
96
+ SDL::Event2::JoyButtonDown => lambda {|e| Input::process_joybuttondown(e)},
97
+ SDL::Event2::JoyButtonUp => lambda {|e| Input::process_joybuttonup(e)},
98
+ SDL::Event2::MouseMotion => lambda {|e| Input::process_mousemotion(e)},
99
+ SDL::Event2::MouseButtonDown => lambda {|e| Input::process_mousebuttondown(e)},
100
+ SDL::Event2::MouseButtonUp => lambda {|e| Input::process_mousebuttonup(e)}}
101
+ @@process.default = lambda {|e| }
102
+
103
+ @@mouse = {:pos => {:x => 0, :y => 0, :dx => 0, :dy => 0},
104
+ :trigger => {:left => false, :middle => false, :right => false}, # 2008.06.11
105
+ :click => {:left => false, :middle => false, :right => false, :interval => 200},
106
+ :drag => {:left => false, :middle => false, :right => false, :x => 0, :y => 0},
107
+ :drop => {:left => false, :middle => false, :right => false, :succeed => true},
108
+ :inner => true}
109
+
110
+ def Input::process_quit(e) #:nodoc:
111
+ @@quit = true
112
+ end
113
+
114
+ def Input::process_keydown(e) #:nodoc:
115
+ set_btn(@@btn2sym[e.sym]) if @@btn2sym.include?(e.sym)
116
+ @@mods.each{|m| set_btn(@@btn2sym[m]) if e.mod & m == m}
117
+ end
118
+
119
+ def Input::process_keyup(e) #:nodoc:
120
+ reset_btn(@@btn2sym[e.sym]) if @@btn2sym.include?(e.sym)
121
+ @@mods.each{|m| reset_btn(@@btn2sym[m]) if e.mod & m == m}
122
+ end
123
+
124
+ def Input::process_joyaxis(e) #:nodoc:
125
+ if e.axis == 0
126
+ if e.value >= 16384
127
+ set_btn(:right)
128
+ elsif e.value < -16384
129
+ set_btn(:left)
130
+ else
131
+ reset_btn(:left)
132
+ reset_btn(:right)
133
+ end
134
+ elsif e.axis == 1
135
+ if e.value >= 16384
136
+ set_btn(:down)
137
+ elsif e.value < -16384
138
+ set_btn(:up)
139
+ else
140
+ reset_btn(:down)
141
+ reset_btn(:up)
142
+ end
143
+ end
144
+ end
145
+
146
+ def Input::process_joybuttondown(e) #:nodoc:
147
+ set_btn(@@num2bsym[e.button]) if e.button < BTNS
148
+ end
149
+
150
+ def Input::process_joybuttonup(e) #:nodoc:
151
+ reset_btn(@@num2bsym[e.button]) if e.button < BTNS
152
+ end
153
+
154
+ def Input::process_mousemotion(e) #:nodoc:
155
+ @@mouse[:pos][:x] = e.x
156
+ @@mouse[:pos][:y] = e.y
157
+ @@mouse[:pos][:dx] = e.xrel
158
+ @@mouse[:pos][:dy] = e.yrel
159
+ end
160
+
161
+ def Input::process_mousebuttondown(e) #:nodoc:
162
+ set_mouse_button(:trigger, e.button)
163
+ set_mouse_button(:click, e.button)
164
+ return unless @@mouse[:inner]
165
+ set_mouse_button(:drag, e.button)
166
+ @@mouse[:drag][:x] = @@mouse[:pos][:x]
167
+ @@mouse[:drag][:y] = @@mouse[:pos][:y]
168
+ @@click_start_tick = SDL.getTicks
169
+ end
170
+
171
+ def Input::process_mousebuttonup(e) #:nodoc:
172
+ reset_mouse_button(:trigger, e.button)
173
+ click_interval = SDL.getTicks - @@click_start_tick
174
+ if click_interval < @@mouse[:click][:interval]
175
+ set_mouse_button(:click, e.button)
176
+ [:left, :middle, :right].each{|b| @@mouse[:drag][b] = false }
177
+ else
178
+ @@mouse[:drop][:left] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_LEFT)
179
+ @@mouse[:drop][:middle] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_MIDDLE)
180
+ @@mouse[:drop][:right] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_RIGHT)
181
+ @@mouse[:drop][:succeed] = [:left,:middle,:right].inject(false){|r,i| r |= @@mouse[:drag][i]} && @@mouse[:inner]
182
+ [:left, :middle, :right].each{|b| @@mouse[:drag][b] = false }
183
+ end
184
+ end
185
+
186
+ def Input::process_active(e) #:nodoc:
187
+ @@mouse[:inner] = e.gain if e.state == 1
188
+ end
189
+
190
+ def Input::process_default(e) #:nodoc:
191
+ end
192
+
193
+ def Input::set_mouse_button(mode, btn) #:nodoc:
194
+ @@mouse[mode][:left] = (btn == SDL::Mouse::BUTTON_LEFT)
195
+ @@mouse[mode][:middle] = (btn == SDL::Mouse::BUTTON_MIDDLE)
196
+ @@mouse[mode][:right] = (btn == SDL::Mouse::BUTTON_RIGHT)
197
+ end
198
+
199
+ def Input::reset_mouse_button(mode, btn) #:nodoc:
200
+ @@mouse[mode][:left] = false if (btn == SDL::Mouse::BUTTON_LEFT)
201
+ @@mouse[mode][:middle] = false if (btn == SDL::Mouse::BUTTON_MIDDLE)
202
+ @@mouse[mode][:right] = false if (btn == SDL::Mouse::BUTTON_RIGHT)
203
+ end
204
+
205
+ def Input::set_btn(n) #:nodoc:
206
+ @@btn[:trigger][n] = 1
207
+ return if @@btn[:pre][n] == 1
208
+ @@btn[:pushed][n] = 1
209
+ @@btn[:pre][n] = 1
210
+ end
211
+
212
+ def Input::reset_btn(n) #:nodoc:
213
+ @@btn.each_key{|k| @@btn[k][n] = 0}
214
+ end
215
+
216
+ #===入力装置からの情報を更新する
217
+ #必ず1回は呼び出す必要がある
218
+ #(特に、ゲームループの最初に呼び出す必要がある
219
+ #また、このメソッドを呼び出すのは必ずメインスレッドから呼び出すこと
220
+ def Input::update
221
+ SDL::Joystick.updateAll
222
+ @@btn[:pushed].each_key{|p| @@btn[:pushed][p] = 0 }
223
+ [:dx, :dy].each{|e| @@mouse[:pos][e] = 0 }
224
+ [:left, :middle, :right].each{|e|
225
+ @@mouse[:click][e] = false
226
+ @@mouse[:drop][e] = false
227
+ }
228
+ e_list = []
229
+ while e = SDL::Event2.poll
230
+ e_list << e
231
+ end
232
+ e_list.reverse.each{|e|
233
+ @@process[e.class].call(e)
234
+ if @@btn[:trigger][:alt] & @@btn[:pushed][:ent]==1 and @@toggle_screen_mode
235
+ Screen.toggle_mode
236
+ @@btn[:trigger][:alt] = false
237
+ @@btn[:pushed][:ent] = 0
238
+ end
239
+ }
240
+ end
241
+
242
+ #===指定のボタンがすべて押下状態かを問い合わせるメソッド
243
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
244
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)
245
+ #返却値:: すべて押下状態ならば true を返す
246
+ def Input::trigger_all?(*inputs)
247
+ raise MiyakoError, "No setting any buttons! : trigger_all?" if inputs.length == 0
248
+ return inputs.inject(false){|r, v| r &= (@@btn[:trigger][v] == 1)}
249
+ end
250
+
251
+ #===指定のボタンがどれかが押下状態かを問い合わせるメソッド
252
+ #引数を省略した場合は、「どれかのキーが押下状態か」を問い合わせる。
253
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
254
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている)。
255
+ #返却値:: どれかが押下状態ならば true を返す
256
+ def Input::trigger_any?(*inputs)
257
+ inputs = @@syms if inputs.length == 0
258
+ return inputs.inject(false){|r, v| r |= (@@btn[:trigger][v] == 1)}
259
+ end
260
+
261
+ #===指定のボタンがすべて押されたかを問い合わせるメソッド
262
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
263
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)
264
+ #返却値:: すべて押されていれば true を返す
265
+ def Input::pushed_all?(*inputs)
266
+ raise MiyakoError, "No setting any buttons! : trigger_any?" if inputs.length == 0
267
+ return inputs.inject(true){|r, v| r &= (@@btn[:pushed][v] == 1)}
268
+ end
269
+
270
+ #===指定のボタンのどれかが押されたかを問い合わせるメソッド
271
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
272
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている)
273
+ #返却値:: すべて押されていれば true を返す
274
+ def Input::pushed_any?(*inputs)
275
+ inputs = @@syms if inputs.length == 0
276
+ return inputs.inject(false){|r, v| r |= (@@btn[:pushed][v] == 1)}
277
+ end
278
+
279
+ #===ボタンが押下状態にある方向を取得する
280
+ #方向キーが押下状態にある情報を、2要素の配列[x,y]で示す。
281
+ #
282
+ #各要素の値は以下の通り。
283
+ #x ・・・ -1:左、0:変化なし、1:右
284
+ #
285
+ #y ・・・ -1:上、0:変化なし、1:下
286
+ #返却値:: 移動方向を示す配列
287
+ def Input::trigger_amount
288
+ amt = [0, 0]
289
+ [:down, :left, :right, :up].each{|d| [0, 1].each{|n| amt[n] += @@btn[:trigger][d] * @@move_amount[n][d]} }
290
+ return amt
291
+ end
292
+
293
+ #===ボタンが押された方向を取得する
294
+ #方向キーが押された情報を、2要素の配列[x,y]で示す。
295
+ #
296
+ #各要素の値は以下の通り。
297
+ #x ・・・ -1:左、0:変化なし、1:右
298
+ #
299
+ #y ・・・ -1:上、0:変化なし、1:下
300
+ #返却値:: 移動方向を示す配列
301
+ def Input::pushed_amount
302
+ amt = [0, 0]
303
+ [:down, :left, :right, :up].each{|d| [0, 1].each{|n| amt[n] += @@btn[:pushed][d] * @@move_amount[n][d]} }
304
+ return amt
305
+ end
306
+
307
+ #===ウィンドウの「閉じる」ボタンが選択されたかどうかを問い合わせる
308
+ #Windowsの場合、ウィンドウ右上の「×」ボタンを押したときに相当
309
+ #返却値:: 「×」ボタンが押されていれば true を返す
310
+ def Input::quit?
311
+ return @@quit
312
+ end
313
+
314
+ #===エスケープキーが押されたかどうかを問い合わせる
315
+ #返却値:: エスケープキーが押されていれば true を返す
316
+ def Input::escape?
317
+ return (@@btn[:pushed][:esc] == 1)
318
+ end
319
+
320
+ #===ウィンドウの「×」ボタンか、エスケープキーが押されたかどうかを問い合わせる
321
+ #返却値:: 「×」ボタンが押されてる、もしくはエスケープキーが押されていれば true を返す
322
+ def Input::quit_or_escape?
323
+ return @@quit || (@@btn[:pushed][:esc] == 1)
324
+ end
325
+
326
+ #===マウスカーソルを表示する
327
+ def Input::mouse_cursor_show
328
+ SDL::Mouse.show
329
+ end
330
+
331
+ #===マウスカーソルを隠蔽する
332
+ def Input::mouse_cursor_hide
333
+ SDL::Mouse.hide
334
+ end
335
+
336
+ #===マウスの現在位置を取得する
337
+ #求める値は、{:x=>n,:y=>n}で示すハッシュとする
338
+ #原点は、画面領域の左上を{:x=>0,:y=>0}とする
339
+ #返却値:: マウスカーソルの位置を示すハッシュ
340
+ def Input::get_mouse_position
341
+ return {:x => @@mouse[:pos][:x], :y => @@mouse[:pos][:y]}
342
+ end
343
+
344
+ #===マウスの移動量を取得する
345
+ #求める値は、{:x=>n,:y=>n}で示すハッシュとする
346
+ #移動量は、右下方向を正とする
347
+ #返却値:: マウスカーソルの移動量を示すハッシュ
348
+ def Input::get_mouse_amount
349
+ return {:dx => @@mouse[:pos][:dx], :dy => @@mouse[:pos][:dy]}
350
+ end
351
+
352
+ #===ボタンがクリックされたかを問い合わせるメソッド
353
+ #ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り
354
+ #
355
+ #:left : 左ボタン
356
+ #:middle : 中ボタン(ホイールをクリック)
357
+ #:right : 右ボタン
358
+ #:any : 上記ボタンの少なくともどれか一つ
359
+ #
360
+ #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
361
+ #返却値:: ボタンが押されていれば true を返す
362
+ def Input::click?(btn)
363
+ return btn == :any ? (@@mouse[:click][:left] || @@mouse[:click][:middle] || @@mouse[:click][:right]) : @@mouse[:click][btn]
364
+ end
365
+
366
+ #===ボタンが押されているかを問い合わせるメソッド
367
+ #ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り
368
+ #
369
+ #:left : 左ボタン
370
+ #:middle : 中ボタン(ホイールをクリック)
371
+ #:right : 右ボタン
372
+ #:any : 上記ボタンの少なくともどれか一つ
373
+ #
374
+ #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
375
+ #返却値:: ボタンが押されていれば true を返す
376
+ def Input::mouse_trigger?(btn)
377
+ return btn == :any ? (@@mouse[:trigger][:left] || @@mouse[:trigger][:middle] || @@mouse[:trigger][:right]) : @@mouse[:trigger][btn]
378
+ end
379
+
380
+ #===ドラッグアンドドロップが行われたかどうかを問い合わせる
381
+ #ドラッグアンドドロップした際に使ったボタンの問い合わせは、
382
+ #可変個数のシンボルで行う。指定できるボタンは以下の通り
383
+ #
384
+ #:left : 左ボタン
385
+ #:middle : 中ボタン(ホイールをクリック)
386
+ #:right : 右ボタン
387
+ #:any : 上記ボタンの少なくともどれか一つ
388
+ #
389
+ #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
390
+ #返却値:: ドラッグアンドドロップが成功していれば、true を返す
391
+ def Input::drag_and_drop?(btn)
392
+ return @@mouse[:drop][:succeed] && (btn == :any ? (@@mouse[:drop][:left] || @@mouse[:drop][:middle] || @@mouse[:drop][:right]) : @@mouse[:click][btn])
393
+ end
394
+
395
+ #===ドラッグアンドドロップされた範囲を取得する
396
+ #取得できる範囲は、以下のハッシュで取得できる。
397
+ #{:drag_x => ドラッグが行われた x 座標, :drag_y => ドラッグが行われた y 座標, :drop_x => ドロップが行われた x 座業, :drop_y => ドロップが行われた y 座標}
398
+ #返却値:: ドラッグアンドドロップが成功していれば、移動範囲を示すハッシュ、失敗していれば nil を返す
399
+ def Input::get_drag_and_drop_range
400
+ 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
401
+ end
402
+
403
+ #===ダブルクリックの間隔を取得する
404
+ #間隔は、ミリ秒単位で取得できる
405
+ #返却値:: ボタンのクリック間隔
406
+ def Input::click_interval
407
+ return @@mouse[:click][:interval]
408
+ end
409
+
410
+ #===ダブルクリックの間隔を設定する
411
+ #間隔は、ミリ秒単位で設定できる
412
+ #_v_:: ボタンのクリック間隔
413
+ def Input::click_interval=(v)
414
+ @@mouse[:click][:interval] = v
415
+ end
416
+
417
+ #===ダブルクリックの間隔を設定する
418
+ #間隔は、ミリ秒単位で設定できる
419
+ #_v_:: ボタンのクリック間隔
420
+ def Input::mouse_cursor_inner?
421
+ return @@mouse[:inner]
422
+ end
423
+
424
+ #===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えの可否を切り替える
425
+ def Input::enable_toggle_screen_mode
426
+ @@toggle_screen_mode = true
427
+ end
428
+
429
+ #===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えを不可にする
430
+ def Input::disenable_toggle_screen_mode
431
+ @@toggle_screen_mode = false
432
+ end
433
+
434
+ #===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えができるかどうかを問い合わせる
435
+ #返却値:: 切り替えができるときは true を返す
436
+ def Input::toggle_screen_mode?
437
+ return @@toggle_screen_mode
438
+ end
439
+ end
440
+ end