Project1

标题: 快速操作Table类的数据 [打印本页]

作者: guoxiaomi    时间: 2020-6-7 21:04
标题: 快速操作Table类的数据
本帖最后由 guoxiaomi 于 2020-6-8 00:26 编辑

根据网上查到的资料,RM里的Table类其实是保存了8个Long型的整数:
  1. struct Table
  2. {
  3.     int32_t unknown0;
  4.     int32_t unknown1;
  5.     int32_t dimension;
  6.     int32_t xsize;
  7.     int32_t ysize;
  8.     int32_t zsize;
  9.     int32_t table_size;
  10.     int16_t *data_ptr;
  11. };
复制代码

前2个都是0,最后一个是Short型的指针,指向table内部存储的数据。内部数据的索引:
  1. index = i + j * xsize + k * xsize * ysize
复制代码
这样就可以写一个table.c / table.dll用来快速编辑table。代码很简单,想添啥功能都可以的。
table.zip (66.41 KB, 下载次数: 36)
使用方法,比如两个table相加保存在另一个table里:
  1. table_addition = Win32API.new("table.dll", "table_addition", "iii", "v")
  2. t, t1, t2 = Table.new(1,2,3), Table.new(1,2,3), Table.new(1,2,3)
  3. table_addition.call(t.object_id, t1.object_id, t2.object_id)
复制代码
反正出了下面的load/save_table之外的函数参数都是整数,所以设置win32api的时候,第3个参数有几个输入量就写几个i……
导出成数组稍微复杂一点:
  1. save_table = Win32API.new("table.dll", "save_table", "ip", "v")
  2. load_table = Win32API.new("table.dll", "load_table", "ip", "v")
  3. t = Table.new(1,2,3)
  4. # save table contents to array
  5. buffer = "\0\0" * 6
  6. save_table(t.object_id, buffer)
  7. a = buffer.unpack("S*")
  8. # load table contents from array
  9. buffer = a.pack("S*")
  10. load_table(t.object_id, buffer)
复制代码

为了让这个东西更有用一点,我把之前写的autotile生成也加进去了,你可以创建一个2维的table,用1表示这里有autotile用0表示这里没有,然后:
  1. map = $game_map.data
  2. autotile = Table.new(map.xsize, map.ysize)
  3. # ... processing with autotile
  4. fill_table_autotile = Win32API.new("table.dll", "fill_table_autotile", "iii", "v")
  5. fill_table_autotile.call(map.object_id, autotile.object_id, 48)
复制代码

这里48是autotile的起始ID,如果用的是XP,就是第1个自动元件图块。对于VA的A1也是可以用的。
其实我一开始只写了fill_table开头的前3个函数,后面的都是一时兴起加上去的……
下面是源码:
只学了1学期C语言程序设计的我也不知道要怎么写才有高效率,但据说无脑-O3就行了,反正肯定比在ruby里用for循环操作要快。
table.c

参考资料:
1. http://www.rpg-studio.org/scientia/RGSS/Table
2. http://www.hbgames.org/forums/viewtopic.php?f=11&t=49838
作者: b565185756    时间: 2020-7-29 13:32
打破零回复!




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1