cyross-ruby-miyako 2.0.0 → 2.0.5.1.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 (102) hide show
  1. data/README +106 -154
  2. data/defines.h +144 -0
  3. data/{miyako_no_katana/extconf.rb → extconf.rb} +10 -0
  4. data/extern.h +29 -0
  5. data/install_miyako.rb +26 -14
  6. data/lib/Miyako/API/audio.rb +2 -2
  7. data/lib/Miyako/API/basic_data.rb +183 -41
  8. data/lib/Miyako/API/bitmap.rb +474 -2
  9. data/lib/Miyako/API/choices.rb +215 -48
  10. data/lib/Miyako/API/collision.rb +267 -251
  11. data/lib/Miyako/API/diagram.rb +58 -70
  12. data/lib/Miyako/API/drawing.rb +93 -52
  13. data/lib/Miyako/API/fixedmap.rb +233 -120
  14. data/lib/Miyako/API/font.rb +59 -40
  15. data/lib/Miyako/API/input.rb +34 -27
  16. data/lib/Miyako/API/layout.rb +154 -172
  17. data/lib/Miyako/API/map.rb +285 -159
  18. data/lib/Miyako/API/map_event.rb +4 -4
  19. data/lib/Miyako/API/modules.rb +1 -1
  20. data/lib/Miyako/API/movie.rb +8 -5
  21. data/lib/Miyako/API/parts.rb +44 -9
  22. data/lib/Miyako/API/plane.rb +37 -2
  23. data/lib/Miyako/API/screen.rb +90 -22
  24. data/lib/Miyako/API/shape.rb +118 -37
  25. data/lib/Miyako/API/sprite.rb +475 -61
  26. data/lib/Miyako/API/sprite_animation.rb +83 -63
  27. data/lib/Miyako/API/spriteunit.rb +47 -13
  28. data/lib/Miyako/API/story.rb +123 -47
  29. data/lib/Miyako/API/textbox.rb +361 -132
  30. data/lib/Miyako/API/utility.rb +388 -0
  31. data/lib/Miyako/API/viewport.rb +54 -349
  32. data/lib/Miyako/API/yuki.rb +570 -353
  33. data/lib/Miyako/EXT/miyako_cairo.rb +5 -3
  34. data/lib/Miyako/EXT/slides.rb +22 -1
  35. data/lib/Miyako/miyako.rb +12 -13
  36. data/logo/EGSR_logo.png +0 -0
  37. data/logo/EGSR_logo_bg.png +0 -0
  38. data/logo/EGSR_logo_fg.png +0 -0
  39. data/logo/EGSR_title_banner.png +0 -0
  40. data/logo/EGSR_title_logo.png +0 -0
  41. data/logo/miyako.png +0 -0
  42. data/logo/miyako_banner.png +0 -0
  43. data/logo/space.png +0 -0
  44. data/miyako_basicdata.c +590 -0
  45. data/miyako_bitmap.c +1225 -0
  46. data/miyako_collision.c +403 -0
  47. data/miyako_drawing.c +187 -0
  48. data/miyako_font.c +334 -0
  49. data/miyako_hsv.c +830 -0
  50. data/miyako_layout.c +191 -0
  51. data/miyako_no_katana.c +1074 -0
  52. data/miyako_transform.c +438 -0
  53. data/miyako_utility.c +288 -0
  54. data/sample/Animation1/m1ku.rb +10 -31
  55. data/sample/Animation1/readme.txt +6 -6
  56. data/sample/Animation2/lex.rb +1 -0
  57. data/sample/Animation2/readme.txt +6 -6
  58. data/sample/Diagram_sample/diagram_sample_yuki2.rb +152 -48
  59. data/sample/Diagram_sample/readme.txt +9 -6
  60. data/sample/Room3/blue.rb +234 -187
  61. data/sample/Room3/ending.rb +68 -63
  62. data/sample/Room3/green.rb +159 -124
  63. data/sample/Room3/main.rb +50 -32
  64. data/sample/Room3/main_component.rb +3 -2
  65. data/sample/Room3/readme.txt +6 -6
  66. data/sample/Room3/red.rb +161 -134
  67. data/sample/Room3/room3.rb +1 -0
  68. data/sample/Room3/title.rb +75 -62
  69. data/sample/ball_action_sample.rb +204 -0
  70. data/sample/blit_rop.rb +70 -0
  71. data/sample/cairo_sample.rb +25 -0
  72. data/sample/circle_collision_test.rb +66 -0
  73. data/sample/collision_test.rb +33 -0
  74. data/sample/collision_test2.rb +108 -0
  75. data/sample/fixed_map_test/fixed_map_sample.rb +23 -32
  76. data/sample/fixed_map_test/readme.txt +38 -38
  77. data/sample/map_test/chara.rb +17 -9
  78. data/sample/map_test/main_parts.rb +30 -9
  79. data/sample/map_test/main_scene.rb +57 -41
  80. data/sample/map_test/map_manager.rb +13 -30
  81. data/sample/map_test/map_test.rb +2 -2
  82. data/sample/map_test/oasis.rb +17 -11
  83. data/sample/map_test/readme.txt +50 -48
  84. data/sample/map_test/route.rb +46 -33
  85. data/sample/map_test/town.rb +19 -13
  86. data/sample/polygon_test.rb +35 -0
  87. data/sample/rasterscroll.rb +25 -0
  88. data/sample/takahashi.rb +42 -0
  89. data/sample/text.png +0 -0
  90. data/sample/textbox_sample.rb +190 -0
  91. data/sample/transform.rb +54 -0
  92. data/sample/utility_test.rb +73 -0
  93. data/sample/utility_test2.rb +61 -0
  94. data/sample/utility_test3.rb +64 -0
  95. data/sample/utility_test4.rb +73 -0
  96. data/uninstall_miyako.rb +19 -0
  97. data/win/miyako_no_katana.so +0 -0
  98. metadata +165 -148
  99. data/miyako.png +0 -0
  100. data/miyako_banner.png +0 -0
  101. data/miyako_no_katana/miyako_no_katana.c +0 -3301
  102. data/sample/fixed_map_test/map_sample.rb +0 -121
@@ -2,7 +2,7 @@
2
2
  =begin
3
3
  --
4
4
  Miyako v2.0
5
- Copyright (C) 2007-2008 Cyross Makoto
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
6
 
7
7
  This library is free software; you can redistribute it and/or
8
8
  modify it under the terms of the GNU Lesser General Public
@@ -25,12 +25,17 @@ module Miyako
25
25
 
26
26
  =begin rdoc
27
27
  ==フォント管理クラス
28
+ フォントは、等幅フォント奨励(プロポーショナルフォントを選ぶと、文字が正しく描画されない可能性あり)
28
29
  =end
29
30
  class Font
30
31
  extend Forwardable
31
32
 
33
+ # OS_MAC_OS_X = "mac_osx"
34
+ # ORG_ENC = "UTF-8"
35
+ # NEW_ENC = "UTF-8-MAC"
36
+
32
37
  attr_reader :size, :line_skip, :height, :ascent, :descent
33
- attr_accessor :color, :use_shadow, :shadow_color, :shadow_margin, :vspace, :draw_type
38
+ attr_accessor :color, :use_shadow, :shadow_color, :shadow_margin, :vspace, :hspace
34
39
 
35
40
  @@font_cache = {}
36
41
 
@@ -43,10 +48,10 @@ module Miyako
43
48
  "/ライブラリ/Fonts/", "/システム/ライブラリ/Fonts/"]
44
49
 
45
50
  @@font_base_name = Hash.new
46
- @@font_base_name["win"] = [{:serif=>"msmincho.ttc", :sans_serif=>"meiryo.ttc"},
47
- {:serif=>"msmincho.ttc", :sans_serif=>"msgothic.ttc"},
51
+ @@font_base_name["win"] = [{:serif=>"msmincho.ttc", :sans_serif=>"msgothic.ttc"},
48
52
  {:serif=>"VL-Gothic-Regular.ttf", :sans_serif=>"VL-Gothic-Regular.ttf"},
49
- {:serif=>"umeplus-gothic.ttf", :sans_serif=>"umeplus-gothic.ttf"}]
53
+ {:serif=>"umeplus-gothic.ttf", :sans_serif=>"umeplus-gothic.ttf"},
54
+ {:serif=>"msmincho.ttc", :sans_serif=>"meiryo.ttc"}]
50
55
  @@font_base_name["linux"] = [{:serif=>"sazanami-mincho.ttf", :sans_serif=>"sazanami-gothic.ttf"},
51
56
  {:serif=>"VL-Gothic-Regular.ttf", :sans_serif=>"VL-Gothic-Regular.ttf"},
52
57
  {:serif=>"umeplus-gothic.ttf", :sans_serif=>"umeplus-gothic.ttf"}]
@@ -62,7 +67,7 @@ module Miyako
62
67
  def Font.search_font_path_file(hash, path) #:nodoc:
63
68
  Dir.glob(path+"*"){|d|
64
69
  hash = Font.search_font_path_file(hash, d+"/") if test(?d, d)
65
- d = Iconv.conv("UTF-8-MAC", "UTF-8", d.toutf8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
70
+ d = d.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
66
71
  d = d.tr("\\", "\/")
67
72
  hash[$1] = d if (d =~ /\/([^\/\.]+\.tt[fc])\z/ || d =~ /\/([^\/\.]+\.otf)\z/) # MacOSX対応
68
73
  }
@@ -72,21 +77,21 @@ module Miyako
72
77
  def Font.create_font_path #:nodoc:
73
78
  osn = Miyako::getOSName
74
79
  @@font_base_path[osn].each{|path|
75
- path = Iconv.conv("UTF-8-MAC", "UTF-8", path.toutf8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
80
+ path = path.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
76
81
  path = path.tr("\\", "\/")
77
82
  @@name_2_font_path = Font.search_font_path_file(@@name_2_font_path, path)
78
83
  }
79
84
  end
80
85
 
81
86
  def Font.findFontPath(fname) #:nodoc:
82
- fname = Iconv.conv("UTF-8-MAC", "UTF-8", fname.toutf8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
87
+ fname = fname.encode(Encoding::UTF_8) if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
83
88
  return @@name_2_font_path.fetch(fname, nil)
84
89
  end
85
90
 
86
91
  def Font.get_font_inner(fname, fpath, size=16) #:nodoc:
87
92
  if Miyako.getOSName == "mac_osx" # MacOSXはパス名がUTF-8固定のため
88
- fname = Iconv.conv("UTF-8-MAC", "UTF-8", fname.toutf8)
89
- fpath = Iconv.conv("UTF-8-MAC", "UTF-8", fpath.toutf8)
93
+ fname = fname.encode(Encoding::UTF_8)
94
+ fpath = fpath.encode(Encoding::UTF_8)
90
95
  end
91
96
  @@font_cache[fname] ||= {}
92
97
  @@font_cache[fname][size] ||= SDL::TTF.open(fpath, size)
@@ -103,7 +108,12 @@ module Miyako
103
108
  private :init_height
104
109
 
105
110
  #===インスタンス生成
106
- #_fname_:: フォントファイル名(フォントファミリー名不可)。システムフォントのときはディレクトリ指定不要
111
+ #指定したフォントファイル名から、フォントインスタンスを生成する。
112
+ #フォントファイルのパスは、Miyako2.0起動時にファイルパス(カレントディレクトリとシステムのフォントディレクトリ)を
113
+ #再帰的に検索し、先に見つけた方を採用する(同一ファイル名がカレントディレクトリとシステムのディレクトリに両方
114
+ #存在するときは、カレントディレクトリを優先する)
115
+ #そのため、フォントファイル名は、パスを指定する必要がない(逆に言うと、パスを指定すると例外が発生する)。
116
+ #_fname_:: フォントファイル名(フォントファミリー名不可)。パス指定不可
107
117
  #_size_:: フォントの大きさ。単位はピクセル。デフォルトは 16
108
118
  #返却値:: 生成されたインスタンスを返す
109
119
  def initialize(fname, size=16)
@@ -111,15 +121,14 @@ module Miyako
111
121
  @color = [255, 255, 255]
112
122
  @fname = fname
113
123
  @vspace = 0
124
+ @hspace = 0
114
125
  @bold = false
115
126
  @italic = false
116
127
  @under_line = false
117
- @draw_type = :mild
118
128
  @fpath = Font.findFontPath(@fname) or raise MiyakoError, "Cannot Find Font! : #{@fname}"
119
129
  @font = Font.get_font_inner(@fname, @fpath, @size)
120
130
  @font.style = SDL::TTF::STYLE_NORMAL
121
131
  init_height
122
- @draw_text = {:solid => self.method(:_draw_text), :mild => self.method(:_draw_text_mild)}
123
132
  @use_shadow = false
124
133
  @shadow_color = [128, 128, 128]
125
134
  @shadow_margin = [2, 2]
@@ -300,40 +309,48 @@ module Miyako
300
309
  #_x_:: 描画位置x軸
301
310
  #_y_:: 描画位置Y軸
302
311
  def draw_text(dst, str, x, y)
303
- str = str.toutf8
304
- str = Iconv.conv("UTF-8-MAC", "UTF-8", str) if Miyako.getOSName == "mac_osx"
305
- return @draw_text[@draw_type][dst, str, x, y]
306
- end
307
-
308
- def _draw_text(dst, str, x, y) #:nodoc:
309
- @font.drawSolidUTF8(dst.bitmap, str, x + @shadow_margin[0], y + @shadow_margin[1], @shadow_color[0], @shadow_color[1], @shadow_color[2]) if @use_shadow
310
- @font.drawSolidUTF8(dst.bitmap, str, x, y, @color[0], @color[1], @color[2])
311
- return x + @font.textSize(str)[0]
312
- end
313
-
314
- def _draw_text_mild(dst, str, x, y) #:nodoc:
315
- src = @font.renderBlendedUTF8(str, @color[0], @color[1], @color[2])
316
- if src
312
+ str = str.encode(Encoding::UTF_8)
313
+ str.chars{|c|
317
314
  if @use_shadow
318
- src2 = @font.renderBlendedUTF8(str, @shadow_color[0], @shadow_color[1], @shadow_color[2])
319
- SpriteUnitFactory.apply(@unit, {:bitmap=>src2, :ow=>src2.w, :oh=>src2.h})
320
- Miyako::Bitmap.blit_aa!(@unit, dst.to_unit, x+@shadow_margin[0], y+@shadow_margin[1])
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
321
322
  end
322
- SpriteUnitFactory.apply(@unit, {:bitmap=>src, :ow=>src.w, :oh=>src.h})
323
- Miyako::Bitmap.blit_aa!(@unit, dst.to_unit, x, y)
324
- else
325
- return x
326
- end
327
- return x + @font.textSize(str)[0]
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
328
341
  end
342
+
343
+ private :chr_size_inner
329
344
 
330
345
  #===文字列描画したときの大きさを取得する
331
346
  #現在のフォントの設定で指定の文字列を描画したとき、予想される描画サイズを返す。実際に描画は行われない。
332
347
  #_txt_:: 算出したい文字列
333
348
  #返却値:: 文字列を描画したときの大きさ([w,h]の配列)
334
349
  def text_size(txt)
335
- return [txt.chars.inject(0){|r, c| r += (c.length == 1 ? @size >> 1 : @size) } + (@use_shadow ? @shadow_margin[0] : 0),
336
- self.line_height]
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]
337
354
  end
338
355
 
339
356
  #===指定した高さで描画する際のマージンを求める
@@ -362,7 +379,8 @@ module Miyako
362
379
  Font.create_font_path
363
380
 
364
381
  #===Serifフォント(明朝フォント)を取得する
365
- #マルチプラットフォームのソフトを作る際、OS間の差異を吸収するため、共通の名称でフォントインスタンスを取得するときに使う(主に明朝フォント)
382
+ #マルチプラットフォームのソフトを作る際、OS間の差異を吸収するため、
383
+ #共通の名称でフォントインスタンスを取得するときに使う(主に明朝フォント)
366
384
  #返却値:: OSごとに設定されたフォントイン寸タンス(フォントサイズは16)
367
385
  def Font::serif
368
386
  filename = @@font_base_name[Miyako::getOSName].detect{|base| Font.findFontPath(base[:serif]) }[:serif]
@@ -370,7 +388,8 @@ module Miyako
370
388
  end
371
389
 
372
390
  #===Sans Serifフォント(ゴシックフォント)を取得する
373
- #マルチプラットフォームのソフトを作る際、OS間の差異を吸収するため、共通の名称でフォントインスタンスを取得するときに使う(主にゴシックフォント)
391
+ #マルチプラットフォームのソフトを作る際、OS間の差異を吸収するため、
392
+ #共通の名称でフォントインスタンスを取得するときに使う(主にゴシックフォント)
374
393
  #返却値:: OSごとに設定されたフォントイン寸タンス(フォントサイズは16)
375
394
  def Font::sans_serif
376
395
  filename = @@font_base_name[Miyako::getOSName].detect{|base| Font.findFontPath(base[:sans_serif]) }[:sans_serif]
@@ -2,7 +2,7 @@
2
2
  =begin
3
3
  --
4
4
  Miyako v2.0
5
- Copyright (C) 2007-2008 Cyross Makoto
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
6
 
7
7
  This library is free software; you can redistribute it and/or
8
8
  modify it under the terms of the GNU Lesser General Public
@@ -26,14 +26,14 @@ module Miyako
26
26
  #本モジュールでは、キーボードやマウス、ゲームパッドなどの入力装置からの情報を管理する。
27
27
  #メソッドのほとんどは、「押されたかどうか」などの問い合わせメソッドで構成されている。
28
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: シフトキー(左右)に対応
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
37
  #
38
38
  #また、本モジュールのメソッドに "trigger", "pushed" の2つのメソッドがあるが、
39
39
  #"trigger"系メソッドは、「押されていたら常にtrue」を示すのに対して、
@@ -160,8 +160,8 @@ module Miyako
160
160
 
161
161
  def Input::process_mousebuttondown(e) #:nodoc:
162
162
  set_mouse_button(:trigger, e.button)
163
- set_mouse_button(:click, e.button)
164
163
  return unless @@mouse[:inner]
164
+ click_mouse_button(:click, e.button)
165
165
  set_mouse_button(:drag, e.button)
166
166
  @@mouse[:drag][:x] = @@mouse[:pos][:x]
167
167
  @@mouse[:drag][:y] = @@mouse[:pos][:y]
@@ -172,7 +172,6 @@ module Miyako
172
172
  reset_mouse_button(:trigger, e.button)
173
173
  click_interval = SDL.getTicks - @@click_start_tick
174
174
  if click_interval < @@mouse[:click][:interval]
175
- set_mouse_button(:click, e.button)
176
175
  [:left, :middle, :right].each{|b| @@mouse[:drag][b] = false }
177
176
  else
178
177
  @@mouse[:drop][:left] = @@mouse[:drag][:left] and (e.button == SDL::Mouse::BUTTON_LEFT)
@@ -190,6 +189,12 @@ module Miyako
190
189
  def Input::process_default(e) #:nodoc:
191
190
  end
192
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
+
193
198
  def Input::set_mouse_button(mode, btn) #:nodoc:
194
199
  @@mouse[mode][:left] = (btn == SDL::Mouse::BUTTON_LEFT)
195
200
  @@mouse[mode][:middle] = (btn == SDL::Mouse::BUTTON_MIDDLE)
@@ -336,21 +341,22 @@ module Miyako
336
341
  #===マウスの現在位置を取得する
337
342
  #求める値は、{:x=>n,:y=>n}で示すハッシュとする
338
343
  #原点は、画面領域の左上を{:x=>0,:y=>0}とする
339
- #返却値:: マウスカーソルの位置を示すハッシュ
344
+ #返却値:: マウスカーソルの位置を示すPoint構造体
340
345
  def Input::get_mouse_position
341
- return {:x => @@mouse[:pos][:x], :y => @@mouse[:pos][:y]}
346
+ return Point.new(@@mouse[:pos][:x],@@mouse[:pos][:y])
342
347
  end
343
348
 
344
349
  #===マウスの移動量を取得する
345
350
  #求める値は、{:x=>n,:y=>n}で示すハッシュとする
346
351
  #移動量は、右下方向を正とする
347
- #返却値:: マウスカーソルの移動量を示すハッシュ
352
+ #返却値:: マウスカーソルの移動量を示すSize構造体
348
353
  def Input::get_mouse_amount
349
- return {:dx => @@mouse[:pos][:dx], :dy => @@mouse[:pos][:dy]}
354
+ return Size.new(@@mouse[:pos][:dx],@@mouse[:pos][:dy])
350
355
  end
351
356
 
352
357
  #===ボタンがクリックされたかを問い合わせるメソッド
353
358
  #ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り
359
+ #このメソッドを呼び出した後、そのボタンの返却値は、Input.updateが呼ばれない限りfalseになることに注意。
354
360
  #
355
361
  #:left : 左ボタン
356
362
  #:middle : 中ボタン(ホイールをクリック)
@@ -360,16 +366,18 @@ module Miyako
360
366
  #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
361
367
  #返却値:: ボタンが押されていれば true を返す
362
368
  def Input::click?(btn)
363
- return btn == :any ? (@@mouse[:click][:left] || @@mouse[:click][:middle] || @@mouse[:click][:right]) : @@mouse[:click][btn]
369
+ btns = (btn == :any ? [:left, :middle, :right] : [btn])
370
+ ret = btns.inject(false){|r, f| r |= @@mouse[:click][f]}
371
+ return ret
364
372
  end
365
373
 
366
374
  #===ボタンが押されているかを問い合わせるメソッド
367
375
  #ボタンの問い合わせは可変個数のシンボルで行う。指定できるボタンは以下の通り
368
376
  #
369
- #:left : 左ボタン
370
- #:middle : 中ボタン(ホイールをクリック)
371
- #:right : 右ボタン
372
- #:any : 上記ボタンの少なくともどれか一つ
377
+ #_:left_:: 左ボタン
378
+ #_:middle_:: 中ボタン(ホイールをクリック)
379
+ #_:right_:: 右ボタン
380
+ #_:any_:: 上記ボタンの少なくともどれか一つ
373
381
  #
374
382
  #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
375
383
  #返却値:: ボタンが押されていれば true を返す
@@ -381,10 +389,10 @@ module Miyako
381
389
  #ドラッグアンドドロップした際に使ったボタンの問い合わせは、
382
390
  #可変個数のシンボルで行う。指定できるボタンは以下の通り
383
391
  #
384
- #:left : 左ボタン
385
- #:middle : 中ボタン(ホイールをクリック)
386
- #:right : 右ボタン
387
- #:any : 上記ボタンの少なくともどれか一つ
392
+ #_:left_:: 左ボタン
393
+ #_:middle_:: 中ボタン(ホイールをクリック)
394
+ #_:right_:: 右ボタン
395
+ #_:any_:: 上記ボタンの少なくともどれか一つ
388
396
  #
389
397
  #_btn_:: 問い合わせるボタンを示すシンボル(可変個)
390
398
  #返却値:: ドラッグアンドドロップが成功していれば、true を返す
@@ -414,9 +422,8 @@ module Miyako
414
422
  @@mouse[:click][:interval] = v
415
423
  end
416
424
 
417
- #===ダブルクリックの間隔を設定する
418
- #間隔は、ミリ秒単位で設定できる
419
- #_v_:: ボタンのクリック間隔
425
+ #===マウスカーソルが画面の内側に有るかどうかを問い合わせる
426
+ #返却値:: マウスカーソルが画面内ならtrueを返す
420
427
  def Input::mouse_cursor_inner?
421
428
  return @@mouse[:inner]
422
429
  end
@@ -2,7 +2,7 @@
2
2
  =begin
3
3
  --
4
4
  Miyako v2.0
5
- Copyright (C) 2007-2008 Cyross Makoto
5
+ Copyright (C) 2007-2009 Cyross Makoto
6
6
 
7
7
  This library is free software; you can redistribute it and/or
8
8
  modify it under the terms of the GNU Lesser General Public
@@ -49,16 +49,18 @@ end
49
49
  module Miyako
50
50
 
51
51
  #==レイアウト情報を示す構造体
52
- LayoutStruct = Struct.new(:pos, :size, :base, :off, :snap, :zero, :margin, :lower, :middle, :upper, :loc)
52
+ LayoutStruct = Struct.new(:pos, :size, :base, :snap, :on_move)
53
53
  #==スナップ構造体
54
54
  LayoutSnapStruct = Struct.new(:sprite, :children)
55
- #==レイアウト表示位置ラムダ構造体
56
- LayoutSideStruct = Struct.new(:inside, :between, :outside)
57
55
 
58
56
  #==レイアウト管理モジュール
59
57
  #位置情報やスナップ、座標丸めなどを管理する
58
+ #本モジュールはmixinすることで機能する。
59
+ #また、mixinする場合は、以下の処理を施すこと
60
+ #1.クラスのinitializeメソッドの最初にinit_layoutメソッドを呼び出す
61
+ #2.update_layout_positionメソッドを実装する
60
62
  #なお、本モジュールをmixinした場合は、インスタンス変数 @layout が予約される。
61
- #@kayoutへの参照のみ許される。
63
+ #@layoutへのユーザアクセスは参照のみ許される。
62
64
  module Layout
63
65
  #===現在の位置情報を別のインスタンス変数に反映させるためのテンプレートメソッド
64
66
  #move や centering などのメソッドを呼び出した際に@layout[:pos]の値を反映させるときに使う
@@ -70,99 +72,158 @@ module Miyako
70
72
  #mixin したクラスの initialize メソッド内で必ず呼び出しておくこと
71
73
  def init_layout
72
74
  @layout = LayoutStruct.new
73
- @layout.pos = Point.new(0, 0)
74
- @layout.size = Size.new(0, 0)
75
- @layout.base = Rect.new(0, 0, nil, nil)
76
- @layout.off = Point.new(0, 0)
77
- @layout.snap = LayoutSnapStruct.new(nil, Array.new)
78
- @layout.zero = lambda{|data| 0 }
79
- @layout.margin = [@layout.zero, @layout.zero]
80
-
81
- @layout.lower = LayoutSideStruct.new
82
- @layout.lower.inside = lambda{|pos, base_size| @layout.base[pos] + @layout.margin[pos][base_size].to_i}
83
- @layout.lower.between = lambda{|pos, base_size| @layout.base[pos] - @layout.size[pos]/2 + @layout.margin[pos][base_size].to_i}
84
- @layout.lower.outside = lambda{|pos, base_size| @layout.base[pos] - @layout.size[pos] + @layout.margin[pos][base_size].to_i}
85
- @layout.middle = LayoutSideStruct.new
86
- @layout.middle.inside = lambda{|pos, base_size| @layout.base[pos] + base_size/2 - @layout.size[pos] + @layout.margin[pos][base_size].to_i}
87
- @layout.middle.between= lambda{|pos, base_size| @layout.base[pos] + base_size/2 - @layout.size[pos]/2 + @layout.margin[pos][base_size].to_i}
88
- @layout.middle.outside = lambda{|pos, base_size| @layout.base[pos] + base_size/2 + @layout.margin[pos][base_size].to_i}
89
- @layout.upper = LayoutSideStruct.new
90
- @layout.upper.inside = lambda{|pos, base_size| @layout.base[pos] + base_size - @layout.size[pos] - @layout.margin[pos][base_size].to_i}
91
- @layout.upper.between = lambda{|pos, base_size| @layout.base[pos] + base_size - @layout.size[pos]/2 - @layout.margin[pos][base_size].to_i}
92
- @layout.upper.outside = lambda{|pos, base_size| @layout.base[pos] + base_size + @layout.margin[pos][base_size].to_i}
93
-
94
- @layout.loc = [@layout.lower.inside, @layout.lower.inside]
75
+ @layout.pos = Point.new(0, 0)
76
+ @layout.size = Size.new(0, 0)
77
+ @layout.base = Screen
78
+ @layout.snap = LayoutSnapStruct.new(nil, Array.new)
79
+ @layout.on_move = []
80
+ end
81
+
82
+ #===位置移動時に呼び出すブロックを管理する配列にアクセする
83
+ #moveやleftメソッドを呼び出した時に評価したいブロックを渡すことで、付随処理を自律して行うことが出来る。
84
+ #引数は、|self, x, y, dx, dy|の5つ。
85
+ #各引数は、「レシーバ, 移動後x座標位置, 移動後y座標位置, x座標移動量, y座標移動量」の機能がある。
86
+ #評価が行われるのは、left,outside_left,center,right,outside_right,top,outside_top,middle,bottom,outside_bottom
87
+ #move,move_toの各メソッド。
88
+ #返却値:: ブロック管理配列
89
+ def on_move
90
+ return @layout.on_move
95
91
  end
96
92
 
97
93
  #===mixinしたインスタンスの位置を左端(x軸)に移動させる
98
- #ブロックでは、数値を返却することで、左端からのマージンを設定できる
94
+ #設置するとき、基準となる空間の内側に設置される
95
+ #ブロックでは、数値を返却することで、左端からのマージンを設定できる(正の方向へ移動)
99
96
  #ブロック引数は、自分自身の幅
100
- #_side_:: 設置する側。:inside、:between、:outside の3種類ある。デフォルトは :inside
101
97
  #返却値:: 自分自身
102
- def left(side=:inside, &margin)
103
- set_layout_inner(0, @layout.lower[side], margin)
104
- return self
98
+ def left(&margin)
99
+ base = @layout.base.rect
100
+ t = @layout.pos[0]
101
+ @layout.pos[0] = base[0] + (margin ? margin[base[2]].to_i : 0)
102
+ @layout.snap.children.each{|c| c.left(&margin) }
103
+ update_layout(@layout.pos[0]-t, 0)
104
+ @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
105
+ return self
106
+ end
107
+
108
+ #===mixinしたインスタンスの位置を左端(x軸)に移動させる
109
+ #設置するとき、基準となる空間の外側に設置される
110
+ #ブロックでは、数値を返却することで、左端からのマージンを設定できる(負の方向へ移動)
111
+ #ブロック引数は、自分自身の幅
112
+ #返却値:: 自分自身
113
+ def outside_left(&margin)
114
+ base = @layout.base.rect
115
+ t = @layout.pos[0]
116
+ @layout.pos[0] = base[0] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
117
+ update_layout(@layout.pos[0]-t, 0)
118
+ @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
119
+ return self
105
120
  end
106
121
 
107
122
  #===mixinしたインスタンスの位置を中間(x軸)に移動させる
108
- #ブロックでは、数値を返却することで、真ん中からのマージンを設定できる
123
+ #返却値:: 自分自身
124
+ def center
125
+ base = @layout.base.rect
126
+ t = @layout.pos[0]
127
+ @layout.pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
128
+ update_layout(@layout.pos[0]-t, 0)
129
+ @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
130
+ return self
131
+ end
132
+
133
+ #===mixinしたインスタンスの位置を右端(x軸)に移動させる
134
+ #設置するとき、基準となる空間の内側に設置される
135
+ #ブロックでは、数値を返却することで、右端からのマージンを設定できる(負の方向へ移動)
109
136
  #ブロック引数は、自分自身の幅
110
- #_side_:: 設置する側。但し機能するのは :between のみ。デフォルトは :between
111
137
  #返却値:: 自分自身
112
- def center(side=:between, &margin)
113
- set_layout_inner(0, @layout.middle[side], margin)
114
- return self
138
+ def right(&margin)
139
+ base = @layout.base.rect
140
+ t = @layout.pos[0]
141
+ @layout.pos[0] = base[0] + base[2] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
142
+ update_layout(@layout.pos[0]-t, 0)
143
+ @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
144
+ return self
115
145
  end
116
146
 
117
147
  #===mixinしたインスタンスの位置を右端(x軸)に移動させる
118
- #ブロックでは、数値を返却することで、右端からのマージンを設定できる
148
+ #設置するとき、基準となる空間の外側に設置される
149
+ #ブロックでは、数値を返却することで、右端からのマージンを設定できる(正の方向へ移動)
119
150
  #ブロック引数は、自分自身の幅
120
- #_side_:: 設置する側。:inside、:between、:outside の3種類ある。デフォルトは :inside
121
151
  #返却値:: 自分自身
122
- def right(side=:inside, &margin)
123
- set_layout_inner(0, @layout.upper[side], margin)
124
- return self
152
+ def outside_right(&margin)
153
+ base = @layout.base.rect
154
+ t = @layout.pos[0]
155
+ @layout.pos[0] = base[0] + base[2] + (margin ? margin[base[2]].to_i : 0)
156
+ update_layout(@layout.pos[0]-t, 0)
157
+ @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)}
158
+ return self
125
159
  end
126
160
 
127
161
  #===mixinしたインスタンスの位置を上端(y軸)に移動させる
128
- #ブロックでは、数値を返却することで、上端からのマージンを設定できる
162
+ #設置するとき、基準となる空間の内側に設置される
163
+ #ブロックでは、数値を返却することで、上端からのマージンを設定できる(正の方向へ移動)
129
164
  #ブロック引数は、自分自身の幅
130
- #_side_:: 設置する側。:inside、:between、:outside の3種類ある。デフォルトは :inside
131
165
  #返却値:: 自分自身
132
- def top(side=:inside, &margin)
133
- set_layout_inner(1, @layout.lower[side], margin)
134
- return self
166
+ def top(&margin)
167
+ base = @layout.base.rect
168
+ t = @layout.pos[1]
169
+ @layout.pos[1] = base[1] + (margin ? margin[base[3]].to_i : 0)
170
+ update_layout(0, @layout.pos[1]-t)
171
+ @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
172
+ return self
135
173
  end
136
174
 
137
- #===mixinしたインスタンスの位置を中間(y軸)に移動させる
138
- #ブロックでは、数値を返却することで、真ん中からのマージンを設定できる
175
+ #===mixinしたインスタンスの位置を上端(y軸)に移動させる
176
+ #設置するとき、基準となる空間の内側に設置される
177
+ #ブロックでは、数値を返却することで、上端からのマージンを設定できる(負の方向へ移動)
139
178
  #ブロック引数は、自分自身の幅
140
- #_side_:: 設置する側。但し機能するのは :between のみ。デフォルトは :between
141
179
  #返却値:: 自分自身
142
- def middle(side=:between, &margin)
143
- set_layout_inner(1, @layout.middle[side], margin)
144
- return self
180
+ def outside_top(&margin)
181
+ base = @layout.base.rect
182
+ t = @layout.pos[1]
183
+ @layout.pos[1] = base[1] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
184
+ update_layout(0, @layout.pos[1]-t)
185
+ @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
186
+ return self
187
+ end
188
+
189
+ #===mixinしたインスタンスの位置を中間(y軸)に移動させる
190
+ #返却値:: 自分自身
191
+ def middle
192
+ base = @layout.base.rect
193
+ t = @layout.pos[1]
194
+ @layout.pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
195
+ update_layout(0, @layout.pos[1]-t)
196
+ @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
197
+ return self
145
198
  end
146
199
 
147
200
  #===mixinしたインスタンスの位置を下端(y軸)に移動させる
148
- #ブロックでは、数値を返却することで、下端からのマージンを設定できる
201
+ #設置するとき、基準となる空間の内側に設置される
202
+ #ブロックでは、数値を返却することで、下端からのマージンを設定できる(負の方向へ移動)
149
203
  #ブロック引数は、自分自身の幅
150
- #_side_:: 設置する側。:inside、:between、:outside の3種類ある。デフォルトは :inside
151
204
  #返却値:: 自分自身
152
- def bottom(side=:inside, &margin)
153
- set_layout_inner(1, @layout.upper[side], margin)
154
- return self
205
+ def bottom(&margin)
206
+ base = @layout.base.rect
207
+ t = @layout.pos[1]
208
+ @layout.pos[1] = base[1] + base[3] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
209
+ update_layout(0, @layout.pos[1]-t)
210
+ @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
211
+ return self
155
212
  end
156
213
 
157
- def set_layout_inner(pos, lambda, margin) #:nodoc:
158
- @layout.loc[pos] = lambda
159
- @layout.margin[pos] = margin || @layout.zero
160
- @layout.off.x = 0 if pos == 0
161
- @layout.off.y = 0 if pos == 1
162
- calc_layout
214
+ #===mixinしたインスタンスの位置を下端(y軸)に移動させる
215
+ #設置するとき、基準となる空間の外側に設置される
216
+ #ブロックでは、数値を返却することで、下端からのマージンを設定できる(正の方向へ移動)
217
+ #ブロック引数は、自分自身の幅
218
+ #返却値:: 自分自身
219
+ def outside_bottom(&margin)
220
+ base = @layout.base.rect
221
+ t = @layout.pos[1]
222
+ @layout.pos[1] = base[1] + base[3] + (margin ? margin[base[3]].to_i : 0)
223
+ update_layout(0, @layout.pos[1]-t)
224
+ @layout.on_move.each{|block| block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)}
225
+ return self
163
226
  end
164
-
165
- private :set_layout_inner
166
227
 
167
228
  #===レイアウトに関するインスタンスを解放する
168
229
  #インスタンス変数 @layout 内のインスタンスを解放する
@@ -220,102 +281,29 @@ module Miyako
220
281
  end
221
282
 
222
283
  #===インスタンスのサイズをレイアウト情報に反映させる
284
+ #このメソッドが呼び出されると、スナップ先のインスタンスの位置情報がリセットされることに注意
223
285
  #_w_:: インスタンスの幅(たとえば、Sprite#ow の値)
224
286
  #_h_:: インスタンスの幅(たとえば、Sprite#oh の値)
225
287
  #返却値:: 自分自身を返す
226
288
  def set_layout_size(w, h)
227
289
  @layout.size[0] = w
228
290
  @layout.size[1] = h
229
- calc_layout
230
291
  return self
231
292
  end
232
293
 
233
- def get_base_width #:nodoc:
234
- return @layout.base[2] || Screen.w
235
- end
236
-
237
- def get_base_height #:nodoc:
238
- return @layout.base[3] || Screen.h
239
- end
240
-
241
- private :get_base_width, :get_base_height
242
-
243
294
  #===レイアウト情報の値を更新する
244
- def calc_layout
245
- @layout.pos[0] = @layout.loc[0][0, get_base_width] + @layout.off[0]
246
- @layout.pos[1] = @layout.loc[1][1, get_base_height] + @layout.off[1]
295
+ #_dx_:: 位置の変化量(x方向)
296
+ #_dx_:: 位置の変化量(y方向)
297
+ def update_layout(dx, dy)
247
298
  update_layout_position
248
- @layout.snap.children.each{|sc|
249
- sc.snap
250
- }
251
- end
252
-
253
- #===あとで書く
254
- #_w_:: あとで書く
255
- #_h_:: あとで書く
256
- #返却値:: あとで書く
257
- def set_base_size(w, h)
258
- @layout.base[2] = w
259
- @layout.base[3] = h
260
- calc_layout
261
- return self
262
- end
263
-
264
- #===あとで書く
265
- #返却値:: あとで書く
266
- def reset_base_size
267
- @layout.base[2] = nil
268
- @layout.base[3] = nil
269
- calc_layout
270
- return self
271
- end
272
-
273
- #===あとで書く
274
- #_x_:: あとで書く
275
- #_y_:: あとで書く
276
- #返却値:: あとで書く
277
- def set_base_point(x, y)
278
- @layout.base[0], @layout.base[1] = [x, y]
279
- calc_layout
280
- return self
299
+ @layout.snap.children.each{|sc| sc.update_layout(dx, dy) }
281
300
  end
282
301
 
283
- #===あとで書く
284
- #_x_:: あとで書く
285
- #_y_:: あとで書く
286
- #_w_:: あとで書く
287
- #_h_:: あとで書く
288
- #返却値:: あとで書く
289
- def set_base(x, y, w, h)
290
- @layout.base[0] = x
291
- @layout.base[1] = y
292
- @layout.base[2] = w
293
- @layout.base[3] = h
294
- calc_layout
295
- return self
296
- end
297
-
298
- #===あとで書く
299
- #返却値:: あとで書く
300
- def reset_base
301
- @layout.base[0] = 0
302
- @layout.base[1] = 0
303
- @layout.base[2] = nil
304
- @layout.base[3] = nil
305
- calc_layout
306
- return self
307
- end
308
-
309
- #===あとで書く
310
- #返却値:: あとで書く
311
- def get_base
312
- return @layout.base
313
- end
314
-
315
- #===あとで書く
316
- #返却値:: あとで書く
302
+ #===インスタンスの位置・大きさを求める
303
+ #インスタンスの位置・大きさをRect構造体で求める
304
+ #返却値:: Rect構造体
317
305
  def rect
318
- return Rect.new(*(@layout.pos.to_a + @layout.size.to_a))
306
+ return Rect.new(@layout.pos[0], @layout.pos[1], @layout.size[0], @layout.size[1])
319
307
  end
320
308
 
321
309
  #===インスタンスのレイアウトを指定の別のインスタンスに依存(スナップ)させる
@@ -329,35 +317,27 @@ module Miyako
329
317
  @layout.snap.sprite = spr
330
318
  spr.add_snap_child(self)
331
319
  end
332
- if @layout.snap.sprite
333
- rect = @layout.snap.sprite.rect
334
- @layout.base[0] = rect[0]
335
- @layout.base[1] = rect[1]
336
- @layout.base[2] = rect[2]
337
- @layout.base[3] = rect[3]
338
- end
339
- calc_layout
320
+ @layout.base = @layout.snap.sprite || Screen
340
321
  return self
341
322
  end
342
323
 
343
324
  #===すべてのインスタンスとの依存関係を解消する
325
+ #このメソッドが呼び出されると、スナップ先のインスタンスの位置情報がリセットされることに注意
344
326
  #返却値:: 自分自身を返す
345
327
  def reset_snap
346
328
  @layout.snap.sprite =nil
329
+ @layout.base = Screen
347
330
  @layout.snap.children = Array.new
348
- calc_layout
349
331
  return self
350
332
  end
351
333
 
352
334
  def add_snap_child(spr) #:nodoc:
353
- @layout.snap.children.push(spr) unless @layout.snap.children.include?(spr)
354
- calc_layout
335
+ @layout.snap.children << spr unless @layout.snap.children.include?(spr)
355
336
  return self
356
337
  end
357
338
 
358
339
  def delete_snap_child(spr) #:nodoc:
359
340
  spr.each{|s| @layout.snap.children.delete(s) }
360
- calc_layout
361
341
  return self
362
342
  end
363
343
 
@@ -368,10 +348,7 @@ module Miyako
368
348
  def set_snap_children(cs) #:nodoc:
369
349
  @layout.snap.children.each{|c| c.set_snap_sprite(nil) }
370
350
  @layout.snap.children = cs
371
- @layout.snap.children.each{|c|
372
- c.set_snap_sprite(self)
373
- }
374
- calc_layout
351
+ @layout.snap.children.each{|c| c.set_snap_sprite(self) }
375
352
  return self
376
353
  end
377
354
 
@@ -383,7 +360,6 @@ module Miyako
383
360
  @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
384
361
  @layout.snap.sprite = ss
385
362
  @layout.snap.sprite.add_snap_child(self) if @layout.snap.sprite
386
- calc_layout
387
363
  return self
388
364
  end
389
365
 
@@ -396,23 +372,29 @@ module Miyako
396
372
  end
397
373
 
398
374
  #===インスタンスを指定の移動量で移動させる
375
+ #ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
399
376
  #_x_:: x 座標の移動量
400
377
  #_y_:: y 座標の移動量
401
378
  #返却値:: 自分自身を返す
402
379
  def move(x, y)
403
- @layout.off[0] = @layout.off[0] + x
404
- @layout.off[1] = @layout.off[1] + y
405
- calc_layout
406
- return self
407
380
  end
408
381
 
409
382
  #===インスタンスを指定の位置に移動させる
383
+ #ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す
410
384
  #_x_:: 移動後の x 座標の位置
411
385
  #_y_:: 移動後の y 座標の位置
412
386
  #返却値:: 自分自身を返す
413
- def move_to(x, y)
414
- move(x - @layout.pos[0], y - @layout.pos[1])
415
- return self
387
+ def move_to(x, y, &block)
388
+ end
389
+
390
+ #===Segment構造体を生成する
391
+ # 生成される線分は、x方向が[pos.x,pos.x+ow-1]、y方向が[pos.y,pos.y+oh-1]となる
392
+ #返却値:: 生成したSegment構造体インスタンス
393
+ def segment
394
+ return Segment.new([@layout.pos[0],
395
+ @layout.pos[0]+@layout.size[0]-1],
396
+ [@layout.pos[1],
397
+ @layout.pos[1]+@layout.size[1]-1])
416
398
  end
417
399
  end
418
400