ruby-miyako 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/README +1115 -0
  2. data/Rakefile +7 -0
  3. data/defines.h +144 -0
  4. data/extconf.rb +44 -0
  5. data/extern.h +29 -0
  6. data/img/cursor.png +0 -0
  7. data/img/cursors.png +0 -0
  8. data/img/dice.png +0 -0
  9. data/img/wait_cursor.png +0 -0
  10. data/img/win_base.png +0 -0
  11. data/img/window.png +0 -0
  12. data/install_miyako.rb +87 -0
  13. data/lib/Miyako/API/audio.rb +584 -0
  14. data/lib/Miyako/API/basic_data.rb +1026 -0
  15. data/lib/Miyako/API/bitmap.rb +534 -0
  16. data/lib/Miyako/API/choices.rb +481 -0
  17. data/lib/Miyako/API/collision.rb +638 -0
  18. data/lib/Miyako/API/diagram.rb +586 -0
  19. data/lib/Miyako/API/drawing.rb +151 -0
  20. data/lib/Miyako/API/exceptions.rb +105 -0
  21. data/lib/Miyako/API/fixedmap.rb +462 -0
  22. data/lib/Miyako/API/font.rb +430 -0
  23. data/lib/Miyako/API/input.rb +456 -0
  24. data/lib/Miyako/API/layout.rb +644 -0
  25. data/lib/Miyako/API/map.rb +583 -0
  26. data/lib/Miyako/API/map_event.rb +222 -0
  27. data/lib/Miyako/API/modules.rb +357 -0
  28. data/lib/Miyako/API/movie.rb +166 -0
  29. data/lib/Miyako/API/parts.rb +188 -0
  30. data/lib/Miyako/API/plane.rb +205 -0
  31. data/lib/Miyako/API/screen.rb +341 -0
  32. data/lib/Miyako/API/shape.rb +443 -0
  33. data/lib/Miyako/API/sprite.rb +773 -0
  34. data/lib/Miyako/API/sprite_animation.rb +494 -0
  35. data/lib/Miyako/API/sprite_list.rb +1135 -0
  36. data/lib/Miyako/API/spriteunit.rb +168 -0
  37. data/lib/Miyako/API/story.rb +350 -0
  38. data/lib/Miyako/API/textbox.rb +773 -0
  39. data/lib/Miyako/API/utility.rb +419 -0
  40. data/lib/Miyako/API/viewport.rb +190 -0
  41. data/lib/Miyako/API/yuki.rb +1180 -0
  42. data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
  43. data/lib/Miyako/EXT/raster_scroll.rb +138 -0
  44. data/lib/Miyako/EXT/slides.rb +157 -0
  45. data/lib/Miyako/miyako.rb +201 -0
  46. data/lib/Miyako/miyako_require_only.rb +35 -0
  47. data/logo/EGSR_logo.png +0 -0
  48. data/logo/EGSR_logo_bg.png +0 -0
  49. data/logo/EGSR_logo_fg.png +0 -0
  50. data/logo/EGSR_title_banner.png +0 -0
  51. data/logo/EGSR_title_logo.png +0 -0
  52. data/logo/miyako.png +0 -0
  53. data/logo/miyako_banner.png +0 -0
  54. data/logo/space.png +0 -0
  55. data/miyako_basicdata.c +484 -0
  56. data/miyako_bitmap.c +1225 -0
  57. data/miyako_collision.c +403 -0
  58. data/miyako_drawing.c +187 -0
  59. data/miyako_font.c +334 -0
  60. data/miyako_hsv.c +830 -0
  61. data/miyako_input_audio.c +254 -0
  62. data/miyako_layout.c +191 -0
  63. data/miyako_no_katana.c +1086 -0
  64. data/miyako_sprite2.c +431 -0
  65. data/miyako_transform.c +438 -0
  66. data/miyako_utility.c +288 -0
  67. data/sample/Animation1/m1ku.rb +68 -0
  68. data/sample/Animation1/m1ku_arm_0.png +0 -0
  69. data/sample/Animation1/m1ku_arm_1.png +0 -0
  70. data/sample/Animation1/m1ku_arm_2.png +0 -0
  71. data/sample/Animation1/m1ku_arm_3.png +0 -0
  72. data/sample/Animation1/m1ku_back.jpg +0 -0
  73. data/sample/Animation1/m1ku_body.png +0 -0
  74. data/sample/Animation1/m1ku_eye_0.png +0 -0
  75. data/sample/Animation1/m1ku_eye_1.png +0 -0
  76. data/sample/Animation1/m1ku_eye_2.png +0 -0
  77. data/sample/Animation1/m1ku_eye_3.png +0 -0
  78. data/sample/Animation1/m1ku_hair_front.png +0 -0
  79. data/sample/Animation1/m1ku_hair_rear.png +0 -0
  80. data/sample/Animation1/readme.txt +72 -0
  81. data/sample/Animation2/lex.rb +96 -0
  82. data/sample/Animation2/lex_back.png +0 -0
  83. data/sample/Animation2/lex_body.png +0 -0
  84. data/sample/Animation2/lex_roadroller.png +0 -0
  85. data/sample/Animation2/lex_wheel_0.png +0 -0
  86. data/sample/Animation2/lex_wheel_1.png +0 -0
  87. data/sample/Animation2/lex_wheel_2.png +0 -0
  88. data/sample/Animation2/readme.txt +72 -0
  89. data/sample/Animation2/song_title.png +0 -0
  90. data/sample/Diagram_sample/back.png +0 -0
  91. data/sample/Diagram_sample/chr01.png +0 -0
  92. data/sample/Diagram_sample/chr02.png +0 -0
  93. data/sample/Diagram_sample/cursor.png +0 -0
  94. data/sample/Diagram_sample/diagram_sample_yuki2.rb +329 -0
  95. data/sample/Diagram_sample/readme.txt +90 -0
  96. data/sample/Diagram_sample/wait_cursor.png +0 -0
  97. data/sample/Room3/blue.rb +297 -0
  98. data/sample/Room3/ending.rb +180 -0
  99. data/sample/Room3/green.rb +220 -0
  100. data/sample/Room3/image/akamatsu.png +0 -0
  101. data/sample/Room3/image/aoyama.png +0 -0
  102. data/sample/Room3/image/congra.png +0 -0
  103. data/sample/Room3/image/congratulation.png +0 -0
  104. data/sample/Room3/image/congratulation_bg.png +0 -0
  105. data/sample/Room3/image/cursor.png +0 -0
  106. data/sample/Room3/image/midori.png +0 -0
  107. data/sample/Room3/image/mittsu_no_oheya.png +0 -0
  108. data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
  109. data/sample/Room3/image/room_blue.png +0 -0
  110. data/sample/Room3/image/room_green.png +0 -0
  111. data/sample/Room3/image/room_red.png +0 -0
  112. data/sample/Room3/image/start.png +0 -0
  113. data/sample/Room3/image/three_doors.png +0 -0
  114. data/sample/Room3/image/wait_cursor.png +0 -0
  115. data/sample/Room3/main.rb +120 -0
  116. data/sample/Room3/main_component.rb +59 -0
  117. data/sample/Room3/readme.txt +76 -0
  118. data/sample/Room3/red.rb +227 -0
  119. data/sample/Room3/room3.rb +25 -0
  120. data/sample/Room3/title.rb +184 -0
  121. data/sample/ball_action_sample.rb +204 -0
  122. data/sample/blit_rop.rb +70 -0
  123. data/sample/cairo_sample.rb +25 -0
  124. data/sample/circle_collision_test.rb +66 -0
  125. data/sample/collision_test.rb +33 -0
  126. data/sample/collision_test2.rb +108 -0
  127. data/sample/fixed_map_test/cursor.png +0 -0
  128. data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
  129. data/sample/fixed_map_test/map.csv +19 -0
  130. data/sample/fixed_map_test/map_01.png +0 -0
  131. data/sample/fixed_map_test/mapchip.csv +23 -0
  132. data/sample/fixed_map_test/monster.png +0 -0
  133. data/sample/fixed_map_test/readme.txt +72 -0
  134. data/sample/map_test/chara.rb +58 -0
  135. data/sample/map_test/chr1.png +0 -0
  136. data/sample/map_test/cursor.png +0 -0
  137. data/sample/map_test/main_parts.rb +69 -0
  138. data/sample/map_test/main_scene.rb +153 -0
  139. data/sample/map_test/map.png +0 -0
  140. data/sample/map_test/map2.png +0 -0
  141. data/sample/map_test/map_layer.csv +127 -0
  142. data/sample/map_test/map_manager.rb +75 -0
  143. data/sample/map_test/map_test.rb +23 -0
  144. data/sample/map_test/mapchip.csv +21 -0
  145. data/sample/map_test/oasis.rb +71 -0
  146. data/sample/map_test/readme.txt +89 -0
  147. data/sample/map_test/route.rb +157 -0
  148. data/sample/map_test/sea.png +0 -0
  149. data/sample/map_test/town.rb +74 -0
  150. data/sample/map_test/wait_cursor.png +0 -0
  151. data/sample/map_test/window.png +0 -0
  152. data/sample/polygon_test.rb +35 -0
  153. data/sample/rasterscroll.rb +25 -0
  154. data/sample/takahashi.rb +42 -0
  155. data/sample/text.png +0 -0
  156. data/sample/textbox_sample.rb +192 -0
  157. data/sample/transform.rb +54 -0
  158. data/sample/utility_test.rb +73 -0
  159. data/sample/utility_test2.rb +61 -0
  160. data/sample/utility_test3.rb +64 -0
  161. data/sample/utility_test4.rb +73 -0
  162. data/uninstall_miyako.rb +19 -0
  163. data/win/miyako_no_katana.so +0 -0
  164. metadata +216 -0
@@ -0,0 +1,456 @@
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.1
5
+ Copyright (C) 2007-2009 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
+ @@quit = false
46
+ @@toggle_screen_mode = true
47
+ @@click_start_tick = 0
48
+
49
+ @@syms = [:btn1, :btn2, :btn3, :btn4, :btn5, :btn6, :btn7, :btn8, :btn9, :btn10, :btn11, :btn12,
50
+ :down, :left, :right, :up, :spc, :ent, :esc, :alt, :ctl, :sft]
51
+
52
+ @@mods = [SDL::Key::MOD_LALT, SDL::Key::MOD_RALT, SDL::Key::MOD_LCTRL, SDL::Key::MOD_RCTRL,
53
+ SDL::Key::MOD_LSHIFT, SDL::Key::MOD_RSHIFT]
54
+
55
+ @@btn2sym = {SDL::Key::Z => :btn1, SDL::Key::X => :btn2, SDL::Key::C => :btn3,
56
+ SDL::Key::A => :btn4, SDL::Key::S => :btn5, SDL::Key::D => :btn6,
57
+ SDL::Key::Q => :btn7, SDL::Key::W => :btn8, SDL::Key::E => :btn9,
58
+ SDL::Key::V => :btn10, SDL::Key::B => :btn11, SDL::Key::N => :btn12,
59
+ SDL::Key::KP2 => :down, SDL::Key::DOWN => :down,
60
+ SDL::Key::KP4 => :left, SDL::Key::LEFT => :left,
61
+ SDL::Key::KP6 => :right, SDL::Key::RIGHT => :right,
62
+ SDL::Key::KP8 => :up, SDL::Key::UP => :up,
63
+ SDL::Key::SPACE => :spc,
64
+ SDL::Key::RETURN => :ent,
65
+ SDL::Key::ESCAPE => :esc,
66
+ SDL::Key::MOD_LALT => :alt, SDL::Key::MOD_RALT => :alt,
67
+ SDL::Key::MOD_LCTRL => :ctl, SDL::Key::MOD_RCTRL => :ctl,
68
+ SDL::Key::MOD_LSHIFT => :sft, SDL::Key::MOD_RSHIFT => :sft}
69
+
70
+ @@num2bsym = [:btn1, :btn2, :btn3, :btn4, :btn5, :btn6,
71
+ :btn7, :btn8, :btn9, :btn10, :btn11, :btn12]
72
+
73
+ def Input::create_btns #:nodoc:
74
+ return {:btn1 => 0, :btn2 => 0, :btn3 => 0,
75
+ :btn4 => 0, :btn5 => 0, :btn6 => 0,
76
+ :btn7 => 0, :btn8 => 0, :btn9 => 0,
77
+ :btn10 => 0, :btn11 => 0, :btn12 => 0,
78
+ :down => 0, :left => 0, :right => 0, :up => 0,
79
+ :spc => 0, :ent => 0, :esc => 0,
80
+ :alt => 0, :ctl => 0, :sft => 0}
81
+ end
82
+
83
+ @@btn = {:trigger => create_btns,
84
+ :pushed => create_btns,
85
+ :pre => create_btns}
86
+
87
+ @@move_amount = [{:down => 0, :left => -1, :right => 1, :up => 0},
88
+ {:down => 1, :left => 0, :right => 0, :up => -1}]
89
+
90
+ @@process = {SDL::Event2::Active => lambda {|e| Input::process_active(e)},
91
+ SDL::Event2::Quit => lambda {|e| Input::process_quit(e)},
92
+ SDL::Event2::KeyDown => lambda {|e| Input::process_keydown(e)},
93
+ SDL::Event2::KeyUp => lambda {|e| Input::process_keyup(e)},
94
+ SDL::Event2::JoyAxis => lambda {|e| Input::process_joyaxis(e)},
95
+ SDL::Event2::JoyButtonDown => lambda {|e| Input::process_joybuttondown(e)},
96
+ SDL::Event2::JoyButtonUp => lambda {|e| Input::process_joybuttonup(e)},
97
+ SDL::Event2::MouseMotion => lambda {|e| Input::process_mousemotion(e)},
98
+ SDL::Event2::MouseButtonDown => lambda {|e| Input::process_mousebuttondown(e)},
99
+ SDL::Event2::MouseButtonUp => lambda {|e| Input::process_mousebuttonup(e)}}
100
+ @@process.default = lambda {|e| }
101
+
102
+ @@mouse = {:pos => {:x => 0, :y => 0, :dx => 0, :dy => 0},
103
+ :trigger => {:left => false, :middle => false, :right => false}, # 2008.06.11
104
+ :click => {:left => false, :middle => false, :right => false, :interval => 200},
105
+ :drag => {:left => false, :middle => false, :right => false, :x => 0, :y => 0},
106
+ :drop => {:left => false, :middle => false, :right => false, :succeed => true},
107
+ :inner => true}
108
+
109
+ @@initialized = false
110
+
111
+ #===入力部の初期化
112
+ #
113
+ def Input.init
114
+ raise MiyakoError, "Already initialized!" if @@initialized
115
+ @@joy = SDL::Joystick.open(0) if SDL::Joystick.num >= 1
116
+ @@initialized = true
117
+ end
118
+
119
+ def Input::process_quit(e) #:nodoc:
120
+ @@quit = true
121
+ end
122
+
123
+ def Input::process_keydown(e) #:nodoc:
124
+ set_btn(@@btn2sym[e.sym]) if @@btn2sym.include?(e.sym)
125
+ @@mods.each{|m| set_btn(@@btn2sym[m]) if e.mod & m == m}
126
+ end
127
+
128
+ def Input::process_keyup(e) #:nodoc:
129
+ reset_btn(@@btn2sym[e.sym]) if @@btn2sym.include?(e.sym)
130
+ @@mods.each{|m| reset_btn(@@btn2sym[m]) if e.mod & m == m}
131
+ end
132
+
133
+ def Input::process_joyaxis(e) #:nodoc:
134
+ if e.axis == 0
135
+ if e.value >= 16384
136
+ set_btn(:right)
137
+ elsif e.value < -16384
138
+ set_btn(:left)
139
+ else
140
+ reset_btn(:left)
141
+ reset_btn(:right)
142
+ end
143
+ elsif e.axis == 1
144
+ if e.value >= 16384
145
+ set_btn(:down)
146
+ elsif e.value < -16384
147
+ set_btn(:up)
148
+ else
149
+ reset_btn(:down)
150
+ reset_btn(:up)
151
+ end
152
+ end
153
+ end
154
+
155
+ def Input::process_joybuttondown(e) #:nodoc:
156
+ set_btn(@@num2bsym[e.button]) if e.button < BTNS
157
+ end
158
+
159
+ def Input::process_joybuttonup(e) #:nodoc:
160
+ reset_btn(@@num2bsym[e.button]) if e.button < BTNS
161
+ end
162
+
163
+ def Input::process_mousemotion(e) #:nodoc:
164
+ @@mouse[:pos][:x] = e.x
165
+ @@mouse[:pos][:y] = e.y
166
+ @@mouse[:pos][:dx] = e.xrel
167
+ @@mouse[:pos][:dy] = e.yrel
168
+ end
169
+
170
+ def Input::process_mousebuttondown(e) #:nodoc:
171
+ set_mouse_button(:trigger, e.button)
172
+ return unless @@mouse[:inner]
173
+ click_mouse_button(:click, e.button)
174
+ set_mouse_button(:drag, e.button)
175
+ @@mouse[:drag][:x] = @@mouse[:pos][:x]
176
+ @@mouse[:drag][:y] = @@mouse[:pos][:y]
177
+ @@click_start_tick = SDL.getTicks
178
+ end
179
+
180
+ def Input::process_mousebuttonup(e) #:nodoc:
181
+ reset_mouse_button(:trigger, e.button)
182
+ click_interval = SDL.getTicks - @@click_start_tick
183
+ if click_interval < @@mouse[:click][:interval]
184
+ [:left, :middle, :right].each{|b| @@mouse[:drag][b] = false }
185
+ else
186
+ @@mouse[:drop][:left] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_LEFT)
187
+ @@mouse[:drop][:middle] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_MIDDLE)
188
+ @@mouse[:drop][:right] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_RIGHT)
189
+ @@mouse[:drop][:succeed] = [:left,:middle,:right].inject(false){|r,i| r |= @@mouse[:drag][i]} && @@mouse[:inner]
190
+ [:left, :middle, :right].each{|b| @@mouse[:drag][b] = false }
191
+ end
192
+ end
193
+
194
+ def Input::process_active(e) #:nodoc:
195
+ @@mouse[:inner] = e.gain if e.state == 1
196
+ end
197
+
198
+ def Input::process_default(e) #:nodoc:
199
+ end
200
+
201
+ def Input::click_mouse_button(mode, btn) #:nodoc:
202
+ @@mouse[mode][:left] = (btn == SDL::Mouse::BUTTON_LEFT)
203
+ @@mouse[mode][:middle] = (btn == SDL::Mouse::BUTTON_MIDDLE)
204
+ @@mouse[mode][:right] = (btn == SDL::Mouse::BUTTON_RIGHT)
205
+ end
206
+
207
+ def Input::set_mouse_button(mode, btn) #:nodoc:
208
+ @@mouse[mode][:left] = (btn == SDL::Mouse::BUTTON_LEFT)
209
+ @@mouse[mode][:middle] = (btn == SDL::Mouse::BUTTON_MIDDLE)
210
+ @@mouse[mode][:right] = (btn == SDL::Mouse::BUTTON_RIGHT)
211
+ end
212
+
213
+ def Input::reset_mouse_button(mode, btn) #:nodoc:
214
+ @@mouse[mode][:left] = false if (btn == SDL::Mouse::BUTTON_LEFT)
215
+ @@mouse[mode][:middle] = false if (btn == SDL::Mouse::BUTTON_MIDDLE)
216
+ @@mouse[mode][:right] = false if (btn == SDL::Mouse::BUTTON_RIGHT)
217
+ end
218
+
219
+ def Input::set_btn(n) #:nodoc:
220
+ @@btn[:trigger][n] = 1
221
+ return if @@btn[:pre][n] == 1
222
+ @@btn[:pushed][n] = 1
223
+ @@btn[:pre][n] = 1
224
+ end
225
+
226
+ def Input::reset_btn(n) #:nodoc:
227
+ @@btn.each_key{|k| @@btn[k][n] = 0}
228
+ end
229
+
230
+ #===入力装置からの情報を更新する
231
+ #必ず1回は呼び出す必要がある
232
+ #(特に、ゲームループの最初に呼び出す必要がある
233
+ #また、このメソッドを呼び出すのは必ずメインスレッドから呼び出すこと
234
+ def Input::update
235
+ SDL::Joystick.updateAll
236
+ @@btn[:pushed].each_key{|p| @@btn[:pushed][p] = 0 }
237
+ [:dx, :dy].each{|e| @@mouse[:pos][e] = 0 }
238
+ [:left, :middle, :right].each{|e|
239
+ @@mouse[:click][e] = false
240
+ @@mouse[:drop][e] = false
241
+ }
242
+ e_list = []
243
+ while e = SDL::Event2.poll
244
+ e_list << e
245
+ end
246
+ e_list.reverse.each{|e|
247
+ @@process[e.class].call(e)
248
+ if @@btn[:trigger][:alt] == 1 && @@btn[:pushed][:ent]==1 && @@toggle_screen_mode
249
+ Screen.toggle_mode
250
+ @@btn[:trigger][:alt] = 0
251
+ @@btn[:pushed][:ent] = 0
252
+ end
253
+ }
254
+ end
255
+
256
+ #===指定のボタンがすべて押下状態かを問い合わせるメソッド
257
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
258
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)
259
+ #返却値:: すべて押下状態ならば true を返す
260
+ def Input::trigger_all?(*inputs)
261
+ raise MiyakoError, "No setting any buttons! : trigger_all?" if inputs.length == 0
262
+ return inputs.inject(false){|r, v| r &= (@@btn[:trigger][v] == 1)}
263
+ end
264
+
265
+ #===指定のボタンがどれかが押下状態かを問い合わせるメソッド
266
+ #引数を省略した場合は、「どれかのキーが押下状態か」を問い合わせる。
267
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
268
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている)。
269
+ #返却値:: どれかが押下状態ならば true を返す
270
+ def Input::trigger_any?(*inputs)
271
+ inputs = @@syms if inputs.length == 0
272
+ return inputs.inject(false){|r, v| r |= (@@btn[:trigger][v] == 1)}
273
+ end
274
+
275
+ #===指定のボタンがすべて押されたかを問い合わせるメソッド
276
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
277
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)
278
+ #返却値:: すべて押されていれば true を返す
279
+ def Input::pushed_all?(*inputs)
280
+ raise MiyakoError, "No setting any buttons! : trigger_any?" if inputs.length == 0
281
+ return inputs.inject(true){|r, v| r &= (@@btn[:pushed][v] == 1)}
282
+ end
283
+
284
+ #===指定のボタンのどれかが押されたかを問い合わせるメソッド
285
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
286
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている)
287
+ #返却値:: すべて押されていれば true を返す
288
+ def Input::pushed_any?(*inputs)
289
+ inputs = @@syms if inputs.length == 0
290
+ return inputs.inject(false){|r, v| r |= (@@btn[:pushed][v] == 1)}
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::trigger_amount
302
+ amt = [0, 0]
303
+ [:down, :left, :right, :up].each{|d| [0, 1].each{|n| amt[n] += @@btn[:trigger][d] * @@move_amount[n][d]} }
304
+ return amt
305
+ end
306
+
307
+ #===ボタンが押された方向を取得する
308
+ #方向キーが押された情報を、2要素の配列[x,y]で示す。
309
+ #
310
+ #各要素の値は以下の通り。
311
+ #x ・・・ -1:左、0:変化なし、1:右
312
+ #
313
+ #y ・・・ -1:上、0:変化なし、1:下
314
+ #返却値:: 移動方向を示す配列
315
+ def Input::pushed_amount
316
+ amt = [0, 0]
317
+ [:down, :left, :right, :up].each{|d| [0, 1].each{|n| amt[n] += @@btn[:pushed][d] * @@move_amount[n][d]} }
318
+ return amt
319
+ end
320
+
321
+ #===ウィンドウの「閉じる」ボタンが選択されたかどうかを問い合わせる
322
+ #Windowsの場合、ウィンドウ右上の「×」ボタンを押したときに相当
323
+ #返却値:: 「×」ボタンが押されていれば true を返す
324
+ def Input::quit?
325
+ return @@quit
326
+ end
327
+
328
+ #===エスケープキーが押されたかどうかを問い合わせる
329
+ #返却値:: エスケープキーが押されていれば true を返す
330
+ def Input::escape?
331
+ return (@@btn[:pushed][:esc] == 1)
332
+ end
333
+
334
+ #===ウィンドウの「×」ボタンか、エスケープキーが押されたかどうかを問い合わせる
335
+ #返却値:: 「×」ボタンが押されてる、もしくはエスケープキーが押されていれば true を返す
336
+ def Input::quit_or_escape?
337
+ return @@quit || (@@btn[:pushed][:esc] == 1)
338
+ end
339
+
340
+ #===マウスカーソルを表示する
341
+ def Input::mouse_cursor_show
342
+ SDL::Mouse.show
343
+ end
344
+
345
+ #===マウスカーソルを隠蔽する
346
+ def Input::mouse_cursor_hide
347
+ SDL::Mouse.hide
348
+ end
349
+
350
+ #===マウスの現在位置を取得する
351
+ #求める値は、{:x=>n,:y=>n}で示すハッシュとする
352
+ #原点は、画面領域の左上を{:x=>0,:y=>0}とする
353
+ #返却値:: マウスカーソルの位置を示すPoint構造体
354
+ def Input::get_mouse_position
355
+ return Point.new(@@mouse[:pos][:x],@@mouse[:pos][:y])
356
+ end
357
+
358
+ #===マウスの移動量を取得する
359
+ #求める値は、{:x=>n,:y=>n}で示すハッシュとする
360
+ #移動量は、右下方向を正とする
361
+ #返却値:: マウスカーソルの移動量を示すSize構造体
362
+ def Input::get_mouse_amount
363
+ return Size.new(@@mouse[:pos][:dx],@@mouse[:pos][:dy])
364
+ end
365
+
366
+ #===ボタンがクリックされたかを問い合わせるメソッド
367
+ #ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り
368
+ #このメソッドを呼び出した後、そのボタンの返却値は、Input.updateが呼ばれない限りfalseになることに注意。
369
+ #
370
+ #:left : 左ボタン
371
+ #:middle : 中ボタン(ホイールをクリック)
372
+ #:right : 右ボタン
373
+ #:any : 上記ボタンの少なくともどれか一つ
374
+ #
375
+ #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
376
+ #返却値:: ボタンが押されていれば true を返す
377
+ def Input::click?(btn)
378
+ btns = (btn == :any ? [:left, :middle, :right] : [btn])
379
+ ret = btns.inject(false){|r, f| r |= @@mouse[:click][f]}
380
+ return ret
381
+ end
382
+
383
+ #===ボタンが押されているかを問い合わせるメソッド
384
+ #ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り
385
+ #
386
+ #_:left_:: 左ボタン
387
+ #_:middle_:: 中ボタン(ホイールをクリック)
388
+ #_:right_:: 右ボタン
389
+ #_:any_:: 上記ボタンの少なくともどれか一つ
390
+ #
391
+ #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
392
+ #返却値:: ボタンが押されていれば true を返す
393
+ def Input::mouse_trigger?(btn)
394
+ return btn == :any ? (@@mouse[:trigger][:left] || @@mouse[:trigger][:middle] || @@mouse[:trigger][:right]) : @@mouse[:trigger][btn]
395
+ end
396
+
397
+ #===ドラッグアンドドロップが行われたかどうかを問い合わせる
398
+ #ドラッグアンドドロップした際に使ったボタンの問い合わせは、
399
+ #可変個数のシンボルで行う。指定できるボタンは以下の通り
400
+ #
401
+ #_:left_:: 左ボタン
402
+ #_:middle_:: 中ボタン(ホイールをクリック)
403
+ #_:right_:: 右ボタン
404
+ #_:any_:: 上記ボタンの少なくともどれか一つ
405
+ #
406
+ #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
407
+ #返却値:: ドラッグアンドドロップが成功していれば、true を返す
408
+ def Input::drag_and_drop?(btn)
409
+ return @@mouse[:drop][:succeed] && (btn == :any ? (@@mouse[:drop][:left] || @@mouse[:drop][:middle] || @@mouse[:drop][:right]) : @@mouse[:click][btn])
410
+ end
411
+
412
+ #===ドラッグアンドドロップされた範囲を取得する
413
+ #取得できる範囲は、以下のハッシュで取得できる。
414
+ #{:drag_x => ドラッグが行われた x 座標, :drag_y => ドラッグが行われた y 座標, :drop_x => ドロップが行われた x 座業, :drop_y => ドロップが行われた y 座標}
415
+ #返却値:: ドラッグアンドドロップが成功していれば、移動範囲を示すハッシュ、失敗していれば nil を返す
416
+ def Input::get_drag_and_drop_range
417
+ 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
418
+ end
419
+
420
+ #===ダブルクリックの間隔を取得する
421
+ #間隔は、ミリ秒単位で取得できる
422
+ #返却値:: ボタンのクリック間隔
423
+ def Input::click_interval
424
+ return @@mouse[:click][:interval]
425
+ end
426
+
427
+ #===ダブルクリックの間隔を設定する
428
+ #間隔は、ミリ秒単位で設定できる
429
+ #_v_:: ボタンのクリック間隔
430
+ def Input::click_interval=(v)
431
+ @@mouse[:click][:interval] = v
432
+ end
433
+
434
+ #===マウスカーソルが画面の内側に有るかどうかを問い合わせる
435
+ #返却値:: マウスカーソルが画面内ならtrueを返す
436
+ def Input::mouse_cursor_inner?
437
+ return @@mouse[:inner]
438
+ end
439
+
440
+ #===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えの可否を切り替える
441
+ def Input::enable_toggle_screen_mode
442
+ @@toggle_screen_mode = true
443
+ end
444
+
445
+ #===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えを不可にする
446
+ def Input::disenable_toggle_screen_mode
447
+ @@toggle_screen_mode = false
448
+ end
449
+
450
+ #===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えができるかどうかを問い合わせる
451
+ #返却値:: 切り替えができるときは true を返す
452
+ def Input::toggle_screen_mode?
453
+ return @@toggle_screen_mode
454
+ end
455
+ end
456
+ end