Class: Table
- Inherits:
-
Object
- Object
- Table
- Defined in:
- lib/R3EXS/RGSS3.rb
Overview
RPG Maker VX Ace Table 类
Table 是一个多维数组,每个元素都是带符号的两字节整数(int16_t), 也就是 -32,768~32,767 之间的整数
Ruby Array 类在处理大量信息时效率很差,因此使用了此类。
Instance Attribute Summary collapse
-
#data ⇒ Array<Integer>
数据数组.
-
#dim ⇒ Integer
维度.
-
#xsize ⇒ Integer
第一维的长度.
-
#ysize ⇒ Integer
第二维的长度.
-
#zsize ⇒ Integer
第三维的长度.
Class Method Summary collapse
-
._load(obj) ⇒ Table
反序列化 Table 对象.
Instance Method Summary collapse
-
#[](x, y = 0, z = 0) ⇒ Integer
获取指定位置的元素值.
-
#[]=(*args) ⇒ void
设置指定位置的元素值.
-
#_dump(level) ⇒ String
序列化 Table 对象.
-
#init_attr(xsize, ysize, zsize) ⇒ void
设置各维的长度.
-
#initialize(xsize, ysize = nil, zsize = nil) ⇒ Table
constructor
初始化 Table 对象,指定多维数组各维的长度。生成的数组可以是 1~3 维,甚至是没有元素的数组。.
-
#resize(xsize, ysize = nil, zsize = nil) ⇒ void
扩容 Table 对象,保留原有数据.
Constructor Details
#initialize(xsize, ysize = nil, zsize = nil) ⇒ Table
初始化 Table 对象,指定多维数组各维的长度。生成的数组可以是 1~3 维,甚至是没有元素的数组。
初始化时传入的参数个数决定了生成的数组维度:
- 最少 1 维,最多 3 维。
ysize
和zsize
参数可以省略,默认值为 1。
注意:该类没有参数检查,请确保 ysize
和 zsize
的值在 [-32768, 32767]
范围内。
331 332 333 |
# File 'lib/R3EXS/RGSS3.rb', line 331 def initialize(xsize, ysize = nil, zsize = nil) init_attr(xsize, ysize, zsize) end |
Instance Attribute Details
#data ⇒ Array<Integer>
数据数组
296 297 298 |
# File 'lib/R3EXS/RGSS3.rb', line 296 def data @data end |
#dim ⇒ Integer
维度
301 302 303 |
# File 'lib/R3EXS/RGSS3.rb', line 301 def dim @dim end |
#xsize ⇒ Integer
第一维的长度
306 307 308 |
# File 'lib/R3EXS/RGSS3.rb', line 306 def xsize @xsize end |
#ysize ⇒ Integer
第二维的长度
311 312 313 |
# File 'lib/R3EXS/RGSS3.rb', line 311 def ysize @ysize end |
#zsize ⇒ Integer
第三维的长度
316 317 318 |
# File 'lib/R3EXS/RGSS3.rb', line 316 def zsize @zsize end |
Class Method Details
._load(obj) ⇒ Table
反序列化 Table 对象
416 417 418 419 420 421 422 423 424 |
# File 'lib/R3EXS/RGSS3.rb', line 416 def Table._load(obj) # 从序列化字符串中解包维度信息 dim, xsize, ysize, zsize, total_size = *obj[0, 20].unpack('LLLLL') # 初始化 Table 对象 table = Table.new(*[xsize, ysize, zsize].first(dim)) table.data = obj[20, total_size * 2].unpack("s#{total_size}") # 现在 @data 已经从序列化字符串中完整提取 table end |
Instance Method Details
#[](x, y = 0, z = 0) ⇒ Integer
获取指定位置的元素值
357 358 359 |
# File 'lib/R3EXS/RGSS3.rb', line 357 def [](x, y = 0, z = 0) @data[x + y * @xsize + z * @xsize * @ysize] end |
#[]=(*args) ⇒ void
This method returns an undefined value.
设置指定位置的元素值
370 371 372 373 374 375 376 |
# File 'lib/R3EXS/RGSS3.rb', line 370 def []=(*args) v = args.pop x, y, z = args y ||= 0 z ||= 0 @data[x + y * @xsize + z * @xsize * @ysize] = v end |
#_dump(level) ⇒ String
序列化 Table 对象
403 404 405 406 407 408 409 |
# File 'lib/R3EXS/RGSS3.rb', line 403 def _dump(level) s = [@dim, @xsize, @ysize, @zsize, @xsize * @ysize * @zsize].pack('LLLLL') @data.each do |d| s << [d].pack('s') end s end |
#init_attr(xsize, ysize, zsize) ⇒ void
This method returns an undefined value.
设置各维的长度
342 343 344 345 346 347 348 |
# File 'lib/R3EXS/RGSS3.rb', line 342 def init_attr(xsize, ysize, zsize) @dim = 1 + (ysize.nil? ? 0 : 1) + (zsize.nil? ? 0 : 1) @xsize = xsize @ysize = ysize.nil? ? 1 : ysize @zsize = zsize.nil? ? 1 : zsize @data = Array.new(@xsize * @ysize * @zsize, 0) end |
#resize(xsize, ysize = nil, zsize = nil) ⇒ void
This method returns an undefined value.
扩容 Table 对象,保留原有数据
385 386 387 388 389 390 391 392 393 394 395 396 |
# File 'lib/R3EXS/RGSS3.rb', line 385 def resize(xsize, ysize = nil, zsize = nil) old_data = @data.dup old_xsize, old_ysize, old_zsize = @xsize, @ysize, @zsize init_attr(xsize, ysize, zsize) (0...[old_xsize, @xsize].min).each { |x| (0...[old_ysize, @ysize].min).each { |y| (0...[old_zsize, @zsize].min).each { |z| @data[x + y * @xsize + z * @xsize * @ysize] = old_data[x + y * old_xsize + z * old_xsize * old_ysize] } } } end |