Class: Table

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(xsize, ysize = nil, zsize = nil) ⇒ Table

初始化 Table 对象,指定多维数组各维的长度。生成的数组可以是 1~3 维,甚至是没有元素的数组。

初始化时传入的参数个数决定了生成的数组维度:

  • 最少 1 维,最多 3 维。
  • ysizezsize 参数可以省略,默认值为 1。

注意:该类没有参数检查,请确保 ysizezsize 的值在 [-32768, 32767] 范围内。

Parameters:

  • xsize (Integer)

    第一维的长度(必需)

  • ysize (Integer, nil) (defaults to: nil)

    第二维的长度(可选,默认值为 nil)

  • zsize (Integer, nil) (defaults to: nil)

    第三维的长度(可选,默认值为 nil)



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

#dataArray<Integer>

数据数组

Returns:

  • (Array<Integer>)


382
383
384
# File 'lib/R3EXS/RGSS3.rb', line 382

def data
  @data
end

#dimInteger

维度

Returns:

  • (Integer)


387
388
389
# File 'lib/R3EXS/RGSS3.rb', line 387

def dim
  @dim
end

#xsizeInteger

第一维的长度

Returns:

  • (Integer)


392
393
394
# File 'lib/R3EXS/RGSS3.rb', line 392

def xsize
  @xsize
end

#ysizeInteger

第二维的长度

Returns:

  • (Integer)


397
398
399
# File 'lib/R3EXS/RGSS3.rb', line 397

def ysize
  @ysize
end

#zsizeInteger

第三维的长度

Returns:

  • (Integer)


402
403
404
# File 'lib/R3EXS/RGSS3.rb', line 402

def zsize
  @zsize
end

Class Method Details

._load(obj) ⇒ Table

反序列化 Table 对象

Parameters:

  • obj (String)

    序列化后的字符串

Returns:



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

获取指定位置的元素值

Parameters:

  • x (Integer)

    第一维的长度(必需)

  • y (Integer) (defaults to: 0)

    第二维的长度(可选,默认值为 0)

  • z (Integer) (defaults to: 0)

    第三维的长度(可选,默认值为 0)

Returns:

  • (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.

设置指定位置的元素值

Parameters:

  • args (Array<Integer>)

    x, y, z, v

    • x: 第一维的长度(必需)
    • y: 第二维的长度(可选,默认值为 nil)
    • z: 第三维的长度(可选,默认值为 nil)
    • v: 新的元素值


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 对象

Parameters:

  • level (Integer)

    序列化的级别

Returns:

  • (String)


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.

设置各维的长度

Parameters:

  • xsize (Integer)

    第一维的长度

  • ysize (Integer, nil)

    第二维的长度(如果为 nil,则默认为 1)

  • zsize (Integer, nil)

    第三维的长度(如果为 nil,则默认为 1)



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 对象,保留原有数据

Parameters:

  • xsize (Integer)

    第一维的长度(必需)

  • ysize (Integer, nil) (defaults to: nil)

    第二维的长度(可选,默认值为 nil)

  • zsize (Integer, nil) (defaults to: nil)

    第三维的长度(可选,默认值为 nil)



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