赞 | 400 |
VIP | 0 |
好人卡 | 24 |
积分 | 250 |
经验 | 45372 |
最后登录 | 2024-7-2 |
在线时间 | 3339 小时 |
Lv5.捕梦者 (版主)
- 梦石
- 1
- 星屑
- 23994
- 在线时间
- 3339 小时
- 注册时间
- 2011-7-8
- 帖子
- 3926
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 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)
使用方法,比如两个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 |
|