 |
11樓
巨大八爪鱼
2016-1-27 10:32
所有的RMXP事件指令的编号都可以在脚本“Interpreter 2”中查出来。 至于参数列表,可以在Interpreter 3~7里面查出来(通过查看@parameters在各def command_***里的用法)
|
 |
12樓
巨大八爪鱼
2016-1-27 10:35
【示例:开关操作,开关1=ON】 rms.WriteHeader(); rms.BeginArray(1); rms.BeginObject("RPG::EventCommand", 3); rms.BeginMember("code"); rms.WriteFixnum(121); rms.BeginMember("indent"); rms.WriteFixnum(0); rms.BeginMember("parameters"); rms.BeginArray(3); rms.WriteFixnum(1); rms.WriteFixnum(1); // 这里如果是5的话,那么就是开关1~5都设置为ON了 rms.WriteFixnum(0);
|
 |
13樓
巨大八爪鱼
2016-1-27 10:39
【示例:独立开关操作E为OFF】 rms.WriteHeader(); rms.BeginArray(1); rms.BeginObject("RPG::EventCommand", 3); rms.BeginMember("code"); rms.WriteFixnum(123); rms.BeginMember("indent"); rms.WriteFixnum(0); rms.BeginMember("parameters"); rms.BeginArray(2); rms.WriteString("E"); rms.WriteFixnum(1); // 1为OFF,0为ON 一粘贴,还真把独立开关E给粘上去了。。。牛逼 
|
 |
14樓
巨大八爪鱼
2016-1-27 10:41
rms.BeginArray(2); rms.WriteString("I'm a pig."); rms.WriteFixnum(1); 还能产生更怪的独立开关名字: 
|
 |
15樓
巨大八爪鱼
2016-1-27 10:45
复制一个不存在的623指令试试看: rms.BeginMember("code"); rms.WriteFixnum(623);   这更牛逼了。
|
 |
16樓
巨大八爪鱼
2016-1-27 11:26
在剪切板中,RPG::EventCommand对象的三个参数code, indent, parameters一个都不能省略,但顺序可以任意调换。其中indent参数虽然没有用,但也必须写出来,不能省略。
|
 |
17樓
巨大八爪鱼
2016-1-27 12:28
【扩展】 // 下面为了简化程序,定义三个AddMember方法: int RubyMarshal::AddMember(char *memname, bool memvalue) { int count = BeginMember(memname); count += WriteBool(memvalue); return count; }
int RubyMarshal::AddMember(char *memname, char *memvalue) { int count = BeginMember(memname); count += WriteString(memvalue); return count; }
int RubyMarshal::AddMember(char *memname, long memvalue) { int count = BeginMember(memname); count += WriteFixnum(memvalue); return count; } // 这三个方法都是BeginMember和WriteXXXX方法的简写
|
 |
18樓
巨大八爪鱼
2016-1-27 12:29
【示例:复制一个事件】 // RXData.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h" #include "RubyMarshal.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) { ostringstream stream; RubyMarshal rms(&stream);
rms.WriteHeader(); rms.BeginObject("RPG::Event", 2); rms.AddMember("name", "Event Example"); // 事件名 // 本来RMXP帮助手册里写着RPG::Event有5个成员,但在剪切板中,成员id, x, y都可以省略不写
/* 事件页 */ rms.BeginMember("pages"); rms.BeginArray(1); // 事件页的数量 /* 第一页 */ rms.BeginObject("RPG::Event::Page", 13); rms.AddMember("move_type", 0L); // 移动类型 rms.AddMember("move_speed", 3L); // 移动速度 rms.AddMember("move_frequency", 3L); // 移动频度 rms.AddMember("walk_anime", false); // 移动时动画 rms.AddMember("step_anime", true); // 停止时动画 rms.AddMember("direction_fix", true); // 固定朝向 rms.AddMember("through", false); // 允许穿透 rms.AddMember("always_on_top", false); // 在最前面显示 rms.AddMember("trigger", 1L); // 事件开始条件: 与主角接触
/* 事件页出现条件 */ rms.BeginMember("condition"); rms.BeginObject("RPG::Event::Page::Condition", 9); rms.AddMember("switch1_valid", false); rms.AddMember("switch2_valid", false); rms.AddMember("variable_valid", false); rms.AddMember("self_switch_valid", false); rms.AddMember("switch1_id", 1L); rms.AddMember("switch2_id", 1L); rms.AddMember("variable_id", 1L); rms.AddMember("variable_value", 0L); rms.AddMember("self_switch_ch", "A");
/* 事件图像 */ rms.BeginMember("graphic"); rms.BeginObject("RPG::Event::Page::Graphic", 7); rms.AddMember("tile_id", 0L); // 图块id rms.AddMember("character_name", ""); // 文件名为空表示没有图像 rms.AddMember("character_hue", 0L); // 色相 rms.AddMember("direction", 2L); // 方向 rms.AddMember("pattern", 0L); // 角色脚的状态 rms.AddMember("opacity", 0xffL); // 不透明度为255 rms.AddMember("blend_type", 0L); // 合成方式为普通
/* 移动路线 */ rms.BeginMember("move_route"); rms.BeginObject("RPG::MoveRoute", 3); rms.AddMember("repeat", true); rms.AddMember("skippable", false); rms.BeginMember("list"); rms.BeginArray(0);
/* 执行内容 */ rms.BeginMember("list"); rms.BeginArray(1); // 执行内容只有一条指令 rms.BeginObject("RPG::EventCommand", 2); // 这里应该是RMXP检查不严,所以indent(缩进的深度)参数也可以省略了 // 不过事件指令中有条件分歧的话最好还是把indent写上 rms.AddMember("code", 106L); // 指令为: 等待 rms.BeginMember("parameters"); rms.BeginArray(1); rms.WriteFixnum(300); // 等待300帧
UINT format = RegisterClipboardFormat(TEXT("RPGXP EVENT")); rms.Copy(format);
return 0; }
|
 |
19樓
巨大八爪鱼
2016-1-27 12:33
注意,上面的程序最后的剪切板格式变成了RPGXP EVENT。 粘贴后的事件:  
|
 |
20樓
巨大八爪鱼
2016-1-27 13:24
【扩展】 接下来,为了解决中文乱码的问题,定义下列两个方法: int RubyMarshal::AddMember(char *memname, wchar_t *memvalue) { int count = BeginMember(memname); count += WriteString(memvalue); return count; } int RubyMarshal::WriteString(wchar_t *pStr) { int size = WideCharToMultiByte(CP_UTF8, NULL, pStr, -1, NULL, 0, NULL, NULL); char *buffer = new char[size]; WideCharToMultiByte(CP_UTF8, NULL, pStr, -1, buffer, size, NULL, NULL); filestream->put(RBT_STRING); int count = WriteLong(size - 1) + size; filestream->write(buffer, size - 1); delete[] buffer; return count; } 然后在执行时给成员变量的值加上L就行了。 例如: rms.AddMember("name", L"老人"); // 事件名 效果: 
|