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]
范围内。
290 291 292 |
# File 'lib/R3EXS/RGSS3.rb', line 290 def initialize(xsize, ysize = nil, zsize = nil) init_attr(xsize, ysize, zsize) end |
Instance Attribute Details
#data ⇒ Array<Integer>
数据数组
382 383 384 |
# File 'lib/R3EXS/RGSS3.rb', line 382 def data @data end |
#dim ⇒ Integer
维度
387 388 389 |
# File 'lib/R3EXS/RGSS3.rb', line 387 def dim @dim end |
#xsize ⇒ Integer
第一维的长度
392 393 394 |
# File 'lib/R3EXS/RGSS3.rb', line 392 def xsize @xsize end |
#ysize ⇒ Integer
第二维的长度
397 398 399 |
# File 'lib/R3EXS/RGSS3.rb', line 397 def ysize @ysize end |
#zsize ⇒ Integer
第三维的长度
402 403 404 |
# File 'lib/R3EXS/RGSS3.rb', line 402 def zsize @zsize end |
Class Method Details
._load(obj) ⇒ Table
反序列化 Table 对象
369 370 371 372 373 374 375 376 377 |
# File 'lib/R3EXS/RGSS3.rb', line 369 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
获取指定位置的元素值
314 315 316 |
# File 'lib/R3EXS/RGSS3.rb', line 314 def [](x, y = 0, z = 0) @data[x + y * @xsize + z * @xsize * @ysize] end |
#[]=(*args) ⇒ void
This method returns an undefined value.
设置指定位置的元素值
326 327 328 329 330 331 332 |
# File 'lib/R3EXS/RGSS3.rb', line 326 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 对象
357 358 359 360 361 362 363 |
# File 'lib/R3EXS/RGSS3.rb', line 357 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.
设置各维的长度
300 301 302 303 304 305 306 |
# File 'lib/R3EXS/RGSS3.rb', line 300 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 对象,保留原有数据
340 341 342 343 344 345 346 347 348 349 350 351 |
# File 'lib/R3EXS/RGSS3.rb', line 340 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 |