 |
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"老人"); // 事件名 效果: 
|