Module: Miyako::Layout

Included in:
ChoiceStruct, Choices, FixedMap, Font, LayoutSpace, ListPairStruct, Movie, Parts, Slide, Sprite, SpriteAnimation, SpriteList, TextBox
Defined in:
lib/Miyako/API/layout.rb

Overview

レイアウト管理モジュール

位置情報やスナップ、座標丸めなどを管理する 本モジュールはmixinすることで機能する。 また、mixinする場合は、以下の処理を施すこと 1.クラスのinitializeメソッドの最初にinit_layoutメソッドを呼び出す 2.update_layout_positionメソッドを実装する なお、本モジュールをmixinした場合は、インスタンス変数 @layout が予約される。 @layoutへのユーザアクセスは参照のみ許される。

Instance Method Summary collapse

Instance Method Details

#add_snap_child(spr) ⇒ Object

:nodoc:



526
527
528
529
# File 'lib/Miyako/API/layout.rb', line 526

def add_snap_child(spr) #:nodoc:
  @layout.snap.children << spr unless @layout.snap.children.include?(spr)
  return self
end

#bottom(&margin) ⇒ Object

ブロックでは、数値を返却することで、下端からのマージンを設定できる(負の方向へ移動) ブロック引数は、自分自身の幅

返却値

移動後の位置(Position構造体)



383
384
385
386
387
388
# File 'lib/Miyako/API/layout.rb', line 383

def bottom(&margin)
			base = @layout.base.rect
			pos = @layout.pos.dup
			pos[1] = base[1] + base[3] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
  return pos
end

#bottom!(&margin) ⇒ Object

ブロックでは、数値を返却することで、下端からのマージンを設定できる(負の方向へ移動) ブロック引数は、自分自身の幅

返却値

自分自身



244
245
246
247
248
249
250
251
252
253
# File 'lib/Miyako/API/layout.rb', line 244

def bottom!(&margin)
			base = @layout.base.rect
			t = @layout.pos[1]
			@layout.pos[1] = base[1] + base[3] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
  update_layout(0, @layout.pos[1]-t)
  @layout.on_move.each{|block|
    block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
  }
			return self
end

#broad_rectObject

領域の最大矩形を取得するメソッドのテンプレート

返却値

Rect構造体インスタンス(デフォルトはnil)



491
492
493
# File 'lib/Miyako/API/layout.rb', line 491

def broad_rect
  return self.rect
end

#centerObject

返却値

移動後の位置(Position構造体)



308
309
310
311
312
313
# File 'lib/Miyako/API/layout.rb', line 308

def center
			base = @layout.base.rect
			pos = @layout.pos.dup
			pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
  return pos
end

#center!Object

mixinしたインスタンスの位置を中間(x軸)に移動させる

返却値

自分自身



151
152
153
154
155
156
157
158
159
160
# File 'lib/Miyako/API/layout.rb', line 151

def center!
			base = @layout.base.rect
			t = @layout.pos[0]
			@layout.pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
  update_layout(@layout.pos[0]-t, 0)
  @layout.on_move.each{|block|
    block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
  }
			return self
end

#centeringObject

返却値

移動後の位置(Position構造体)



406
407
408
409
410
411
412
# File 'lib/Miyako/API/layout.rb', line 406

def centering
			base = @layout.base.rect
			pos = @layout.pos.dup
			pos[0] = base[0] + (base[2] >> 1) - (@layout.size[0] >> 1)
			pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
  return pos
end

#centering!Object

インスタンスを画面(スナップ先インスタンス)の中心に移動する

返却値

自分自身を返す



273
274
275
276
277
# File 'lib/Miyako/API/layout.rb', line 273

def centering!
  center!
  middle!
  return self
end

#copy_layoutObject

レイアウト管理の複写



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/Miyako/API/layout.rb', line 83

def copy_layout
  tmp = @layout
  @layout = tmp.dup
  @layout.pos  = Point.new(*tmp.pos)
  @layout.size = Size.new(*tmp.size)
  @layout.on_move = tmp.on_move.dup

  @layout.snap = tmp.snap.dup
  # スナップ関係を解消
  if @layout.snap.sprite
    @layout.snap.sprite.delete_snap_child(self)
    @layout.snap.sprite = nil
    @layout.base = Screen
  end
  @layout.snap.children = []
end

#delete_snap_child(spr) ⇒ Object

:nodoc:



531
532
533
534
# File 'lib/Miyako/API/layout.rb', line 531

def delete_snap_child(spr) #:nodoc:
  spr.each{|s| @layout.snap.children.delete(s) }
  return self
end

#get_snap_childrenObject

:nodoc:



536
537
538
# File 'lib/Miyako/API/layout.rb', line 536

def get_snap_children #:nodoc:
  return @layout.snap.children
end

#get_snap_spriteObject

:nodoc:



547
548
549
# File 'lib/Miyako/API/layout.rb', line 547

def get_snap_sprite #:nodoc:
  return @layout.snap.sprite
end

#hObject

mixin されたインスタンスの高さを取得する

返却値

インスタンスの高さ(@layout[:size][1]の値)



441
442
443
# File 'lib/Miyako/API/layout.rb', line 441

def h
  return @layout.size[1]
end

#include_snap_child?(spr) ⇒ Boolean

すでに指定したスプライトがスナップ元として登録されているかどうか確認する

返却値

スナップ元として登録されていればtrue、登録されていなければfalse

Returns:

  • (Boolean)


522
523
524
# File 'lib/Miyako/API/layout.rb', line 522

def include_snap_child?(spr)
  @layout.snap.children.include?(spr)
end

#init_layoutObject

レイアウト管理の初期化

mixin したクラスの initialize メソッド内で必ず呼び出しておくこと



73
74
75
76
77
78
79
80
# File 'lib/Miyako/API/layout.rb', line 73

def init_layout
  @layout = LayoutStruct.new
  @layout.pos  = Point.new(0, 0)
  @layout.size = Size.new(0, 0)
  @layout.base = Screen
  @layout.snap = LayoutSnapStruct.new(nil, Array.new)
  @layout.on_move = []
end

#layout_disposeObject

レイアウトに関するインスタンスを解放する

インスタンス変数 @layout 内のインスタンスを解放する



416
417
418
419
# File 'lib/Miyako/API/layout.rb', line 416

def layout_dispose
  @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
  @layout.snap.children.each{|sc| sc.reset_snap }
end

#left(&margin) ⇒ Object

ブロックでは、数値を返却することで、左端からのマージンを設定できる(正の方向へ移動) ブロック引数は、自分自身の幅

返却値

移動後の位置(Position構造体)



285
286
287
288
289
290
# File 'lib/Miyako/API/layout.rb', line 285

def left(&margin)
			base = @layout.base.rect
			pos = @layout.pos.dup
			pos[0] = base[0] + (margin ? margin[base[2]].to_i : 0)
  return pos
end

#left!(&margin) ⇒ Object

ブロックでは、数値を返却することで、左端からのマージンを設定できる(正の方向へ移動) ブロック引数は、自分自身の幅

返却値

自分自身



121
122
123
124
125
126
127
128
129
130
131
# File 'lib/Miyako/API/layout.rb', line 121

def left!(&margin)
			base = @layout.base.rect
			t = @layout.pos[0]
			@layout.pos[0] = base[0] + (margin ? margin[base[2]].to_i : 0)
  @layout.snap.children.each{|c| c.left(&margin) }
  update_layout(@layout.pos[0]-t, 0)
  @layout.on_move.each{|block|
    block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
  }
			return self
end

#middleObject

返却値

移動後の位置(Position構造体)



370
371
372
373
374
375
# File 'lib/Miyako/API/layout.rb', line 370

def middle
			base = @layout.base.rect
			pos = @layout.pos.dup
			pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
  return pos
end

#middle!Object

mixinしたインスタンスの位置を中間(y軸)に移動させる

返却値

自分自身



228
229
230
231
232
233
234
235
236
237
# File 'lib/Miyako/API/layout.rb', line 228

def middle!
			base = @layout.base.rect
			t = @layout.pos[1]
			@layout.pos[1] = base[1] + (base[3] >> 1) - (@layout.size[1] >> 1)
  update_layout(0, @layout.pos[1]-t)
  @layout.on_move.each{|block|
    block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
  }
			return self
end

#move(x, y) ⇒ Object

インスタンスを指定の移動量で移動させた位置を返す

引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す 自分自身の位置は変わらない

x

x 座標の移動量

y

y 座標の移動量

返却値

更新後の値を設定したインスタンス



588
589
590
591
# File 'lib/Miyako/API/layout.rb', line 588

def move(x, y)
  ret = @layout.pos.dup
  ret.move!(x,y)
end

#move!(x, y) ⇒ Object

インスタンスを指定の移動量で移動させる

ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す

x

x 座標の移動量

y

y 座標の移動量

返却値

自分自身を返す



563
564
# File 'lib/Miyako/API/layout.rb', line 563

def move!(x, y)
end

#move_to(x, y) ⇒ Object

インスタンスを指定の位置に移動させた位置を返す

引数で指定したぶん移動させたときの位置を新しくインスタンスを生成して返す 自分自身の位置は変わらない

x

移動後の x 座標の位置

y

移動後の y 座標の位置

返却値

更新後の値を設定したインスタンス



599
600
601
602
# File 'lib/Miyako/API/layout.rb', line 599

def move_to(x, y)
  ret = @layout.pos.dup
  ret.move_to!(x,y)
end

#move_to!(x, y, &block) ⇒ Object

インスタンスを指定の位置に移動させる

ブロックを渡したとき、ブロックの評価した結果、偽になったときは移動させた値を元に戻す

x

移動後の x 座標の位置

y

移動後の y 座標の位置

返却値

自分自身を返す



571
572
# File 'lib/Miyako/API/layout.rb', line 571

def move_to!(x, y, &block)
end

#on_moveObject

位置移動時に呼び出すブロックを管理する配列にアクセする

moveやleftメソッドを呼び出した時に評価したいブロックを渡すことで、 付随処理を自律して行うことが出来る。 引数は、|self, x, y, dx, dy|の5つ。 各引数は、

「レシーバ, 移動後x座標位置, 移動後y座標位置, x座標移動量, y座標移動量」

の機能がある。 評価が行われるのは、

left,outside_left,center,right,outside_right,top,
outside_top,middle,bottom,outside_bottom,
move,move_toの各メソッド。
返却値

ブロック管理配列



112
113
114
# File 'lib/Miyako/API/layout.rb', line 112

def on_move
			return @layout.on_move
end

#outside_bottom(&margin) ⇒ Object

ブロックでは、数値を返却することで、下端からのマージンを設定できる(正の方向へ移動) ブロック引数は、自分自身の幅

返却値

移動後の位置(Position構造体)



396
397
398
399
400
401
# File 'lib/Miyako/API/layout.rb', line 396

def outside_bottom(&margin)
			base = @layout.base.rect
			pos = @layout.pos.dup
			pos[1] = base[1] + base[3] + (margin ? margin[base[3]].to_i : 0)
  return pos
end

#outside_bottom!(&margin) ⇒ Object

ブロックでは、数値を返却することで、下端からのマージンを設定できる(正の方向へ移動) ブロック引数は、自分自身の幅

返却値

自分自身



260
261
262
263
264
265
266
267
268
269
# File 'lib/Miyako/API/layout.rb', line 260

def outside_bottom!(&margin)
			base = @layout.base.rect
			t = @layout.pos[1]
			@layout.pos[1] = base[1] + base[3] + (margin ? margin[base[3]].to_i : 0)
  update_layout(0, @layout.pos[1]-t)
  @layout.on_move.each{|block|
    block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
  }
			return self
end

#outside_left(&margin) ⇒ Object

ブロックでは、数値を返却することで、左端からのマージンを設定できる(負の方向へ移動) ブロック引数は、自分自身の幅

返却値

移動後の位置(Position構造体)



298
299
300
301
302
303
# File 'lib/Miyako/API/layout.rb', line 298

def outside_left(&margin)
			base = @layout.base.rect
			pos = @layout.pos.dup
			pos[0] = base[0] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
  return pos
end

#outside_left!(&margin) ⇒ Object

ブロックでは、数値を返却することで、左端からのマージンを設定できる(負の方向へ移動) ブロック引数は、自分自身の幅

返却値

自分自身



138
139
140
141
142
143
144
145
146
147
# File 'lib/Miyako/API/layout.rb', line 138

def outside_left!(&margin)
			base = @layout.base.rect
			t = @layout.pos[0]
			@layout.pos[0] = base[0] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
  update_layout(@layout.pos[0]-t, 0)
  @layout.on_move.each{|block|
    block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
  }
			return self
end

#outside_right(&margin) ⇒ Object

ブロックでは、数値を返却することで、右端からのマージンを設定できる(正の方向へ移動) ブロック引数は、自分自身の幅

返却値

移動後の位置(Position構造体)



334
335
336
337
338
339
# File 'lib/Miyako/API/layout.rb', line 334

def outside_right(&margin)
			base = @layout.base.rect
			pos = @layout.pos.dup
			pos[0] = base[0] + base[2] + (margin ? margin[base[2]].to_i : 0)
  return pos
end

#outside_right!(&margin) ⇒ Object

ブロックでは、数値を返却することで、右端からのマージンを設定できる(正の方向へ移動) ブロック引数は、自分自身の幅

返却値

自分自身



183
184
185
186
187
188
189
190
191
192
# File 'lib/Miyako/API/layout.rb', line 183

def outside_right!(&margin)
			base = @layout.base.rect
			t = @layout.pos[0]
			@layout.pos[0] = base[0] + base[2] + (margin ? margin[base[2]].to_i : 0)
  update_layout(@layout.pos[0]-t, 0)
  @layout.on_move.each{|block|
    block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
  }
			return self
end

#outside_top(&margin) ⇒ Object

ブロックでは、数値を返却することで、上端からのマージンを設定できる(負の方向へ移動) ブロック引数は、自分自身の幅

返却値

移動後の位置(Position構造体)



360
361
362
363
364
365
# File 'lib/Miyako/API/layout.rb', line 360

def outside_top(&margin)
			base = @layout.base.rect
			pos = @layout.pos.dup
			pos[1] = base[1] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
  return pos
end

#outside_top!(&margin) ⇒ Object

ブロックでは、数値を返却することで、上端からのマージンを設定できる(負の方向へ移動) ブロック引数は、自分自身の幅

返却値

自分自身



215
216
217
218
219
220
221
222
223
224
# File 'lib/Miyako/API/layout.rb', line 215

def outside_top!(&margin)
			base = @layout.base.rect
			t = @layout.pos[1]
			@layout.pos[1] = base[1] - @layout.size[1] - (margin ? margin[base[3]].to_i : 0)
  update_layout(0, @layout.pos[1]-t)
  @layout.on_move.each{|block|
    block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
  }
			return self
end

#posObject Also known as: layout_pos

mixin されたインスタンスの位置情報(x,yの値)を取得する

返却値

インスタンスの位置情報(@layout[:pos]の値)



447
448
449
# File 'lib/Miyako/API/layout.rb', line 447

def pos
  return @layout.pos
end

#rectObject

インスタンスの位置・大きさを求める

インスタンスの位置・大きさをRect構造体で求める

返却値

Rect構造体



485
486
487
# File 'lib/Miyako/API/layout.rb', line 485

def rect
  return Rect.new(@layout.pos[0], @layout.pos[1], @layout.size[0], @layout.size[1])
end

#relative_move_to(x, y) ⇒ Object

相対座標でインスタンスを指定の位置に移動させた位置を返す

スナップ先の左上位置をとしたときの座標(相対座標)で、指定の位置に移動したときの 位置を新しくインスタンスを生成して返す

x

移動後の x 座標の位置

y

移動後の y 座標の位置

返却値

更新後の位置を設定したインスタンス(Size構造体)



610
611
612
613
# File 'lib/Miyako/API/layout.rb', line 610

def relative_move_to(x, y)
  bpos = @layout.base.pos
  Point.new(bpos.x+x,bpos.y+y)
end

#relative_move_to!(x, y) ⇒ Object

相対座標でインスタンスを指定の位置に移動させる

スナップ先の左上位置をとしたときの座標(相対座標)で、指定の位置に移動する

x

移動後の x 座標の位置

y

移動後の y 座標の位置

返却値

自分自身を返す



579
580
# File 'lib/Miyako/API/layout.rb', line 579

def relative_move_to!(x, y)
end

#reset_snapObject

返却値

自分自身を返す



513
514
515
516
517
518
# File 'lib/Miyako/API/layout.rb', line 513

def reset_snap
  @layout.snap.sprite = nil
  @layout.base = Screen
  @layout.snap.children = Array.new
  return self
end

#right(&margin) ⇒ Object

ブロックでは、数値を返却することで、右端からのマージンを設定できる(負の方向へ移動) ブロック引数は、自分自身の幅

返却値

移動後の位置(Position構造体)



321
322
323
324
325
326
# File 'lib/Miyako/API/layout.rb', line 321

def right(&margin)
			base = @layout.base.rect
			pos = @layout.pos.dup
			pos[0] = base[0] + base[2] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
  return pos
end

#right!(&margin) ⇒ Object

ブロックでは、数値を返却することで、右端からのマージンを設定できる(負の方向へ移動) ブロック引数は、自分自身の幅

返却値

自分自身



167
168
169
170
171
172
173
174
175
176
# File 'lib/Miyako/API/layout.rb', line 167

def right!(&margin)
			base = @layout.base.rect
			t = @layout.pos[0]
			@layout.pos[0] = base[0] + base[2] - @layout.size[0] - (margin ? margin[base[2]].to_i : 0)
  update_layout(@layout.pos[0]-t, 0)
  @layout.on_move.each{|block|
    block.call(self, @layout.pos[0], @layout.pos[1], @layout.pos[0]-t, 0)
  }
			return self
end

#segmentObject

Segment構造体を生成する

生成される線分は、x方向がy方向がとなる

返却値

生成したSegments構造体インスタンス



618
619
620
621
622
623
# File 'lib/Miyako/API/layout.rb', line 618

def segment
			return Segments.new([@layout.pos[0],
                      @layout.pos[0]+@layout.size[0]-1],
                  [@layout.pos[1],
                      @layout.pos[1]+@layout.size[1]-1])
end

#set_layout_size(w, h) ⇒ Object

w

インスタンスの幅(たとえば、Sprite#ow の値)

h

インスタンスの幅(たとえば、Sprite#oh の値)

返却値

自分自身を返す



468
469
470
471
472
# File 'lib/Miyako/API/layout.rb', line 468

def set_layout_size(w, h)
  @layout.size[0] = w
  @layout.size[1] = h
  return self
end

#set_snap_children(cs) ⇒ Object

:nodoc:



540
541
542
543
544
545
# File 'lib/Miyako/API/layout.rb', line 540

def set_snap_children(cs) #:nodoc:
  @layout.snap.children.each{|c| c.set_snap_sprite(nil) }
  @layout.snap.children = cs
  @layout.snap.children.each{|c| c.set_snap_sprite(self) }
  return self
end

#set_snap_sprite(ss) ⇒ Object

:nodoc:



551
552
553
554
555
556
# File 'lib/Miyako/API/layout.rb', line 551

def set_snap_sprite(ss) #:nodoc:
  @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
  @layout.snap.sprite = ss
  @layout.snap.sprite.add_snap_child(self) if @layout.snap.sprite
  return self
end

#sizeObject Also known as: layout_size

mixin されたインスタンスのサイズ情報(w,hの値)を取得する

返却値

インスタンスのサイズ情報(@layout[:size]の値)



456
457
458
# File 'lib/Miyako/API/layout.rb', line 456

def size
  return @layout.size
end

#snap(spr = nil) ⇒ Object

インスタンスのレイアウトを指定の別のインスタンスに依存(スナップ)させる

引数 spr で指定したインスタンスのレイアウト情報は、レシーバのレイアウト情報に依存した位置情報を算出される デフォルトでは、画面にスナップされている状態になっている

spr

位置情報を依存させるインスタンス。デフォルトは nil (画面が対象になる)

返却値

自分自身を返す



500
501
502
503
504
505
506
507
508
# File 'lib/Miyako/API/layout.rb', line 500

def snap(spr = nil)
  if spr
    @layout.snap.sprite.delete_snap_child(self) if @layout.snap.sprite
    @layout.snap.sprite = spr
    spr.add_snap_child(self)
  end
  @layout.base = @layout.snap.sprite || Screen
  return self
end

#top(&margin) ⇒ Object

ブロックでは、数値を返却することで、上端からのマージンを設定できる(正の方向へ移動) ブロック引数は、自分自身の幅

返却値

移動後の位置(Position構造体)



347
348
349
350
351
352
# File 'lib/Miyako/API/layout.rb', line 347

def top(&margin)
			base = @layout.base.rect
			pos = @layout.pos.dup
			pos[1] = base[1] + (margin ? margin[base[3]].to_i : 0)
  return pos
end

#top!(&margin) ⇒ Object

ブロックでは、数値を返却することで、上端からのマージンを設定できる(正の方向へ移動) ブロック引数は、自分自身の幅

返却値

自分自身



199
200
201
202
203
204
205
206
207
208
# File 'lib/Miyako/API/layout.rb', line 199

def top!(&margin)
			base = @layout.base.rect
			t = @layout.pos[1]
			@layout.pos[1] = base[1] + (margin ? margin[base[3]].to_i : 0)
  update_layout(0, @layout.pos[1]-t)
  @layout.on_move.each{|block|
    block.call(self, @layout.pos[0], @layout.pos[1], 0, @layout.pos[1]-t)
  }
			return self
end

#update_layout(dx, dy) ⇒ Object

レイアウト情報の値を更新する

dx

位置の変化量(x方向)

dx

位置の変化量(y方向)



477
478
479
480
# File 'lib/Miyako/API/layout.rb', line 477

def update_layout(dx, dy)
  update_layout_position
  @layout.snap.children.each{|sc| sc.update_layout(dx, dy) }
end

#update_layout_positionObject

現在の位置情報を別のインスタンス変数に反映させるためのテンプレートメソッド

move や centering などのメソッドを呼び出した際に@layout[:pos]の値を反映させるときに使う (例)@sprite.move!(*@layout[:pos])



68
69
# File 'lib/Miyako/API/layout.rb', line 68

def update_layout_position
end

#wObject

mixin されたインスタンスの幅を取得する

返却値

インスタンスの幅(@layout[:size][0]の値)



435
436
437
# File 'lib/Miyako/API/layout.rb', line 435

def w
  return @layout.size[0]
end

#xObject

mixin されたインスタンスの x 座標の値を取得する

返却値

x 座標の値(@layout[:pos][0]の値)



423
424
425
# File 'lib/Miyako/API/layout.rb', line 423

def x
  return @layout.pos[0]
end

#yObject

mixin されたインスタンスの y 座標の値を取得する

返却値

y 座標の値(@layout[:pos][1]の値)



429
430
431
# File 'lib/Miyako/API/layout.rb', line 429

def y
  return @layout.pos[1]
end