From c3d7910fe44548e1640e75a39782e2ac79fd70ae Mon Sep 17 00:00:00 2001 From: oc Date: Sat, 13 Oct 2018 13:46:57 +0800 Subject: [PATCH] parallelDo --- _server/functions.comment.js | 6 ++++++ docs/event.md | 41 ++++++++++++++++++++++++++++++++++-- libs/control.js | 4 ++++ project/functions.js | 23 ++++++++++++++++++++ 4 files changed, 72 insertions(+), 2 deletions(-) diff --git a/_server/functions.comment.js b/_server/functions.comment.js index 2e5f1735..92080dd7 100644 --- a/_server/functions.comment.js +++ b/_server/functions.comment.js @@ -175,6 +175,12 @@ functions_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_leaf": false, "_type": "object", "_data": { + "parallelDo": { + "_leaf": true, + "_type": "textarea", + "_lint": true, + "_data": "并行事件处理" + }, "plugin": { "_leaf": true, "_type": "textarea", diff --git a/docs/event.md b/docs/event.md index 9a38fa19..8ac206d5 100644 --- a/docs/event.md +++ b/docs/event.md @@ -10,8 +10,6 @@ 上述这些默认的事件已经存在处理机制,不需要我们操心。我们真正所需要关心的,其实只是一个自定义的事件。 -**本塔中的所有自定义事件能且只能被其他事件触发。不存在RMXP里面那种,设置了某个变量为true后,一个事件被自动执行的问题。这点和RMXP的区别非常大,请务必注意。** - 所有事件都存在两种状态:启用和禁用。 - 启用状态下,该事件才处于可见状态,可被触发、交互与处理。 - 禁用状态下该事件相当于不存在,不可见、不可被触发、不可交互。 @@ -1467,6 +1465,45 @@ core.insertAction([ - 如果弄不清楚系统trigger和自定义事件等的区别,也可以全部覆盖为自定义事件,然后通过type:battle,type:openDoor等来具体进行控制。 - 多事件处理时请不要使用`changeFloor`那一项,而是使用`events`或者`afterXXX`来处理。 +## 并行事件处理 + +从V2.4.3后,H5样板开始支持并行事件处理。 + +在脚本编辑里面提供了一个parallelDo函数,这个函数可以用来做并行处理内容。 + +``` js +"parallelDo": function (timestamp) { + // 并行事件处理,可以在这里写任何需要并行处理的脚本或事件 + // 该函数将被系统反复执行,每次执行间隔视浏览器或设备性能而定,一般约为16.6ms一次 + // 参数timestamp为“从游戏资源加载完毕到当前函数执行时”的时间差,以毫秒为单位 + + // 检查当前是否处于游戏开始状态 + if (!core.isPlaying()) return; + + // 下面是一个并行事件开门的样例 + /* + // 如果某个flag为真 + if (core.hasFlag("xxx")) { + // 千万别忘了将该flag清空!否则下次仍然会执行这段代码。 + core.setFlag("xxx", false); + // 使用insertAction来插入若干自定义事件执行 + core.insertAction([ + {"type":"openDoor", "loc":[0,0], "floorId": "MT0"} + ]) + // 也可以写任意其他的脚本代码 + } + */ +} +``` + +该函数将被系统反复执行,执行间隔试浏览器或设备性能而定,一般约为16.6ms一次。 + +此函数有个参数timestamp,为**从游戏资源加载完毕到当前函数执行时**的时间差,以毫秒为单位。可以使用此参数来制作一些时间相关内容或者特效等。 + +如果要执行并行的自定义事件,请使用if+flag判断的形式,然后insertAction将自定义事件插入到事件列表中。 + +!> 判定flag后千万别忘了将该flag清空!否则下次仍然会执行这段代码。 + ## 加点事件 打败怪物后可以进行加点。 diff --git a/libs/control.js b/libs/control.js index a714fc40..2da58653 100644 --- a/libs/control.js +++ b/libs/control.js @@ -186,6 +186,10 @@ control.prototype.setRequestAnimationFrame = function () { core.animateFrame.weather.time = timestamp; } + + // 执行用户的并行事件处理内容 + functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.plugins.parallelDo(timestamp); + window.requestAnimationFrame(draw); } window.requestAnimationFrame(draw); diff --git a/project/functions.js b/project/functions.js index fc0ea1af..559d7846 100644 --- a/project/functions.js +++ b/project/functions.js @@ -843,6 +843,29 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = } }, "plugins": { + "parallelDo": function (timestamp) { + // 并行事件处理,可以在这里写任何需要并行处理的脚本或事件 + // 该函数将被系统反复执行,每次执行间隔视浏览器或设备性能而定,一般约为16.6ms一次 + // 参数timestamp为“从游戏资源加载完毕到当前函数执行时”的时间差,以毫秒为单位 + + // 检查当前是否处于游戏开始状态 + if (!core.isPlaying()) return; + + // 下面是一个并行事件开门的样例 + /* + // 如果某个flag为真 + if (core.hasFlag("xxx")) { + // 千万别忘了将该flag清空!否则下次仍然会执行这段代码。 + core.setFlag("xxx", false); + // 使用insertAction来插入若干自定义事件执行 + core.insertAction([ + {"type":"openDoor", "loc":[0,0], "floorId": "MT0"} + ]) + // 也可以写任意其他的脚本代码 + } + */ + +}, "plugin": function () { ////// 插件编写,可以在这里写自己额外需要执行的脚本 //////