目前共有28篇帖子。
【原創C++程序】用C++創建顯示文章事件指令的剪切板內容(可粘貼到RMXP事件編輯器中)
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"老人"); // 事件名
效果:

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
 
 
©2010-2024 Purasbar [手機版] [桌面版]
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。