ruby-miyako 2.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/README +275 -20
  2. data/extern.h +21 -1
  3. data/install_miyako.rb +5 -3
  4. data/lib/Miyako/API/audio.rb +11 -6
  5. data/lib/Miyako/API/basic_data.rb +0 -985
  6. data/lib/Miyako/API/bitmap.rb +19 -22
  7. data/lib/Miyako/API/choices.rb +203 -69
  8. data/lib/Miyako/API/collision.rb +451 -9
  9. data/lib/Miyako/API/color.rb +177 -0
  10. data/lib/Miyako/API/diagram.rb +18 -20
  11. data/lib/Miyako/API/fixedmap.rb +207 -73
  12. data/lib/Miyako/API/font.rb +111 -18
  13. data/lib/Miyako/API/i_yuki.rb +1201 -0
  14. data/lib/Miyako/API/input.rb +65 -0
  15. data/lib/Miyako/API/layout.rb +41 -29
  16. data/lib/Miyako/API/map.rb +202 -157
  17. data/lib/Miyako/API/map_event.rb +86 -19
  18. data/lib/Miyako/API/map_struct.rb +268 -0
  19. data/lib/Miyako/API/modules.rb +136 -37
  20. data/lib/Miyako/API/movie.rb +8 -8
  21. data/lib/Miyako/API/parts.rb +63 -20
  22. data/lib/Miyako/API/plane.rb +4 -4
  23. data/lib/Miyako/API/screen.rb +16 -8
  24. data/lib/Miyako/API/sprite.rb +290 -23
  25. data/lib/Miyako/API/sprite_animation.rb +23 -11
  26. data/lib/Miyako/API/sprite_list.rb +406 -183
  27. data/lib/Miyako/API/story.rb +4 -65
  28. data/lib/Miyako/API/struct_point.rb +157 -0
  29. data/lib/Miyako/API/struct_rect.rb +233 -0
  30. data/lib/Miyako/API/struct_segment.rb +641 -0
  31. data/lib/Miyako/API/struct_size.rb +158 -0
  32. data/lib/Miyako/API/struct_square.rb +253 -0
  33. data/lib/Miyako/API/textbox.rb +49 -35
  34. data/lib/Miyako/API/viewport.rb +5 -5
  35. data/lib/Miyako/API/wait_counter.rb +350 -0
  36. data/lib/Miyako/API/yuki.rb +95 -60
  37. data/lib/Miyako/EXT/raster_scroll.rb +30 -8
  38. data/lib/Miyako/EXT/slides.rb +6 -6
  39. data/lib/Miyako/miyako.rb +25 -11
  40. data/lib/miyako.rb +28 -0
  41. data/lib/miyako_require_only.rb +35 -0
  42. data/miyako_basicdata.c +201 -17
  43. data/miyako_collision.c +315 -6
  44. data/miyako_diagram.c +331 -0
  45. data/miyako_drawing.c +26 -7
  46. data/miyako_font.c +259 -129
  47. data/miyako_input_audio.c +24 -14
  48. data/miyako_layout.c +106 -8
  49. data/miyako_no_katana.c +398 -171
  50. data/miyako_sprite2.c +275 -38
  51. data/miyako_transform.c +113 -107
  52. data/miyako_utility.c +34 -48
  53. data/miyako_yuki.c +241 -0
  54. data/sample/Diagram_sample/diagram_sample_yuki2.rb +30 -30
  55. data/sample/Room3/blue.rb +19 -19
  56. data/sample/Room3/green.rb +9 -9
  57. data/sample/Room3/main.rb +12 -12
  58. data/sample/Room3/red.rb +12 -12
  59. data/sample/Room3/title.rb +15 -10
  60. data/sample/collision_test2.rb +2 -1
  61. data/sample/fixed_map_test/fixed_map_sample.rb +7 -6
  62. data/sample/map_test/main_scene.rb +12 -10
  63. data/sample/map_test/map_manager.rb +14 -13
  64. data/sample/rasterscroll.rb +5 -5
  65. data/sample/takahashi.rb +3 -3
  66. data/sample/textbox_sample.rb +7 -6
  67. data/sample/transform.rb +2 -1
  68. data/uninstall_miyako.rb +4 -1
  69. data/win/miyako_no_katana.so +0 -0
  70. metadata +15 -4
  71. data/lib/Miyako/EXT/miyako_cairo.rb +0 -62
  72. data/sample/cairo_sample.rb +0 -25
@@ -25,37 +25,34 @@ module Miyako
25
25
  #==ビットマップ(画像)管理クラス
26
26
  #SDLのSurfaceクラスインスタンスを管理するクラス
27
27
  class Bitmap
28
- def Bitmap.create(w, h, flag=SDL::HWSURFACE | SDL::SRCCOLORKEY | SDL::SRCALPHA) #:nodoc:
29
- # return SDL::Surface.new(flag, w, h, 32,
30
- # Screen.bitmap.Rmask, Screen.bitmap.Gmask,
31
- # Screen.bitmap.Bmask, Screen.bitmap.Amask)
28
+ #===スプライトの元になる画像を生成する
29
+ #幅・高さを渡すことにより、SDL::Surfaceクラスのインスタンスを生成する。
30
+ #_w_:: 画像の幅。単位はピクセル
31
+ #_h_:: 画像の幅。単位はピクセル
32
+ #返却値:: 生成したSDL::Surfaceクラスのインスタンス(αチャネル付き)
33
+ def Bitmap.create(w, h)
34
+ flag = SDL::HWSURFACE | SDL::SRCCOLORKEY | SDL::SRCALPHA
32
35
  # エンディアン判別
33
36
  if [1].pack("V*") == [1].pack("L*") # リトルエンディアン?
34
- bitmap = SDL::Surface.new(flag, w, h, 32, 0xff0000, 0xff00, 0xff, 0xff000000)
37
+ bitmap = SDL::Surface.new(flag, w, h, 32, 0xff0000, 0xff00, 0xff, 0xff000000).display_format_alpha
35
38
  else # ビッグエンディアン
36
- bitmap = SDL::Surface.new(flag, w, h, 32, 0xff00, 0xff0000, 0xff000000, 0xff)
39
+ bitmap = SDL::Surface.new(flag, w, h, 32, 0xff00, 0xff0000, 0xff000000, 0xff).display_format_alpha
37
40
  end
38
41
  bitmap
39
42
  end
40
43
 
41
- # def Bitmap.create_from(bitmap) #:nodoc:
42
- # bpp = 32
43
- # # エンディアン判別
44
- # if [1].pack("V*") == [1].pack("L*") # リトルエンディアン?
45
- # bitmap = SDL::Surface.new_from(bitmap.pixels, bitmap.w, bitmap.h, 32, (bitmap.w*bpp)>>3,
46
- # 0xff0000, 0xff00, 0xff, 0xff000000)
47
- # else # ビッグエンディアン
48
- # bitmap = SDL::Surface.new_from(bitmap.pixels, bitmap.w, bitmap.h, 32, (bitmap.w*bpp)>>3,
49
- # 0xff00, 0xff0000, 0xff000000, 0xff)
50
- # end
51
- # bitmap
52
- # end
53
-
54
- def Bitmap.load(filename) #:nodoc:
44
+ #===指定のファイルから画像を読み込む
45
+ #指定したファイル名(パス)から画像データを読みこみ、SDL::Surfaceクラスのインスタンスを生成する。
46
+ #存在しないパスを渡したときはMiyakoIOErrorを発生させる。
47
+ #ロードに失敗したときは例外MiyakoFileFormatErrorを発生させる。
48
+ #_filename_:: 画像のファイル名
49
+ #返却値:: 生成したSDL::Surfaceクラスのインスタンス(αチャネル付き)
50
+ def Bitmap.load(filename)
51
+ raise MiyakoIOError, "can't find file! #{filename}" unless File.exist?(filename)
55
52
  begin
56
- return SDL::Surface.load(filename)
53
+ return SDL::Surface.load(filename).display_format_alpha
57
54
  rescue SDL::Error
58
- raise MiyakoFileFormatError, "Illegal file format! collect? #{name}"
55
+ raise MiyakoFileFormatError, "Illegal file format! collect? #{filename}"
59
56
  end
60
57
  return nil
61
58
  end
@@ -21,6 +21,109 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
21
  =end
22
22
 
23
23
  module Miyako
24
+ require 'delegate'
25
+
26
+ class ChoiceStruct < Struct
27
+ include SpriteBase
28
+ include Animation
29
+ include Layout
30
+
31
+ attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
32
+
33
+ def initialize(*params)
34
+ super(*params)
35
+ init_layout
36
+ @visible = true
37
+ tsize = self.broad_rect.size
38
+ set_layout_size(*tsize)
39
+ end
40
+
41
+ def update_layout_position #:nodoc:
42
+ self[0].move_to!(*@layout.pos)
43
+ self[1].move_to!(*@layout.pos) if self[1] && self[0] != self[1]
44
+ self[2].move_to!(*@layout.pos) if self[2]
45
+ end
46
+
47
+ def process_sprites #:nodoc:
48
+ yield(self[0])
49
+ yield(self[1]) if self[1] && self[0] != self[1]
50
+ yield(self[2]) if self[2]
51
+ end
52
+
53
+ def start
54
+ return unless self[3].call
55
+ process_sprites{|spr| spr.start }
56
+ end
57
+
58
+ def stop
59
+ return unless self[3].call
60
+ process_sprites{|spr| spr.stop }
61
+ end
62
+
63
+ def reset
64
+ return unless self[3].call
65
+ process_sprites{|spr| spr.reset }
66
+ end
67
+
68
+ def update_animation
69
+ return unless self[3].call
70
+ process_sprites{|spr| spr.update_animation }
71
+ end
72
+
73
+ def render_src #:nodoc:
74
+ sprite = self[0]
75
+ if self[4]
76
+ sprite = self[1] if (self[5] && self[1])
77
+ elsif self[2]
78
+ sprite = self[2]
79
+ end
80
+ return sprite
81
+ end
82
+
83
+ def render
84
+ return unless @visible
85
+ return unless self[3].call
86
+ render_src.render
87
+ end
88
+
89
+ def render_to(dst)
90
+ return unless @visible
91
+ return unless self[3].call
92
+ render_src..render_to(dst)
93
+ end
94
+
95
+ #===レイアウト空間の大きさを更新する
96
+ # 新たにスプライトを登録したときに、全体の大きさをレイアウト空間の大きさとして更新する
97
+ #返却値:: 自分自身を返す
98
+ def update_layout_size
99
+ trect = self.broad_rect
100
+ set_layout_size(*trect.size)
101
+ self
102
+ end
103
+
104
+ #===選択肢の最大の大きさを矩形で取得する
105
+ # 現在登録しているスプライトから最大の矩形(broad_rect)を求める
106
+ #返却値:: 生成された矩形(Rect構造体のインスタンス)
107
+ def broad_rect
108
+ return self[0].rect if (self[1].nil? && self[2].nil?)
109
+ list = [self[0]]
110
+ list << self[1] if (self[1] && self[0] != self[1])
111
+ list << self[2] if self[2]
112
+ xx = []
113
+ yy = []
114
+ list.each{|ch|
115
+ r = ch.rect
116
+ xx << r.x
117
+ yy << r.y
118
+ xx << r.x + r.w
119
+ yy << r.y + r.h
120
+ }
121
+ min_x, max_x = xx.minmax
122
+ min_y, max_y = yy.minmax
123
+ return Rect.new(min_x, min_y, max_x-min_x, max_y-min_y)
124
+ end
125
+ end
126
+
24
127
  #==選択肢構造体
25
128
  # 選択肢を構成する要素の集合
26
129
  #
@@ -28,8 +131,10 @@ module Miyako
28
131
  # 選択肢を表示させるときは、body 自体の表示位置を変更させる必要がある
29
132
  #
30
133
  #_body_:: 選択肢を示す画像
31
- #_body_selected_:: 選択肢を示す画像(選択時)
32
- #_condition_:: 選択肢が選択できる条件を記述したブロック
134
+ #_body_selected_:: 選択肢を示す画像(選択時)
135
+ #_body_disable_:: 選択肢を示す画像(選択不可時)
136
+ #_condition_:: 選択肢を表示できる条件を記述したブロック
137
+ #_enable_:: 選択肢を選択できるときはtrue、不可の時はfalse
33
138
  #_selected_:: 選択肢が選択されているときはtrue、選択されていないときはfalse
34
139
  #_result_:: 選択した結果を示すインスタンス
35
140
  #_left_:: 左方向を選択したときに参照するChoice構造体のインスタンス
@@ -41,32 +146,47 @@ module Miyako
41
146
  #_end_select_proc_:: この選択肢を選択したときに優先的に処理するブロック。
42
147
  #ブロックは1つの引数を取る(コマンド選択テキストボックス))。
43
148
  #デフォルトはnil(何もしない)
44
- Choice = Struct.new(:body, :body_selected, :condition, :selected, :result, :left, :right, :up, :down, :base, :attribute, :end_select_proc)
149
+ #_name_:: 選択肢の名前。名前を明示的に指定しないときは、オブジェクトIDを文字列化したものが入る
150
+ Choice = ChoiceStruct.new(:body, :body_selected, :body_disable,
151
+ :condition, :enable, :selected, :result,
152
+ :left, :right, :up, :down,
153
+ :base, :attribute, :end_select_proc, :name)
45
154
 
46
155
  #==選択肢を管理するクラス
47
156
  # 選択肢は、Shapeクラスから生成したスプライトもしくは画像で構成される
48
- class Choices
49
- include Layout
157
+ class Choices < Delegator
50
158
  include SpriteBase
51
159
  include Animation
52
- include Enumerable
53
- extend Forwardable
160
+ include Layout
54
161
 
55
162
  attr_accessor :visible #レンダリングの可否(true->描画 false->非描画)
163
+ attr_reader :choices #選択肢配列の集合
164
+ attr_reader :name_to_choice #名前と選択肢を関連づけているハッシュ
165
+ attr_reader :layout_spaces #選択肢の位置決めに使うレイアウト空間をハッシュで管理
56
166
 
57
167
  # インスタンスを生成する
58
168
  # 返却値:: 生成された Choices クラスのインスタンス
59
169
  def initialize
60
170
  init_layout
61
171
  @choices = []
172
+ @name_to_choice = {}
173
+ @layout_spaces = {}
62
174
  @now = nil
63
175
  @non_select = false
64
176
  @last_selected = nil
65
177
  @result = nil
66
178
  @visible = true
179
+ @org_pos = Point.new(0,0)
67
180
  set_layout_size(1, 1)
68
181
  end
69
-
182
+
183
+ def __getobj__
184
+ @choices
185
+ end
186
+
187
+ def __setobj__(obj)
188
+ end
189
+
70
190
  def initialize_copy(obj) #:nodoc:
71
191
  @choices = @choices.dup
72
192
  copy_layout
@@ -75,54 +195,65 @@ module Miyako
75
195
  def update_layout_position #:nodoc:
76
196
  dx = @layout.pos[0] - rect[0]
77
197
  dy = @layout.pos[1] - rect[1]
78
- @choices.each{|ch|
79
- ch.each{|cc|
80
- cc.body.move!(dx, dy)
81
- cc.body_selected.move!(dx, dy) if cc.body_selected && cc.body != cc.body_selected
82
- }
83
- }
198
+ @choices.each{|ch| ch.each{|cc| cc.move!(dx, dy) } }
84
199
  end
85
200
 
86
201
  # 選択肢を作成する
87
202
  # Choice 構造体のインスタンスを作成する
88
203
  # 構造体には、引数bodyと、必ず true を返す条件ブロックが登録されている。残りは nil
204
+ # name引数の省略時にはnilが渡され、内部で、オブジェクトIDを文字列化したものを入れる
89
205
  #_body_:: 選択肢を示す画像
90
206
  #_body_selected_:: 選択肢を示す画像(選択時)。デフォルトはnil
91
207
  #_selected_:: 生成時に選択されているときはtrue、そうでないときはfalseを設定する
208
+ #_body_disable_:: 選択肢を示す画像(選択不可時)。デフォルトはnil
209
+ #_enable_:: 生成時に選択可能なときはtrue、不可の時はfalseを設定する
210
+ #_name_:: 選択肢の名前
92
211
  #返却値:: 生成された Choice構造体のインスタンス
93
- def Choices.create_choice(body, body_selected = nil, selected = false)
94
- choice = Choice.new(body, body_selected, Proc.new{ true }, selected,
95
- nil, nil, nil, nil, nil, nil, {}, nil)
212
+ def Choices.create_choice(body, body_selected = nil, selected = false, body_disable = nil, enable = true, name = nil)
213
+ choice = Choice.new(body, body_selected, body_disable, Proc.new{ true }, enable, selected,
214
+ nil, nil, nil, nil, nil, nil, {}, nil, nil)
96
215
  choice.left = choice
97
216
  choice.right = choice
98
217
  choice.up = choice
99
218
  choice.down = choice
219
+ choice.name = name || choice.object_id.to_s
100
220
  return choice
101
221
  end
102
222
 
103
- # 選択肢集合(Choice 構造体の配列)を選択肢リストに登録する
223
+ #=== 選択肢を登録する
224
+ # 選択肢集合(画面に一度に表示する選択肢群、Choice 構造体の配列)を選択肢リストに登録する
225
+ # またこのとき、対象の選択肢をChoices#[]メソッドで参照できるようになる
226
+ # _choices_:: 選択肢(Choice構造体)の配列
227
+ # 返却値:: レシーバ
104
228
  def create_choices(choices)
105
- choices.each{|v| v.base = choices}
229
+ choices.each{|v|
230
+ v.base = choices
231
+ @name_to_choice[v.name] = v
232
+ }
106
233
  @choices.push(choices)
107
234
  @last_selected = @choices[0][0] if (@choices.length == 1 && @last_selcted == nil)
108
235
  rect = self.broad_rect
109
- set_layout_size(rect.w, rect.h)
236
+ set_layout_size(*rect.size)
110
237
  return self
111
238
  end
112
239
 
113
- # 選択肢データを解放する
240
+ #=== 名前から選択肢を参照する
241
+ #create_choicesメソッドで登録した選択肢を、名前からもとめる
242
+ #登録されていない名前を渡したときはnilを返す
243
+ #_name_:: 登録されているの名前。文字列
244
+ #返却値:: 対応する選択肢インスタンス
245
+ def regist_layout_space(name, layout_space)
246
+ @layout_spaces[name] = layout_space
247
+ layout_space.snap(self)
248
+ end
249
+
250
+ #=== 選択肢データを解放する
114
251
  def dispose
115
252
  @choices.each{|c| c.clear }
116
253
  @choices.clear
117
254
  @choices = []
118
255
  end
119
256
 
120
- def each #:nodoc:
121
- @choices.each{|ch| yield ch }
122
- end
123
-
124
- def_delegators(:@choices, :push, :pop, :shift, :unshift, :[], :[]=, :clear, :length)
125
-
126
257
  #===選択を開始しているかどうかを問い合わせる
127
258
  # start_choiceメソッドを呼び出して、コマンド選択が始まっているかどうかを問い合わせ、始まっているときはtrueを返す
128
259
  #返却値:: 選択を開始しているときはtrueを返す
@@ -226,6 +357,15 @@ module Miyako
226
357
  return !@non_select
227
358
  end
228
359
 
360
+ #===選択肢が選択可能かどうかを問い合わせる
361
+ #現在指している選択肢が選択可能か選択不可かを問い合わせる
362
+ #返却値:: 選択可能ならtrue、選択不可ならfalseを返す
363
+ def enable?
364
+ return false if @non_select
365
+ return false unless @now
366
+ return @now.enable
367
+ end
368
+
229
369
  #===選択肢を変更する
230
370
  #指定の位置の現在の選択状態を、選択状態にする
231
371
  #_x_:: x方向位置
@@ -291,14 +431,10 @@ module Miyako
291
431
  #ブロックの引数は、|インスタンスのSpriteUnit, 画面のSpriteUnit|となる。
292
432
  #visibleメソッドの値がfalseのとき、選択が開始されていない時は描画されない。
293
433
  #返却値:: 自分自身を返す
294
- def render(&block)
434
+ def render
295
435
  return unless @visible
296
436
  return self unless @now
297
- @now.base.each{|c|
298
- ((c.body_selected && c.selected) ?
299
- c.body_selected.render(&block) :
300
- c.body.render(&block)) if c.condition.call
301
- }
437
+ @now.base.each{|c| c.render }
302
438
  return self
303
439
  end
304
440
 
@@ -309,14 +445,10 @@ module Miyako
309
445
  #visibleメソッドの値がfalseのとき、選択が開始されていない時は描画されない。
310
446
  #_dst_:: 描画対象の画像インスタンス
311
447
  #返却値:: 自分自身を返す
312
- def render_to(dst, &block)
448
+ def render_to(dst)
313
449
  return self unless @visible
314
450
  return self unless @now
315
- @now.base.each{|c|
316
- ((c.body_selected && c.selected) ?
317
- c.body_selected.render_to(dst, &block) :
318
- c.body.render_to(dst, &block)) if c.condition.call
319
- }
451
+ @now.base.each{|c| c.render_to(dst) }
320
452
  return self
321
453
  end
322
454
 
@@ -336,6 +468,16 @@ module Miyako
336
468
  return sprite
337
469
  end
338
470
 
471
+ #===レイアウト空間の大きさを更新する
472
+ # 生成後、選択肢を追加した後の全体の大きさをレイアウト空間の大きさとして更新する
473
+ # ただし、create_choicesめそっどを呼び出したときはこのメソッドを自動的に呼び出している
474
+ #返却値:: 自分自身を返す
475
+ def update_layout_size
476
+ trect = self.broad_rect
477
+ set_layout_size(*trect.size)
478
+ self
479
+ end
480
+
339
481
  #===現在登録している選択肢の最大の大きさを矩形で取得する
340
482
  # 現在インスタンスが所持している選択肢全てから左上座標、右下座標を取得し、矩形の形式で返す
341
483
  # 但し、選択肢が一つも登録されていない時はRect(0,0,1,1)を返す
@@ -346,17 +488,16 @@ module Miyako
346
488
  yy = []
347
489
  @choices.each{|ch|
348
490
  ch.each{|cc|
349
- xx << cc.body.x
350
- yy << cc.body.y
351
- if cc.body_selected
352
- xx << cc.body_selected.x
353
- yy << cc.body_selected.y
354
- end
491
+ r = cc.broad_rect
492
+ xx << r.x
493
+ yy << r.y
494
+ xx << r.x + r.w
495
+ yy << r.y + r.h
355
496
  }
356
497
  }
357
498
  min_x, max_x = xx.minmax
358
499
  min_y, max_y = yy.minmax
359
- return Rect.new(min_x, min_y, max_x-min_x+1, max_y-min_y+1)
500
+ return Rect.new(min_x, min_y, max_x-min_x, max_y-min_y)
360
501
  end
361
502
 
362
503
  #===現在登録している選択肢の大きさを矩形で取得する
@@ -427,12 +568,7 @@ module Miyako
427
568
  # 返却値:: 自分自身を返す
428
569
  def start
429
570
  return self unless @now
430
- @now.base.each{|c|
431
- if c.condition.call
432
- c.body.start
433
- c.body_selected.start if c.body != c.body_selected
434
- end
435
- }
571
+ @now.base.each{|c| c.start }
436
572
  return self
437
573
  end
438
574
 
@@ -441,12 +577,7 @@ module Miyako
441
577
  # 返却値:: 自分自身を返す
442
578
  def stop
443
579
  return self unless @now
444
- @now.base.each{|c|
445
- if c.condition.call
446
- c.body.stop
447
- c.body_selected.stop if c.body != c.body_selected
448
- end
449
- }
580
+ @now.base.each{|c| c.stop }
450
581
  return self
451
582
  end
452
583
 
@@ -455,12 +586,7 @@ module Miyako
455
586
  # 返却値:: 自分自身を返す
456
587
  def reset
457
588
  return self unless @now
458
- @now.base.each{|c|
459
- if c.condition.call
460
- c.body.reset
461
- c.body_selected.reset if c.body != c.body_selected
462
- end
463
- }
589
+ @now.base.each{|c| c.reset }
464
590
  return self
465
591
  end
466
592
 
@@ -471,11 +597,19 @@ module Miyako
471
597
  # ただし、現在選択中の配列リストではないときは[false]を返す
472
598
  def update_animation
473
599
  return [false] unless @now
474
- @now.base.map{|c|
475
- ((c.body_selected && c.selected) ?
476
- c.body_selected.update_animation :
477
- c.body.update_animation) if c.condition.call
478
- }
600
+ @now.base.map{|c| c.update_animation }
601
+ end
602
+
603
+ #=== mixin されたインスタンスの部分矩形幅を取得する
604
+ #返却値:: インスタンスの幅(デフォルトは0)
605
+ def ow
606
+ return self.size[0]
607
+ end
608
+
609
+ #=== mixin されたインスタンスの部分矩形高を取得する
610
+ #返却値:: インスタンスの高さ(デフォルトは0)
611
+ def oh
612
+ return self.size[1]
479
613
  end
480
614
  end
481
615
  end