Project1
标题:
快速操作Table类的数据
[打印本页]
作者:
guoxiaomi
时间:
2020-6-7 21:04
标题:
快速操作Table类的数据
本帖最后由 guoxiaomi 于 2020-6-8 00:26 编辑
根据网上查到的资料,RM里的Table类其实是保存了8个Long型的整数:
struct Table
{
int32_t unknown0;
int32_t unknown1;
int32_t dimension;
int32_t xsize;
int32_t ysize;
int32_t zsize;
int32_t table_size;
int16_t *data_ptr;
};
复制代码
前2个都是0,最后一个是Short型的指针,指向table内部存储的数据。内部数据的索引:
index = i + j * xsize + k * xsize * ysize
复制代码
这样就可以写一个table.c / table.dll用来快速编辑table。代码很简单,想添啥功能都可以的。
table.zip
(66.41 KB, 下载次数: 36)
2020-6-8 00:26 上传
点击文件名下载附件
使用方法,比如两个table相加保存在另一个table里:
table_addition = Win32API.new("table.dll", "table_addition", "iii", "v")
t, t1, t2 = Table.new(1,2,3), Table.new(1,2,3), Table.new(1,2,3)
table_addition.call(t.object_id, t1.object_id, t2.object_id)
复制代码
反正出了下面的load/save_table之外的函数参数都是整数,所以设置win32api的时候,第3个参数有几个输入量就写几个i……
导出成数组稍微复杂一点:
save_table = Win32API.new("table.dll", "save_table", "ip", "v")
load_table = Win32API.new("table.dll", "load_table", "ip", "v")
t = Table.new(1,2,3)
# save table contents to array
buffer = "\0\0" * 6
save_table(t.object_id, buffer)
a = buffer.unpack("S*")
# load table contents from array
buffer = a.pack("S*")
load_table(t.object_id, buffer)
复制代码
为了让这个东西更有用一点,我把之前写的
autotile生成
也加进去了,你可以创建一个2维的table,用1表示这里有autotile用0表示这里没有,然后:
map = $game_map.data
autotile = Table.new(map.xsize, map.ysize)
# ... processing with autotile
fill_table_autotile = Win32API.new("table.dll", "fill_table_autotile", "iii", "v")
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