上面的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;
}
粘貼後: