上面的RBT_STRING就是TYPE_STRING,我只是修改了一下宏的名字。
RBT就是RubyType的意思。
下面,我们来创建一个完整的商人事件。
请看代码:
// 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", L"商人"); // 事件名
// 本来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", "001-npc01"); // 注意: 文件名不要带上扩展名
rms.AddMember("character_hue", 0L); // 色相
rms.AddMember("direction", 4L); // 方向 (2, 4, 6, 8)
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(4);
rms.BeginObject("RPG::EventCommand", 2);
rms.AddMember("code", 106L); // 等待: 10帧
rms.BeginMember("parameters");
rms.BeginArray(1);
rms.WriteFixnum(10);
rms.BeginObject("RPG::EventCommand", 2);
rms.AddMember("code", 101L); // 显示文章的第一行
rms.BeginMember("parameters");
rms.BeginArray(1);
rms.WriteString(L"我是商人");
rms.BeginObject("RPG::EventCommand", 2);
rms.AddMember("code", 401L); // 第二行及以上要用401指令!
rms.BeginMember("parameters");
rms.BeginArray(1);
rms.WriteString(L"我听说,这座塔有50层");
// 最后一个空指令确保了用户能够在事件编辑器中执行内容的最后插入新指令
rms.BeginObject("RPG::EventCommand", 2);
rms.AddMember("code", 0L);
rms.BeginMember("parameters");
rms.BeginArray(0);
UINT format = RegisterClipboardFormat(TEXT("RPGXP EVENT"));
rms.Copy(format);
return 0;
}
粘贴后: