目前共有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 Arslanbar [手機版] [桌面版]
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。