Class: Miyako::Map::MapLayer

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Animation, SpriteBase
Defined in:
lib/Miyako/API/map.rb

Overview

:nodoc: all

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Animation

[], []=, anim_hash, #reset, reset, start, #start, #stop, stop, update, update_animation, #update_animation

Methods included from SpriteBase

#bitmap, #hide, #image_rect, #image_size, #oh, #oh=, #ow, #ow=, #ox, #ox=, #oy, #oy=, #part_rect, #rect, #render_d, #render_xy, #render_xy_to, #show, #to_sprite, #to_unit, #update

Constructor Details

#initialize(mapchip, mapdat, layer_size) ⇒ MapLayer

:nodoc:



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/Miyako/API/map.rb', line 57

def initialize(mapchip, mapdat, layer_size) #:nodoc:
  @mapchip = mapchip
  @pos = Point.new(0, 0)
  @size = layer_size.dup
  @ow = @mapchip.chip_size.w
  @oh = @mapchip.chip_size.h
  @real_size = Size.new(@size.w * @ow, @size.h * @oh)
  @mapdat = mapdat
  @baseimg = @mapchip.chip_image
  @divpx = get_div_array(0, @real_size.w, @ow)
  @divpy = get_div_array(0, @real_size.h, @oh)
  @modpx = get_mod_array(0, @real_size.w, @ow)
  @modpy = get_mod_array(0, @real_size.h, @oh)
  @modpx2 = get_mod_array(0, @size.w * 2 + 1, @size.w)
  @modpy2 = get_mod_array(0, @size.h * 2 + 1, @size.h)
  @cdivsx = get_div_array(0, @mapchip.chips, @mapchip.size.w)
  @cmodsx = get_mod_array(0, @mapchip.chips, @mapchip.size.w)
  @cdivsy = get_div_array(0, @mapchip.chips, @mapchip.size.h)
  @cmodsy = get_mod_array(0, @mapchip.chips, @mapchip.size.h)
  @cdivsx = @cdivsx.map{|v| v * @ow }
  @cdivsy = @cdivsy.map{|v| v * @oh }
  @cmodsx = @cmodsx.map{|v| v * @ow }
  @cmodsy = @cmodsy.map{|v| v * @oh }
  @mapchip_units = Array.new(@mapchip.chips){|idx|
    SpriteUnitFactory.create(:bitmap=>@baseimg.bitmap,
                             :ox => (idx % @mapchip.size.w) * @ow,
                             :oy => (idx / @mapchip.size.w) * @oh,
                             :ow => @ow,
                             :oh => @oh)
  }
  @visible = true
  @def_ignore = -1
  @ignore_list = []
  resize
end

Instance Attribute Details

#ignore_listObject (readonly)

Returns the value of attribute ignore_list.



44
45
46
# File 'lib/Miyako/API/map.rb', line 44

def ignore_list
  @ignore_list
end

#mapchipObject (readonly)

Returns the value of attribute mapchip.



44
45
46
# File 'lib/Miyako/API/map.rb', line 44

def mapchip
  @mapchip
end

#mapchip_unitsObject (readonly)

Returns the value of attribute mapchip_units.



44
45
46
# File 'lib/Miyako/API/map.rb', line 44

def mapchip_units
  @mapchip_units
end

#posObject (readonly)

Returns the value of attribute pos.



44
45
46
# File 'lib/Miyako/API/map.rb', line 44

def pos
  @pos
end

#sizeObject (readonly)

Returns the value of attribute size.



44
45
46
# File 'lib/Miyako/API/map.rb', line 44

def size
  @size
end

#visibleObject

レンダリングの可否(true->描画 false->非描画)



43
44
45
# File 'lib/Miyako/API/map.rb', line 43

def visible
  @visible
end

Instance Method Details

#can_access?(type, inout, pos, dx, dy, *ignores) ⇒ Boolean

キャラクタとマップチップが重なっているかどうか問い合わせる

指定の位置と方向で、指定の位置のマップチップ上で移動できるかどうか問い合わせる 指定の位置のマップチップ番号が以下の時はnilを返す 1)-1(未定義)のとき 2)FixexMapLayer#ignore_listに含まれているとき 3)引数ignoresに含まれているとき また、dx==0, dy==0のときもtrueを返す

type

移動形式(0以上の整数)

inout

入退形式(:in もしくは :out)

pos

調査対象のマップチップの位置

dx

移動量(x座標)

dy

移動量(y座標)

返却値

移動可能ならばtrueを返す

Returns:

  • (Boolean)


233
234
235
236
237
238
239
240
# File 'lib/Miyako/API/map.rb', line 233

def can_access?(type, inout, pos, dx, dy, *ignores)
  return true if dx == 0 and dy == 0
  code = get_code(pos[0]+dx, pos[1]+dy)
  return true if (code == @def_ignore or @ignore_list.include?(code) or ignores.flatten.include?(code))
  index = MapDir.index2(inout, dx, dy)
  return true if index == -1
  return @mapchip.access_table[type][code][index]
end

#collision?(type, pos, collision, cpos, *ignores) ⇒ Boolean

キャラクタとマップチップが重なっているかどうか問い合わせる

指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと重なっているかどうか問い合わせる 引数は、Rect(x,y,w,h)形式(Rect構造体、の配列)で渡す 指定の位置のマップチップ番号が以下の時はnilを返す 1)-1(未定義)のとき 2)FixexMapLayer#ignore_listに含まれているとき 3)引数ignoresに含まれているとき

type

移動形式(0以上の整数)

pos

調査対象のマップチップの位置

collision

キャラクタのコリジョン

cpos

キャラクタの位置

返却値

コリジョンが重なっていれば、そのときのマップチップ番号を返す。重なっていなければnilを返す

Returns:

  • (Boolean)


177
178
179
180
181
# File 'lib/Miyako/API/map.rb', line 177

def collision?(type, pos, collision, cpos, *ignores)
  code = get_code(*pos.to_a)
  return nil if (code == @def_ignore or @ignore_list.include?(code) or ignores.flatten.include?(code))
  return @mapchip.collision_table[type][code].collision?(pos, collision, cpos) ? code : nil
end

#convert_position(x, y) ⇒ Object

:nodoc:



125
126
127
128
# File 'lib/Miyako/API/map.rb', line 125

def convert_position(x, y) #:nodoc:
  return Point.new(@modpx2[round(x, @size.w)],
                   @modpy2[round(y, @size.h)])
end

#cover?(type, pos, collision, cpos, *ignores) ⇒ Boolean

キャラクタとマップチップが覆い被さっているかどうか問い合わせる

指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンを覆い被さっているかどうか問い合わせる 引数は、Rect(x,y,w,h)形式(Rect構造体、の配列)で渡す 指定の位置のマップチップ番号が以下の時はnilを返す 1)-1(未定義)のとき 2)FixexMapLayer#ignore_listに含まれているとき 3)引数ignoresに含まれているとき

type

移動形式(0以上の整数)

pos

調査対象のマップチップの位置

collision

キャラクタのコリジョン

cpos

キャラクタの位置

返却値

どちらかのコリジョンが覆い被さっていれば、そのときのマップチップ番号を返す。

被さっていなければnilを返す

Returns:

  • (Boolean)


214
215
216
217
218
# File 'lib/Miyako/API/map.rb', line 214

def cover?(type, pos, collision, cpos, *ignores)
  code = get_code(*pos.to_a)
  return nil if (code == @def_ignore or @ignore_list.include?(code) or ignores.flatten.include?(code))
  return @mapchip.collision_table[type][code].cover?(pos, collision, cpos) ? code : nil
end

#disposeObject

:nodoc:



242
243
244
245
246
247
# File 'lib/Miyako/API/map.rb', line 242

def dispose #:nodoc:
  @mapdat = nil
  @baseimg = nil
  @ignore_list.clear
  @ignore_list = []
end

#get_code(x, y) ⇒ Object

実座標を使用して、指定のレイヤー・位置のマップチップ番号を取得

イベントレイヤーでの番号はイベント番号と一致する

x

マップチップ単位での位置(ピクセル単位)

y

マップチップ単位での位置(ピクセル単位)

返却値

マップチップ番号(マップチップが設定されている時は0以上の整数、設定されていない場合は-1が返る)



144
145
146
147
# File 'lib/Miyako/API/map.rb', line 144

def get_code(x, y)
  pos = convert_position(x / @mapchip.chip_size[0], y / @mapchip.chip_size[1])
  return @mapdat[pos.y][pos.x]
end

#get_div_array(s, t, v) ⇒ Object

:nodoc:



113
114
115
116
117
# File 'lib/Miyako/API/map.rb', line 113

def get_div_array(s, t, v) #:nodoc:
  a = Array.new
  (s..t).each{|i| a.push(i / v)}
  return a
end

#get_mod_array(s, t, v) ⇒ Object

:nodoc:



119
120
121
122
123
# File 'lib/Miyako/API/map.rb', line 119

def get_mod_array(s, t, v) #:nodoc:
  a = Array.new
  (s..t).each{|i| a.push(i % v)}
  return a
end

#initialize_copy(obj) ⇒ Object

:nodoc:



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/Miyako/API/map.rb', line 93

def initialize_copy(obj) #:nodoc:
  @mapchip = @mapchip.dup
  @size = @size.dup
  @mapchip_unit = @mapchip_unit.dup
  @divpx = get_div_array(0, @real_size.w, @ow)
  @divpy = get_div_array(0, @real_size.h, @oh)
  @modpx = get_mod_array(0, @real_size.w, @ow)
  @modpy = get_mod_array(0, @real_size.h, @oh)
  @modpx2 = get_mod_array(0, @size.w * 2 + 1, @size.w)
  @modpy2 = get_mod_array(0, @size.h * 2 + 1, @size.h)
  @cdivsx = get_div_array(0, @mapchip.chips, @mapchip.size.w)
  @cmodsx = get_mod_array(0, @mapchip.chips, @mapchip.size.w)
  @cdivsy = get_div_array(0, @mapchip.chips, @mapchip.size.h)
  @cmodsy = get_mod_array(0, @mapchip.chips, @mapchip.size.h)
  @cdivsx = @cdivsx.map{|v| v * @ow }
  @cdivsy = @cdivsy.map{|v| v * @oh }
  @cmodsx = @cmodsx.map{|v| v * @ow }
  @cmodsy = @cmodsy.map{|v| v * @oh }
end

#layerObject

レイヤー配列を取得する

レイヤーを構成している配列を取得する 取得した配列にアクセスするときの書式は、以下のようになる。 layer[x]

返却値

所持しているレイヤー配列



135
136
137
# File 'lib/Miyako/API/map.rb', line 135

def layer
  @mapdat
end

#meet?(type, pos, collision, cpos, *ignores) ⇒ Boolean

キャラクタとマップチップが隣り合っているかどうか問い合わせる

指定の矩形のキャラクタが、指定の位置のマップチップのコリジョンと隣り合っているかどうか問い合わせる 引数は、Rect(x,y,w,h)形式(Rect構造体、の配列)で渡す 指定の位置のマップチップ番号が以下の時はnilを返す 1)-1(未定義)のとき 2)FixexMapLayer#ignore_listに含まれているとき 3)引数ignoresに含まれているとき

type

移動形式(0以上の整数)

pos

調査対象のマップチップの位置

collision

キャラクタのコリジョン

cpos

キャラクタの位置

返却値

コリジョンが隣り合っていれば、そのときのマップチップ番号を返す。隣り合っていなければnilを返す

Returns:

  • (Boolean)


195
196
197
198
199
# File 'lib/Miyako/API/map.rb', line 195

def meet?(type, pos, collision, cpos, *ignores)
  code = get_code(*pos.to_a)
  return nil if (code == @def_ignore or @ignore_list.include?(code) or ignores.flatten.include?(code))
  return @mapchip.collision_table[type][code].meet?(pos, collision, cpos) ? code : nil
end

#product_position(rect) ⇒ Object

指定の矩形のキャラクタに掛かるマップチップの左上位置の組み合わせを返す

但し、引数には、Rect(x,y,w,h)形式のインスタンスを渡す

rect

キャラクタの矩形

返却値

マップチップ左上位置の配列(キャラクタに掛かる位置の組み合わせ)



153
154
155
# File 'lib/Miyako/API/map.rb', line 153

def product_position(rect)
  return Utility.product_position(rect, @mapchip.chip_size)
end

#product_position_by_square(square) ⇒ Object

指定の矩形のキャラクタに掛かるマップチップの左上位置の組み合わせを返す

但し、引数には、Square()形式のインスタンスを渡す

square

キャラクタの矩形

返却値

マップチップ左上位置の配列(キャラクタに掛かる位置の組み合わせ)



161
162
163
# File 'lib/Miyako/API/map.rb', line 161

def product_position_by_square(square)
  return Utility.product_position_by_square(square, @mapchip.chip_size)
end

#renderObject

マップレイヤーを画面に描画する

転送する画像は、マップ上のから(-margin.x, -margin.y)(単位:ピクセル)の位置に対応するチップを左上にして描画する ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る) (ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない) ブロックの引数は、|画面のSpriteUnit|となる。 visibleメソッドの値がfalseのときは描画されない。

返却値

自分自身を返す



256
257
# File 'lib/Miyako/API/map.rb', line 256

def render
end

#render_to(dst) ⇒ Object

マップレイヤーを画像に転送する

転送する画像は、マップ上のから(-margin.x, -margin.y)(単位:ピクセル)の位置に対応するチップを左上にして描画する ブロック付きで呼び出し可能(レシーバに対応したSpriteUnit構造体が引数として得られるので、補正をかけることが出来る) (ブロック引数のインスタンスは複写しているので、メソッドの引数として渡した値が持つSpriteUnitには影響しない) ブロックの引数は、|転送先のSpriteUnit|となる。 visibleメソッドの値がfalseのときは描画されない。

dst

転送先ビットマップ(to_unitメソッドを呼び出すことが出来る/値がnilではないインスタンス)

返却値

自分自身を返す



267
268
# File 'lib/Miyako/API/map.rb', line 267

def render_to(dst)
end

#resizeObject

:nodoc:



52
53
54
55
# File 'lib/Miyako/API/map.rb', line 52

def resize #:nodoc:
  @cw = (Screen.w + @ow - 1)/ @ow + 1
  @ch = (Screen.h + @oh - 1)/ @oh + 1
end

#round(v, max) ⇒ Object

:nodoc:



46
47
48
49
50
# File 'lib/Miyako/API/map.rb', line 46

def round(v, max) #:nodoc:
  v = max + (v % max) if v < 0
  v %= max if v >= max
  return v
end