cyross-ruby-miyako-mswin32 2.0.5

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 (145) hide show
  1. data/README +929 -0
  2. data/img/cursor.png +0 -0
  3. data/img/cursors.png +0 -0
  4. data/img/dice.png +0 -0
  5. data/img/wait_cursor.png +0 -0
  6. data/img/win_base.png +0 -0
  7. data/img/window.png +0 -0
  8. data/install_miyako.rb +61 -0
  9. data/lib/Miyako/API/audio.rb +198 -0
  10. data/lib/Miyako/API/basic_data.rb +573 -0
  11. data/lib/Miyako/API/bitmap.rb +507 -0
  12. data/lib/Miyako/API/choices.rb +475 -0
  13. data/lib/Miyako/API/collision.rb +460 -0
  14. data/lib/Miyako/API/diagram.rb +561 -0
  15. data/lib/Miyako/API/drawing.rb +151 -0
  16. data/lib/Miyako/API/fixedmap.rb +428 -0
  17. data/lib/Miyako/API/font.rb +403 -0
  18. data/lib/Miyako/API/input.rb +447 -0
  19. data/lib/Miyako/API/layout.rb +433 -0
  20. data/lib/Miyako/API/map.rb +529 -0
  21. data/lib/Miyako/API/map_event.rb +198 -0
  22. data/lib/Miyako/API/modules.rb +109 -0
  23. data/lib/Miyako/API/movie.rb +154 -0
  24. data/lib/Miyako/API/parts.rb +189 -0
  25. data/lib/Miyako/API/plane.rb +166 -0
  26. data/lib/Miyako/API/screen.rb +325 -0
  27. data/lib/Miyako/API/shape.rb +443 -0
  28. data/lib/Miyako/API/sprite.rb +752 -0
  29. data/lib/Miyako/API/sprite_animation.rb +481 -0
  30. data/lib/Miyako/API/spriteunit.rb +147 -0
  31. data/lib/Miyako/API/story.rb +300 -0
  32. data/lib/Miyako/API/textbox.rb +725 -0
  33. data/lib/Miyako/API/utility.rb +388 -0
  34. data/lib/Miyako/API/viewport.rb +140 -0
  35. data/lib/Miyako/API/yuki.rb +996 -0
  36. data/lib/Miyako/EXT/miyako_cairo.rb +62 -0
  37. data/lib/Miyako/EXT/raster_scroll.rb +138 -0
  38. data/lib/Miyako/EXT/slides.rb +157 -0
  39. data/lib/Miyako/miyako.rb +171 -0
  40. data/lib/Miyako/miyako_no_katana.so +0 -0
  41. data/logo/EGSR_logo.png +0 -0
  42. data/logo/EGSR_logo_bg.png +0 -0
  43. data/logo/EGSR_logo_fg.png +0 -0
  44. data/logo/EGSR_title_banner.png +0 -0
  45. data/logo/EGSR_title_logo.png +0 -0
  46. data/logo/miyako.png +0 -0
  47. data/logo/miyako_banner.png +0 -0
  48. data/logo/space.png +0 -0
  49. data/sample/Animation1/m1ku.rb +68 -0
  50. data/sample/Animation1/m1ku_arm_0.png +0 -0
  51. data/sample/Animation1/m1ku_arm_1.png +0 -0
  52. data/sample/Animation1/m1ku_arm_2.png +0 -0
  53. data/sample/Animation1/m1ku_arm_3.png +0 -0
  54. data/sample/Animation1/m1ku_back.jpg +0 -0
  55. data/sample/Animation1/m1ku_body.png +0 -0
  56. data/sample/Animation1/m1ku_eye_0.png +0 -0
  57. data/sample/Animation1/m1ku_eye_1.png +0 -0
  58. data/sample/Animation1/m1ku_eye_2.png +0 -0
  59. data/sample/Animation1/m1ku_eye_3.png +0 -0
  60. data/sample/Animation1/m1ku_hair_front.png +0 -0
  61. data/sample/Animation1/m1ku_hair_rear.png +0 -0
  62. data/sample/Animation1/readme.txt +72 -0
  63. data/sample/Animation2/lex.rb +96 -0
  64. data/sample/Animation2/lex_back.png +0 -0
  65. data/sample/Animation2/lex_body.png +0 -0
  66. data/sample/Animation2/lex_roadroller.png +0 -0
  67. data/sample/Animation2/lex_wheel_0.png +0 -0
  68. data/sample/Animation2/lex_wheel_1.png +0 -0
  69. data/sample/Animation2/lex_wheel_2.png +0 -0
  70. data/sample/Animation2/readme.txt +72 -0
  71. data/sample/Animation2/song_title.png +0 -0
  72. data/sample/Diagram_sample/back.png +0 -0
  73. data/sample/Diagram_sample/chr01.png +0 -0
  74. data/sample/Diagram_sample/chr02.png +0 -0
  75. data/sample/Diagram_sample/cursor.png +0 -0
  76. data/sample/Diagram_sample/diagram_sample_yuki2.rb +387 -0
  77. data/sample/Diagram_sample/readme.txt +90 -0
  78. data/sample/Diagram_sample/wait_cursor.png +0 -0
  79. data/sample/Room3/blue.rb +297 -0
  80. data/sample/Room3/ending.rb +180 -0
  81. data/sample/Room3/green.rb +220 -0
  82. data/sample/Room3/image/akamatsu.png +0 -0
  83. data/sample/Room3/image/aoyama.png +0 -0
  84. data/sample/Room3/image/congra.png +0 -0
  85. data/sample/Room3/image/congratulation.png +0 -0
  86. data/sample/Room3/image/congratulation_bg.png +0 -0
  87. data/sample/Room3/image/cursor.png +0 -0
  88. data/sample/Room3/image/midori.png +0 -0
  89. data/sample/Room3/image/mittsu_no_oheya.png +0 -0
  90. data/sample/Room3/image/mittsu_no_oheya_logo.png +0 -0
  91. data/sample/Room3/image/room_blue.png +0 -0
  92. data/sample/Room3/image/room_green.png +0 -0
  93. data/sample/Room3/image/room_red.png +0 -0
  94. data/sample/Room3/image/start.png +0 -0
  95. data/sample/Room3/image/three_doors.png +0 -0
  96. data/sample/Room3/image/wait_cursor.png +0 -0
  97. data/sample/Room3/main.rb +120 -0
  98. data/sample/Room3/main_component.rb +59 -0
  99. data/sample/Room3/readme.txt +76 -0
  100. data/sample/Room3/red.rb +227 -0
  101. data/sample/Room3/room3.rb +27 -0
  102. data/sample/Room3/title.rb +184 -0
  103. data/sample/ball_action_sample.rb +204 -0
  104. data/sample/blit_rop.rb +70 -0
  105. data/sample/cairo_sample.rb +25 -0
  106. data/sample/circle_collision_test.rb +62 -0
  107. data/sample/collision_test.rb +33 -0
  108. data/sample/collision_test2.rb +104 -0
  109. data/sample/fixed_map_test/cursor.png +0 -0
  110. data/sample/fixed_map_test/fixed_map_sample.rb +140 -0
  111. data/sample/fixed_map_test/map.csv +19 -0
  112. data/sample/fixed_map_test/map_01.png +0 -0
  113. data/sample/fixed_map_test/mapchip.csv +23 -0
  114. data/sample/fixed_map_test/monster.png +0 -0
  115. data/sample/fixed_map_test/readme.txt +72 -0
  116. data/sample/map_test/chara.rb +58 -0
  117. data/sample/map_test/chr1.png +0 -0
  118. data/sample/map_test/cursor.png +0 -0
  119. data/sample/map_test/main_parts.rb +69 -0
  120. data/sample/map_test/main_scene.rb +153 -0
  121. data/sample/map_test/map.png +0 -0
  122. data/sample/map_test/map2.png +0 -0
  123. data/sample/map_test/map_layer.csv +127 -0
  124. data/sample/map_test/map_manager.rb +75 -0
  125. data/sample/map_test/map_test.rb +23 -0
  126. data/sample/map_test/mapchip.csv +21 -0
  127. data/sample/map_test/oasis.rb +71 -0
  128. data/sample/map_test/readme.txt +89 -0
  129. data/sample/map_test/route.rb +157 -0
  130. data/sample/map_test/sea.png +0 -0
  131. data/sample/map_test/town.rb +74 -0
  132. data/sample/map_test/wait_cursor.png +0 -0
  133. data/sample/map_test/window.png +0 -0
  134. data/sample/polygon_test.rb +35 -0
  135. data/sample/rasterscroll.rb +25 -0
  136. data/sample/takahashi.rb +42 -0
  137. data/sample/text.png +0 -0
  138. data/sample/textbox_sample.rb +190 -0
  139. data/sample/transform.rb +54 -0
  140. data/sample/utility_test.rb +73 -0
  141. data/sample/utility_test2.rb +61 -0
  142. data/sample/utility_test3.rb +64 -0
  143. data/sample/utility_test4.rb +73 -0
  144. data/uninstall_miyako.rb +19 -0
  145. metadata +196 -0
@@ -0,0 +1,403 @@
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.0
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
+ # フォント関連クラス(群)
24
+ module Miyako
25
+
26
+ =begin rdoc
27
+ ==フォント管理クラス
28
+ フォントは、等幅フォント奨励(プロポーショナルフォントを選ぶと、文字が正しく描画されない可能性あり)
29
+ =end
30
+ class Font
31
+ extend Forwardable
32
+
33
+ # OS_MAC_OS_X = "mac_osx"
34
+ # ORG_ENC = "UTF-8"
35
+ # NEW_ENC = "UTF-8-MAC"
36
+
37
+ attr_reader :size, :line_skip, :height, :ascent, :descent
38
+ attr_accessor :color, :use_shadow, :shadow_color, :shadow_margin, :vspace, :hspace
39
+
40
+ @@font_cache = {}
41
+
42
+ @@name_2_font_path = Hash.new
43
+
44
+ @@font_base_path = Hash.new
45
+ @@font_base_path["win"] = ENV['SystemRoot'] ? ["./", ENV['SystemRoot'].tr("\\", "/") + "/fonts/"] : ["./"]
46
+ @@font_base_path["linux"] = ["./", "/usr/share/fonts/", "/usr/X11R6/lib/X11/fonts/"]
47
+ @@font_base_path["mac_osx"] = ["./", "~/Library/Fonts/", "/Library/Fonts/", "/System/Library/Fonts/",
48
+ "/ライブラリ/Fonts/", "/システム/ライブラリ/Fonts/"]
49
+
50
+ @@font_base_name = Hash.new
51
+ @@font_base_name["win"] = [{:serif=>"msmincho.ttc", :sans_serif=>"msgothic.ttc"},
52
+ {:serif=>"VL-Gothic-Regular.ttf", :sans_serif=>"VL-Gothic-Regular.ttf"},
53
+ {:serif=>"umeplus-gothic.ttf", :sans_serif=>"umeplus-gothic.ttf"},
54
+ {:serif=>"msmincho.ttc", :sans_serif=>"meiryo.ttc"}]
55
+ @@font_base_name["linux"] = [{:serif=>"sazanami-mincho.ttf", :sans_serif=>"sazanami-gothic.ttf"},
56
+ {:serif=>"VL-Gothic-Regular.ttf", :sans_serif=>"VL-Gothic-Regular.ttf"},
57
+ {:serif=>"umeplus-gothic.ttf", :sans_serif=>"umeplus-gothic.ttf"}]
58
+ @@font_base_name["mac_osx"] = [{:serif=>"Hiragino Mincho Pro W3.otf", :sans_serif=>"Hiragino Kaku Gothic Pro W3.otf"},
59
+ {:serif=>"Hiragino Mincho Pro W6.otf", :sans_serif=>"Hiragino Kaku Gothic Pro W6.otf"},
60
+ {:serif=>"ヒラギノ明朝 Pro W3.otf", :sans_serif=>"ヒラギノ角ゴ Pro W3.otf"},
61
+ {:serif=>"ヒラキ゛ノ明朝 Pro W3.otf", :sans_serif=>"ヒラキ゛ノ角コ゛ Pro W3.otf"},
62
+ {:serif=>"ヒラギノ明朝 Pro W6.otf", :sans_serif=>"ヒラギノ角ゴ Pro W6.otf"},
63
+ {:serif=>"ヒラキ゛ノ明朝 Pro W6.otf", :sans_serif=>"ヒラキ゛ノ角コ゛ Pro W6.otf"},
64
+ {:serif=>"VL-Gothic-Regular.ttf", :sans_serif=>"VL-Gothic-Regular.ttf"},
65
+ {:serif=>"umeplus-gothic.ttf", :sans_serif=>"umeplus-gothic.ttf"}]
66
+
67
+ def Font.search_font_path_file(hash, path) #:nodoc:
68
+ Dir.glob(path+"*"){|d|
69
+ hash = Font.search_font_path_file(hash, d+"/") if test(?d, d)
70
+ d = d.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
71
+ d = d.tr("\\", "\/")
72
+ hash[$1] = d if (d =~ /\/([^\/\.]+\.tt[fc])\z/ || d =~ /\/([^\/\.]+\.otf)\z/) # MacOSX対応
73
+ }
74
+ return hash
75
+ end
76
+
77
+ def Font.create_font_path #:nodoc:
78
+ osn = Miyako::getOSName
79
+ @@font_base_path[osn].each{|path|
80
+ path = path.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
81
+ path = path.tr("\\", "\/")
82
+ @@name_2_font_path = Font.search_font_path_file(@@name_2_font_path, path)
83
+ }
84
+ end
85
+
86
+ def Font.findFontPath(fname) #:nodoc:
87
+ fname = fname.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
88
+ return @@name_2_font_path.fetch(fname, nil)
89
+ end
90
+
91
+ def Font.get_font_inner(fname, fpath, size=16) #:nodoc:
92
+ if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
93
+ fname = fname.encode(Encoding::UTF_8)
94
+ fpath = fpath.encode(Encoding::UTF_8)
95
+ end
96
+ @@font_cache[fname] ||= {}
97
+ @@font_cache[fname][size] ||= SDL::TTF.open(fpath, size)
98
+ return @@font_cache[fname][size]
99
+ end
100
+
101
+ def init_height #:nodoc:
102
+ @line_skip = @font.line_skip
103
+ @height = @font.height
104
+ @ascent = @font.ascent
105
+ @descent = @font.descent
106
+ end
107
+
108
+ private :init_height
109
+
110
+ #===インスタンス生成
111
+ #指定したフォントファイル名から、フォントインスタンスを生成する。
112
+ #フォントファイルのパスは、Miyako2.0起動時にファイルパス(カレントディレクトリとシステムのフォントディレクトリ)を
113
+ #再帰的に検索し、先に見つけた方を採用する(同一ファイル名がカレントディレクトリとシステムのディレクトリに両方
114
+ #存在するときは、カレントディレクトリを優先する)
115
+ #そのため、フォントファイル名は、パスを指定する必要がない(逆に言うと、パスを指定すると例外が発生する)。
116
+ #_fname_:: フォントファイル名(フォントファミリー名不可)。パス指定不可
117
+ #_size_:: フォントの大きさ。単位はピクセル。デフォルトは 16
118
+ #返却値:: 生成されたインスタンスを返す
119
+ def initialize(fname, size=16)
120
+ @size = size
121
+ @color = [255, 255, 255]
122
+ @fname = fname
123
+ @vspace = 0
124
+ @hspace = 0
125
+ @bold = false
126
+ @italic = false
127
+ @under_line = false
128
+ @fpath = Font.findFontPath(@fname) or raise MiyakoError, "Cannot Find Font! : #{@fname}"
129
+ @font = Font.get_font_inner(@fname, @fpath, @size)
130
+ @font.style = SDL::TTF::STYLE_NORMAL
131
+ init_height
132
+ @use_shadow = false
133
+ @shadow_color = [128, 128, 128]
134
+ @shadow_margin = [2, 2]
135
+ @unit = SpriteUnitFactory.create
136
+ end
137
+
138
+ #===フォントの大きさを変更する
139
+ #_sz_:: 変更するフォントの大きさ(単位:ピクセル)
140
+ #返却値:: 変更されたフォントのインスタンス
141
+ def size=(sz)
142
+ @size = sz
143
+ @font = Font.get_font_inner(@fname, @fpath, @size)
144
+ @font.style = (@bold ? SDL::TTF::STYLE_BOLD : 0) | (@italic ? SDL::TTF::STYLE_ITALIC : 0) | (@under_line ? SDL::TTF::STYLE_UNDERLINE : 0)
145
+ init_height
146
+ return self
147
+ end
148
+
149
+ #===ブロック評価中のみ、フォントの大きさを変更する
150
+ #_sz_:: 変更するフォントの大きさ(単位:ピクセル)
151
+ #返却値:: 自分自身を返す
152
+ def size_during(sz)
153
+ raise MiyakoError, "not given block!" unless block_given?
154
+ tsize = @size
155
+ self.size = sz
156
+ yield
157
+ self.size = tsize
158
+ return self
159
+ end
160
+
161
+ #===ブロック評価中のみ、フォントの文字の色を変更する
162
+ #_color_:: 変更する色([r,g,b]の3要素の配列(値:0~255))
163
+ #返却値:: 自分自身を返す
164
+ def color_during(color)
165
+ raise MiyakoError, "not given block!" unless block_given?
166
+ tcolor, self.color = @color, color
167
+ yield
168
+ self.color = tcolor
169
+ return self
170
+ end
171
+
172
+ #===ブロック評価中のみ、影文字文字の色・マージンを変更する
173
+ #また、ブロック評価中は影文字が強制的に有効になる
174
+ #_color_:: 変更する色([r,g,b]の3要素の配列(値:0~255))、デフォルトはFont#shadow_colorメソッドの値([128,128,128])
175
+ #_margin_:: 変更する色(2要素の整数の配列、デフォルトはFont#shadow_marginメソッドの値([2,2])
176
+ #返却値:: 自分自身を返す
177
+ def shadow_during(color = @shadow_color, margin = @shadow_margin)
178
+ raise MiyakoError, "not given block!" unless block_given?
179
+ tflag, @use_shadow = @use_shadow, true
180
+ tcolor, @shadow_color = @shadow_color, color
181
+ tmargin, @shadow_margin = @shadow_margin, margin
182
+ yield
183
+ @use_shadow = tflag
184
+ @shadow_color = tcolor
185
+ @shadow_margin = tmargin
186
+ return self
187
+ end
188
+
189
+ #===指定したピクセル数のフォントが十分(欠けることなく)収まるピクセル数を取得する
190
+ #_size_:: フォントの大きさ(単位:ピクセル)
191
+ #返却値:: 算出されたピクセル数
192
+ def get_fit_size(size)
193
+ path = Font.findFontPath(@fname)
194
+ font = SDL::TTF.open(path, size)
195
+ return (size.to_f * (size.to_f / font.line_skip.to_f)).to_i
196
+ end
197
+
198
+ #===フォントサイズ(yやjなどの下にはみ出る箇所も算出)を取得する
199
+ #返却値:: 算出されたフォントサイズ
200
+ def line_height
201
+ return @line_skip + @vspace + (@use_shadow ? @shadow_margin[1] : 0)
202
+ end
203
+
204
+ #===フォントインスタンスを解放する
205
+ def dispose
206
+ @font = nil
207
+ end
208
+
209
+ #===フォントの属性をbold(太文字)に設定する
210
+ #ブロックを渡したときは、ブロック評価中のみ太字になる
211
+ #文字が領域外にはみ出る場合があるので注意!
212
+ #返却値:: 自分自身
213
+ def bold
214
+ if block_given?
215
+ tbold, self.bold = self.bold?, true
216
+ yield
217
+ self.bold = tbold
218
+ else
219
+ self.bold = true
220
+ end
221
+ return self
222
+ end
223
+
224
+ #===フォントのbold属性の有無を返す
225
+ #返却値:: bold属性かどうか(true/false)
226
+ def bold?
227
+ return @bold
228
+ end
229
+
230
+ #===フォントのbold属性を設定する
231
+ #_f_:: bold属性かどうか(true/false)
232
+ def bold=(f)
233
+ @bold = f
234
+ @font.style |= SDL::TTF::STYLE_BOLD
235
+ @font.style -= SDL::TTF::STYLE_BOLD unless @bold
236
+ return self
237
+ end
238
+
239
+ #===フォントの属性をitalic(斜め)に設定する
240
+ #ブロックを渡したときは、ブロック評価中のみ斜体文字になる
241
+ #文字が領域外にはみ出る場合があるので注意!
242
+ #返却値:: 自分自身
243
+ def italic
244
+ if block_given?
245
+ titalic, self.italic = self.italic?, true
246
+ yield
247
+ self.italic = titalic
248
+ else
249
+ self.italic = true
250
+ end
251
+ return self
252
+ end
253
+
254
+ #===フォントのitalic属性の有無を返す
255
+ #返却値:: italic属性かどうか(true/false)
256
+ def italic?
257
+ return @italic
258
+ end
259
+
260
+ #===フォントのitalic属性を設定する
261
+ #_f_:: italic属性かどうか(true/false)
262
+ def italic=(f)
263
+ @italic = f
264
+ @font.style |= SDL::TTF::STYLE_ITALIC
265
+ @font.style -= SDL::TTF::STYLE_ITALIC unless @italic
266
+ return self
267
+ end
268
+
269
+ #===フォントの属性をunder_line(下線)に設定する
270
+ #ブロックを渡したときは、ブロック評価中のみ下線付き文字になる
271
+ #返却値:: 自分自身
272
+ def under_line
273
+ if block_given?
274
+ tunder_line, self.under_line = self.under_line?, true
275
+ yield
276
+ self.under_line = tunder_line
277
+ else
278
+ self.under_line = true
279
+ end
280
+ return self
281
+ end
282
+
283
+ #===フォントのunder_line属性の有無を返す
284
+ #返却値:: under_line属性かどうか(true/false)
285
+ def under_line?
286
+ return @under_line
287
+ end
288
+
289
+ #===フォントのunder_line属性を設定する
290
+ #_f_:: under_line属性かどうか(true/false)
291
+ def under_line=(f)
292
+ @under_line = f
293
+ @font.style |= SDL::TTF::STYLE_UNDERLINE
294
+ @font.style -= SDL::TTF::STYLE_UNDERLINE unless @under_line
295
+ return self
296
+ end
297
+
298
+ #===フォントの属性をすべてクリアする
299
+ #_f_:: 自分自身
300
+ def normal
301
+ @font.style = 0
302
+ return self
303
+ end
304
+
305
+ #===文字列を描画する
306
+ #対象のスプライトに文字列を描画する
307
+ #_dst_:: 描画先スプライト
308
+ #_str_:: 描画する文字列
309
+ #_x_:: 描画位置x軸
310
+ #_y_:: 描画位置Y軸
311
+ def draw_text(dst, str, x, y)
312
+ str = str.encode(Encoding::UTF_8)
313
+ str.chars{|c|
314
+ if @use_shadow
315
+ src2 = @font.renderBlendedUTF8(c, @shadow_color[0], @shadow_color[1], @shadow_color[2])
316
+ if src2
317
+ SpriteUnitFactory.apply(@unit, {:bitmap=>src2, :ow=>src2.w, :oh=>src2.h})
318
+ Miyako::Bitmap.blit_aa(@unit, dst.to_unit, x+@shadow_margin[0], y+@shadow_margin[1])
319
+ else
320
+ break x
321
+ end
322
+ end
323
+ src = @font.renderBlendedUTF8(c, @color[0], @color[1], @color[2])
324
+ if src
325
+ SpriteUnitFactory.apply(@unit, {:bitmap=>src, :ow=>src.w, :oh=>src.h})
326
+ Miyako::Bitmap.blit_aa(@unit, dst.to_unit, x, y)
327
+ else
328
+ break x
329
+ end
330
+ x += chr_size_inner(c)
331
+ }
332
+ return x
333
+ end
334
+
335
+ #===文字列描画したときの大きさを取得する
336
+ #現在のフォントの設定で指定の文字列を描画したとき、予想される描画サイズを返す。実際に描画は行われない。
337
+ #_txt_:: 算出したい文字列
338
+ #返却値:: 文字列を描画したときの大きさ([w,h]の配列)
339
+ def chr_size_inner(char)
340
+ return (char.bytesize == 1 ? @size >> 1 : @size) + (@use_shadow ? @shadow_margin[0] : 0) + @hspace
341
+ end
342
+
343
+ private :chr_size_inner
344
+
345
+ #===文字列描画したときの大きさを取得する
346
+ #現在のフォントの設定で指定の文字列を描画したとき、予想される描画サイズを返す。実際に描画は行われない。
347
+ #_txt_:: 算出したい文字列
348
+ #返却値:: 文字列を描画したときの大きさ([w,h]の配列)
349
+ def text_size(txt)
350
+ width = txt.chars.inject(0){|r, c|
351
+ r += (c.bytesize == 1 ? @size >> 1 : @size) } +
352
+ ((@use_shadow ? @shadow_margin[0] : 0) + @hspace) * (txt.chars.to_a.length - 1)
353
+ return [width, self.line_height]
354
+ end
355
+
356
+ #===指定した高さで描画する際のマージンを求める
357
+ #現在のフォントの設定で指定の文字列を描画したとき、予想される描画サイズを返す。実際に描画は行われない。
358
+ #第1引数に渡す"align"は、以下の3種類のシンボルのどれかを渡す
359
+ #:top:: 上側に描画(マージンはゼロ)
360
+ #:middle:: 中間に描画
361
+ #:bottom:: 下部に描画
362
+ #
363
+ #_align_:: 描画位置
364
+ #_height_:: 描画する高さ
365
+ #返却値:: マージンの値
366
+ def margin_height(align, height)
367
+ case align
368
+ when :top
369
+ return 0
370
+ when :middle
371
+ return (height - self.line_height) >> 1
372
+ when :bottom
373
+ return height - self.line_height
374
+ end
375
+ #else
376
+ raise MiyakoError, "Illegal margin_height align! : #{align}"
377
+ end
378
+
379
+ Font.create_font_path
380
+
381
+ #===Serifフォント(明朝フォント)を取得する
382
+ #マルチプラットフォームのソフトを作る際、OS間の差異を吸収するため、
383
+ #共通の名称でフォントインスタンスを取得するときに使う(主に明朝フォント)
384
+ #返却値:: OSごとに設定されたフォントイン寸タンス(フォントサイズは16)
385
+ def Font::serif
386
+ filename = @@font_base_name[Miyako::getOSName].detect{|base| Font.findFontPath(base[:serif]) }[:serif]
387
+ return Font.new(filename)
388
+ end
389
+
390
+ #===Sans Serifフォント(ゴシックフォント)を取得する
391
+ #マルチプラットフォームのソフトを作る際、OS間の差異を吸収するため、
392
+ #共通の名称でフォントインスタンスを取得するときに使う(主にゴシックフォント)
393
+ #返却値:: OSごとに設定されたフォントイン寸タンス(フォントサイズは16)
394
+ def Font::sans_serif
395
+ filename = @@font_base_name[Miyako::getOSName].detect{|base| Font.findFontPath(base[:sans_serif]) }[:sans_serif]
396
+ return Font.new(filename)
397
+ end
398
+
399
+ def Font::system_font #:nodoc:
400
+ return Font.serif
401
+ end
402
+ end
403
+ end
@@ -0,0 +1,447 @@
1
+ # -*- encoding: utf-8 -*-
2
+ =begin
3
+ --
4
+ Miyako v2.0
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
+ @@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
+ return unless @@mouse[:inner]
164
+ click_mouse_button(:click, e.button)
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
+ [:left, :middle, :right].each{|b| @@mouse[:drag][b] = false }
176
+ else
177
+ @@mouse[:drop][:left] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_LEFT)
178
+ @@mouse[:drop][:middle] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_MIDDLE)
179
+ @@mouse[:drop][:right] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_RIGHT)
180
+ @@mouse[:drop][:succeed] = [:left,:middle,:right].inject(false){|r,i| r |= @@mouse[:drag][i]} && @@mouse[:inner]
181
+ [:left, :middle, :right].each{|b| @@mouse[:drag][b] = false }
182
+ end
183
+ end
184
+
185
+ def Input::process_active(e) #:nodoc:
186
+ @@mouse[:inner] = e.gain if e.state == 1
187
+ end
188
+
189
+ def Input::process_default(e) #:nodoc:
190
+ end
191
+
192
+ def Input::click_mouse_button(mode, btn) #:nodoc:
193
+ @@mouse[mode][:left] = (btn == SDL::Mouse::BUTTON_LEFT)
194
+ @@mouse[mode][:middle] = (btn == SDL::Mouse::BUTTON_MIDDLE)
195
+ @@mouse[mode][:right] = (btn == SDL::Mouse::BUTTON_RIGHT)
196
+ end
197
+
198
+ def Input::set_mouse_button(mode, btn) #:nodoc:
199
+ @@mouse[mode][:left] = (btn == SDL::Mouse::BUTTON_LEFT)
200
+ @@mouse[mode][:middle] = (btn == SDL::Mouse::BUTTON_MIDDLE)
201
+ @@mouse[mode][:right] = (btn == SDL::Mouse::BUTTON_RIGHT)
202
+ end
203
+
204
+ def Input::reset_mouse_button(mode, btn) #:nodoc:
205
+ @@mouse[mode][:left] = false if (btn == SDL::Mouse::BUTTON_LEFT)
206
+ @@mouse[mode][:middle] = false if (btn == SDL::Mouse::BUTTON_MIDDLE)
207
+ @@mouse[mode][:right] = false if (btn == SDL::Mouse::BUTTON_RIGHT)
208
+ end
209
+
210
+ def Input::set_btn(n) #:nodoc:
211
+ @@btn[:trigger][n] = 1
212
+ return if @@btn[:pre][n] == 1
213
+ @@btn[:pushed][n] = 1
214
+ @@btn[:pre][n] = 1
215
+ end
216
+
217
+ def Input::reset_btn(n) #:nodoc:
218
+ @@btn.each_key{|k| @@btn[k][n] = 0}
219
+ end
220
+
221
+ #===入力装置からの情報を更新する
222
+ #必ず1回は呼び出す必要がある
223
+ #(特に、ゲームループの最初に呼び出す必要がある
224
+ #また、このメソッドを呼び出すのは必ずメインスレッドから呼び出すこと
225
+ def Input::update
226
+ SDL::Joystick.updateAll
227
+ @@btn[:pushed].each_key{|p| @@btn[:pushed][p] = 0 }
228
+ [:dx, :dy].each{|e| @@mouse[:pos][e] = 0 }
229
+ [:left, :middle, :right].each{|e|
230
+ @@mouse[:click][e] = false
231
+ @@mouse[:drop][e] = false
232
+ }
233
+ e_list = []
234
+ while e = SDL::Event2.poll
235
+ e_list << e
236
+ end
237
+ e_list.reverse.each{|e|
238
+ @@process[e.class].call(e)
239
+ if @@btn[:trigger][:alt] & @@btn[:pushed][:ent]==1 and @@toggle_screen_mode
240
+ Screen.toggle_mode
241
+ @@btn[:trigger][:alt] = false
242
+ @@btn[:pushed][:ent] = 0
243
+ end
244
+ }
245
+ end
246
+
247
+ #===指定のボタンがすべて押下状態かを問い合わせるメソッド
248
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
249
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)
250
+ #返却値:: すべて押下状態ならば true を返す
251
+ def Input::trigger_all?(*inputs)
252
+ raise MiyakoError, "No setting any buttons! : trigger_all?" if inputs.length == 0
253
+ return inputs.inject(false){|r, v| r &= (@@btn[:trigger][v] == 1)}
254
+ end
255
+
256
+ #===指定のボタンがどれかが押下状態かを問い合わせるメソッド
257
+ #引数を省略した場合は、「どれかのキーが押下状態か」を問い合わせる。
258
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
259
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている)。
260
+ #返却値:: どれかが押下状態ならば true を返す
261
+ def Input::trigger_any?(*inputs)
262
+ inputs = @@syms if inputs.length == 0
263
+ return inputs.inject(false){|r, v| r |= (@@btn[:trigger][v] == 1)}
264
+ end
265
+
266
+ #===指定のボタンがすべて押されたかを問い合わせるメソッド
267
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
268
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1とボタン2が押されている)
269
+ #返却値:: すべて押されていれば true を返す
270
+ def Input::pushed_all?(*inputs)
271
+ raise MiyakoError, "No setting any buttons! : trigger_any?" if inputs.length == 0
272
+ return inputs.inject(true){|r, v| r &= (@@btn[:pushed][v] == 1)}
273
+ end
274
+
275
+ #===指定のボタンのどれかが押されたかを問い合わせるメソッド
276
+ #_inputs_:: ボタンを示すシンボル。複数指定可能
277
+ #((例)Input.trigger_all?(:btn1, :btn2) #ボタン1かボタン2、もしくはその両方が押されている)
278
+ #返却値:: すべて押されていれば true を返す
279
+ def Input::pushed_any?(*inputs)
280
+ inputs = @@syms if inputs.length == 0
281
+ return inputs.inject(false){|r, v| r |= (@@btn[:pushed][v] == 1)}
282
+ end
283
+
284
+ #===ボタンが押下状態にある方向を取得する
285
+ #方向キーが押下状態にある情報を、2要素の配列[x,y]で示す。
286
+ #
287
+ #各要素の値は以下の通り。
288
+ #x ・・・ -1:左、0:変化なし、1:右
289
+ #
290
+ #y ・・・ -1:上、0:変化なし、1:下
291
+ #返却値:: 移動方向を示す配列
292
+ def Input::trigger_amount
293
+ amt = [0, 0]
294
+ [:down, :left, :right, :up].each{|d| [0, 1].each{|n| amt[n] += @@btn[:trigger][d] * @@move_amount[n][d]} }
295
+ return amt
296
+ end
297
+
298
+ #===ボタンが押された方向を取得する
299
+ #方向キーが押された情報を、2要素の配列[x,y]で示す。
300
+ #
301
+ #各要素の値は以下の通り。
302
+ #x ・・・ -1:左、0:変化なし、1:右
303
+ #
304
+ #y ・・・ -1:上、0:変化なし、1:下
305
+ #返却値:: 移動方向を示す配列
306
+ def Input::pushed_amount
307
+ amt = [0, 0]
308
+ [:down, :left, :right, :up].each{|d| [0, 1].each{|n| amt[n] += @@btn[:pushed][d] * @@move_amount[n][d]} }
309
+ return amt
310
+ end
311
+
312
+ #===ウィンドウの「閉じる」ボタンが選択されたかどうかを問い合わせる
313
+ #Windowsの場合、ウィンドウ右上の「×」ボタンを押したときに相当
314
+ #返却値:: 「×」ボタンが押されていれば true を返す
315
+ def Input::quit?
316
+ return @@quit
317
+ end
318
+
319
+ #===エスケープキーが押されたかどうかを問い合わせる
320
+ #返却値:: エスケープキーが押されていれば true を返す
321
+ def Input::escape?
322
+ return (@@btn[:pushed][:esc] == 1)
323
+ end
324
+
325
+ #===ウィンドウの「×」ボタンか、エスケープキーが押されたかどうかを問い合わせる
326
+ #返却値:: 「×」ボタンが押されてる、もしくはエスケープキーが押されていれば true を返す
327
+ def Input::quit_or_escape?
328
+ return @@quit || (@@btn[:pushed][:esc] == 1)
329
+ end
330
+
331
+ #===マウスカーソルを表示する
332
+ def Input::mouse_cursor_show
333
+ SDL::Mouse.show
334
+ end
335
+
336
+ #===マウスカーソルを隠蔽する
337
+ def Input::mouse_cursor_hide
338
+ SDL::Mouse.hide
339
+ end
340
+
341
+ #===マウスの現在位置を取得する
342
+ #求める値は、{:x=>n,:y=>n}で示すハッシュとする
343
+ #原点は、画面領域の左上を{:x=>0,:y=>0}とする
344
+ #返却値:: マウスカーソルの位置を示すPoint構造体
345
+ def Input::get_mouse_position
346
+ return Point.new(@@mouse[:pos][:x],@@mouse[:pos][:y])
347
+ end
348
+
349
+ #===マウスの移動量を取得する
350
+ #求める値は、{:x=>n,:y=>n}で示すハッシュとする
351
+ #移動量は、右下方向を正とする
352
+ #返却値:: マウスカーソルの移動量を示すSize構造体
353
+ def Input::get_mouse_amount
354
+ return Size.new(@@mouse[:pos][:dx],@@mouse[:pos][:dy])
355
+ end
356
+
357
+ #===ボタンがクリックされたかを問い合わせるメソッド
358
+ #ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り
359
+ #このメソッドを呼び出した後、そのボタンの返却値は、Input.updateが呼ばれない限りfalseになることに注意。
360
+ #
361
+ #:left : 左ボタン
362
+ #:middle : 中ボタン(ホイールをクリック)
363
+ #:right : 右ボタン
364
+ #:any : 上記ボタンの少なくともどれか一つ
365
+ #
366
+ #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
367
+ #返却値:: ボタンが押されていれば true を返す
368
+ def Input::click?(btn)
369
+ btns = (btn == :any ? [:left, :middle, :right] : [btn])
370
+ ret = btns.inject(false){|r, f| r |= @@mouse[:click][f]}
371
+ return ret
372
+ end
373
+
374
+ #===ボタンが押されているかを問い合わせるメソッド
375
+ #ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り
376
+ #
377
+ #_:left_:: 左ボタン
378
+ #_:middle_:: 中ボタン(ホイールをクリック)
379
+ #_:right_:: 右ボタン
380
+ #_:any_:: 上記ボタンの少なくともどれか一つ
381
+ #
382
+ #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
383
+ #返却値:: ボタンが押されていれば true を返す
384
+ def Input::mouse_trigger?(btn)
385
+ return btn == :any ? (@@mouse[:trigger][:left] || @@mouse[:trigger][:middle] || @@mouse[:trigger][:right]) : @@mouse[:trigger][btn]
386
+ end
387
+
388
+ #===ドラッグアンドドロップが行われたかどうかを問い合わせる
389
+ #ドラッグアンドドロップした際に使ったボタンの問い合わせは、
390
+ #可変個数のシンボルで行う。指定できるボタンは以下の通り
391
+ #
392
+ #_:left_:: 左ボタン
393
+ #_:middle_:: 中ボタン(ホイールをクリック)
394
+ #_:right_:: 右ボタン
395
+ #_:any_:: 上記ボタンの少なくともどれか一つ
396
+ #
397
+ #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
398
+ #返却値:: ドラッグアンドドロップが成功していれば、true を返す
399
+ def Input::drag_and_drop?(btn)
400
+ return @@mouse[:drop][:succeed] && (btn == :any ? (@@mouse[:drop][:left] || @@mouse[:drop][:middle] || @@mouse[:drop][:right]) : @@mouse[:click][btn])
401
+ end
402
+
403
+ #===ドラッグアンドドロップされた範囲を取得する
404
+ #取得できる範囲は、以下のハッシュで取得できる。
405
+ #{:drag_x => ドラッグが行われた x 座標, :drag_y => ドラッグが行われた y 座標, :drop_x => ドロップが行われた x 座業, :drop_y => ドロップが行われた y 座標}
406
+ #返却値:: ドラッグアンドドロップが成功していれば、移動範囲を示すハッシュ、失敗していれば nil を返す
407
+ def Input::get_drag_and_drop_range
408
+ 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
409
+ end
410
+
411
+ #===ダブルクリックの間隔を取得する
412
+ #間隔は、ミリ秒単位で取得できる
413
+ #返却値:: ボタンのクリック間隔
414
+ def Input::click_interval
415
+ return @@mouse[:click][:interval]
416
+ end
417
+
418
+ #===ダブルクリックの間隔を設定する
419
+ #間隔は、ミリ秒単位で設定できる
420
+ #_v_:: ボタンのクリック間隔
421
+ def Input::click_interval=(v)
422
+ @@mouse[:click][:interval] = v
423
+ end
424
+
425
+ #===マウスカーソルが画面の内側に有るかどうかを問い合わせる
426
+ #返却値:: マウスカーソルが画面内ならtrueを返す
427
+ def Input::mouse_cursor_inner?
428
+ return @@mouse[:inner]
429
+ end
430
+
431
+ #===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えの可否を切り替える
432
+ def Input::enable_toggle_screen_mode
433
+ @@toggle_screen_mode = true
434
+ end
435
+
436
+ #===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えを不可にする
437
+ def Input::disenable_toggle_screen_mode
438
+ @@toggle_screen_mode = false
439
+ end
440
+
441
+ #===Alt+Enterキーを押したときにフル・ウィンドウモード切り替えができるかどうかを問い合わせる
442
+ #返却値:: 切り替えができるときは true を返す
443
+ def Input::toggle_screen_mode?
444
+ return @@toggle_screen_mode
445
+ end
446
+ end
447
+ end