5.事件编辑 - neveis/RPGMakerFP GitHub Wiki

事件是游戏制作中最关键的一个部分。剧情流程,NPC互动等等都是依靠事件来完成的。

事件是通过JSON格式存储的,也就是以JSON文件作为配置文件。

由于事件数据具有一定的格式,纯人工编写显得有些繁杂,所以还简单的写了一个生成事件的小工具作为辅助。事件编辑器

程序只能生成部分顺序执行的事件,分支等情况还需要单独生成子事件列表再合并一起。

1.数据结构分析

下面先给出一个简单的例子,然后再做介绍。

{
    "1": {
        "triggerType": 0,
        "pages": [{
                "condition": [],
                "switcher": [],
                "subEvents": [{
                        "detail": {
                            "audioName": "LuoRiYuGe.mp3",
                            "loop": true,
                            "state": 0
                        },
                        "eventType": 25
                    },
                    {
                        "detail": {
                            "switcherId": "1",
                            "flag": true
                        },
                        "eventType": 15
                    }
                ]
            },
            {
                "condition": [],
                "switcher": ["1"],
                "subEvents": [{
                    "detail": {
                        "audioName": "LuoRiYuGe.mp3",
                        "loop": true,
                        "state": 0
                    },
                    "eventType": 25
                }]
            }
        ]
    },
    "1-42-7": {
        "triggerType": 2,
        "pages": [{
            "condition": [],
            "switcher": [],
            "subEvents": [{
                "detail": {
                    "destMapId": "2",
                    "playerId": 1,
                    "destPos": {
                        "x": 640,
                        "y": 352
                    },
                    "direction": 4
                },
                "eventType": 3
            }]
        }]
    }
}

上面这个JSON文件,包含了两个事件: 11-42-7,这表示的是事件的ID,也是事件的唯一标识。(怎么确定ID后面再介绍)

每个事件对象首先包含两个Key,分别是triggerTypepages

triggerType:事件的触发方式,有3种方式。
1:点击主按键触发。
2:角色接触触发,也就是角色在该位置上时触发。
3:角色接触前触发,也就是角色移动到该位置之前触发。

pages:事件页。同一个事件ID可以根据不同的条件或开关运行不同的事件。
检测顺序是从后往前,当检测到符合条件,则运行该页,并且不继续往前检测。

接着来看pages,这是一个数组,数组的每一个元素是一个对象,可以认为是一页事件。其中也包含3个Key,conditonswitchersubEvents

condition:触发条件
switcher:触发开关
subEvents:子事件列表,当可运行时,会按顺序逐条运行。

真正要运行的事件序列在subEvents中编写,subEvents也是一个数组,顺序是从前到后。其中包含2个Key,detaileventType

detail: 具体的子事件参数,根据事件不同,对象的Key也不同。
eventType:子事件类型。

具体可用的事件类型以及所需参数在文章末尾会进行说明,或者可以参考EventHandle.js文件,该脚本是事件调用的中间层。

(condition待补充)

2. 事件ID

每个场景中有两个与事件相关的文件,分别是MapEvent.jsActorEvent.js

MapEvent.js中的事件是与地图上某个位置相关联的事件。ActorEvent.js中的则是与角色相关联的事件。

MapEvent.js中的事件ID有两种,第一种是以地图ID作为事件ID,如上面代码中的事件1。该事件会在进入地图后自动运行。

第二种则是与位置相关的,如上面的事件1-42-7,其中1代表的地图ID,42代表的是以块大小为单位的横坐标,7代表以块大小为单位的纵坐标。

也就是说,与位置相关的事件ID格式为:MapID-TileX-TileY。以左下角为原点,将像素坐标除以地图块大小,就可以得到Tile坐标。

MapEvent.js中的事件ID只有一种,也就是以角色ID作为事件ID。

3.事件文件路径

事件文件需要按照一定路径存放,否则会出现找不到事件的问题。

MapEvent.jsActorEvent.js应该放在 assets/resources/Scene/{MapID}/ 路径下,其中{MapID}是以该场景的地图ID命名的文件夹。

文件路径

4.例子分析

可以看出,上面那段代码是MapID为"1"的地图的MapEvent。其中包含两个事件,一个事自动运行的事件"1",另一个是位置在块坐标为(42,7)的事件。

因为事件"1"是自动运行的事件,因此triggerType不起作用,这里使用0以区分。

事件"1"有两页事件,运行时会先检测第1页,如果不符合运行条件,也就是开关1不为true,那么就运行第0页。

当第一次进入到地图1,会先运行第0页(因为开关1不为true)。

第0页执行的事件是:1.播放背景音乐。2.将开关1设为true

当离开地图1之后再进入,那么就会运行第1页(开关1true)。

事件"1-42-7"是一个典型的切换地图事件。当角色走到事件位置时,切到换地图2,位置在(640,352),朝向向左。

5.事件列表

建议直接使用事件编辑器进行编辑。

(后续会对某一些事件的参数进行解释)