diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index 5079a58e..8d41aecf 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -2007,15 +2007,17 @@ return code; wait_s - : '等待用户操作并获得按键或点击信息' BGNL? Newline waitContext* BEND Newline + : '等待用户操作并获得按键或点击信息' '超时毫秒数' Int BGNL? Newline waitContext* BEND Newline /* wait_s tooltip : wait: 等待用户操作并获得按键或点击信息 helpUrl : https://h5mota.com/games/template/_docs/#/event?id=wait%EF%BC%9A%E7%AD%89%E5%BE%85%E7%94%A8%E6%88%B7%E6%93%8D%E4%BD%9C +default : [0] colour : this.soundColor +Int_0 = Int_0?(', "timeout": ' + Int_0):''; waitContext_0 = waitContext_0 ? (', "data": [\n' + waitContext_0 + ']') : ''; -var code = '{"type": "wait"' + waitContext_0 + '},\n'; +var code = '{"type": "wait"' + Int_0 + waitContext_0 + '},\n'; return code; */; @@ -2027,13 +2029,16 @@ waitContext waitContext_1 - : '按键的场合' '键值' Int BGNL? Newline action+ BEND Newline + : '按键的场合' '键值' EvalString BGNL? Newline action+ BEND Newline /* waitContext_1 tooltip : wait: 等待用户操作并获得按键或点击信息 helpUrl : https://h5mota.com/games/template/_docs/#/event?id=wait%EF%BC%9A%E7%AD%89%E5%BE%85%E7%94%A8%E6%88%B7%E6%93%8D%E4%BD%9C colour : this.subColor -var code = '{"case": "keyboard", "keycode": ' + Int_0 + ', "action": [\n' + action_0 + ']},\n'; +if (!/^\d+(,\d+)*$/.test(EvalString_0)) { + throw new Error('键值必须是正整数,可以以逗号分隔'); +} +var code = '{"case": "keyboard", "keycode": "' + EvalString_0 + '", "action": [\n' + action_0 + ']},\n'; return code; */; @@ -3608,7 +3613,7 @@ ActionParser.prototype.parseAction = function() { for(var ii=data.data.length-1,caseNow;caseNow=data.data[ii];ii--) { if (caseNow["case"] == "keyboard") { case_waitList = MotaActionBlocks['waitContext_1'].xmlText([ - caseNow.keycode || 0, this.insertActionList(caseNow.action), case_waitList + caseNow.keycode || "0", this.insertActionList(caseNow.action), case_waitList ]); } else if (caseNow["case"] == "mouse") { case_waitList = MotaActionBlocks['waitContext_2'].xmlText([ @@ -3618,7 +3623,7 @@ ActionParser.prototype.parseAction = function() { } } this.next = MotaActionBlocks['wait_s'].xmlText([ - case_waitList, this.next]); + data.timeout||0,case_waitList, this.next]); break; case "waitAsync": // 等待所有异步事件执行完毕 this.next = MotaActionBlocks['waitAsync_s'].xmlText([ diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index bcc1836e..1ea29fed 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -164,8 +164,8 @@ editor_blockly = function () { ], '特效/声音':[ MotaActionBlocks['sleep_s'].xmlText(), - MotaActionFunctions.actionParser.parseList({"type": "wait", "data": [ - {"case": "keyboard", "keycode": 13, "action": [{"type": "comment", "text": "当按下回车(keycode=13)时执行此事件"}]}, + MotaActionFunctions.actionParser.parseList({"type": "wait", "timeout": 0, "data": [ + {"case": "keyboard", "keycode": "13,32", "action": [{"type": "comment", "text": "当按下回车(keycode=13)或空格(keycode=32)时执行此事件"}]}, {"case": "mouse", "px": [0,32], "py": [0,32], "action": [{"type": "comment", "text": "当点击地图左上角时执行此事件"}]}, ]}), MotaActionBlocks['waitAsync_s'].xmlText(), diff --git a/libs/actions.js b/libs/actions.js index ec1f84c7..ea880f6b 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -438,6 +438,7 @@ actions.prototype._sys_ondown_lockControl = function (x, y, px, py) { // --- wait事件也要提供px和py if (core.status.event.id == 'action' && core.status.event.data.type == 'wait') { + clearTimeout(core.status.event.interval); core.setFlag('type', 1); core.setFlag('x', x); core.setFlag('y', y); @@ -754,6 +755,7 @@ actions.prototype._sys_onmousewheel = function (direct) { // wait事件 if (core.status.lockControl && core.status.event.id == 'action' && core.status.event.data.type == 'wait') { + clearTimeout(core.status.event.interval); core.setFlag('type', 0); var keycode = direct == 1 ? 33 : 34; core.setFlag('keycode', keycode); @@ -1046,6 +1048,7 @@ actions.prototype._keyUpAction = function (keycode) { return; } if (core.status.event.data.type == 'wait') { + clearTimeout(core.status.event.interval); core.setFlag('type', 0); core.setFlag('keycode', keycode); core.status.route.push("input:" + keycode); diff --git a/libs/events.js b/libs/events.js index f395421f..512b0230 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1951,10 +1951,15 @@ events.prototype._action_wait = function (data, x, y, prefix) { if (core.isReplaying()) { var code = core.status.replay.toReplay.shift(); if (code.indexOf("input:") == 0) { - var value = parseInt(code.substring(6)); - core.status.route.push("input:" + value); - this.__action_wait_getValue(value); - this.__action_wait_afterGet(data); + if (code == "input:none") { + core.status.route.push("input:none"); + core.removeFlag("type"); + } else { + var value = parseInt(code.substring(6)); + core.status.route.push("input:" + value); + this.__action_wait_getValue(value); + this.__action_wait_afterGet(data); + } } else { main.log("录像文件出错!当前需要一个 input: 项,实际为 " + code); @@ -1963,6 +1968,12 @@ events.prototype._action_wait = function (data, x, y, prefix) { } core.doAction(); return; + } else if (data.timeout) { + core.status.event.interval = setTimeout(function() { + core.status.route.push("input:none"); + core.removeFlag("type"); + core.doAction(); + }, data.timeout); } } @@ -1994,9 +2005,11 @@ events.prototype.__action_wait_afterGet = function (data) { var todo = []; data.data.forEach(function (one) { if (one["case"] == "keyboard" && core.getFlag("type") == 0) { - if (one["keycode"] == core.getFlag("keycode", 0)) { - core.push(todo, one.action); - } + (one.keycode + "").split(",").forEach(function (keycode) { + if (core.getFlag("keycode", 0) == keycode) { + core.push(todo, one.action); + } + }); } if (one["case"] == "mouse" && one.px instanceof Array && one.py instanceof Array && core.getFlag("type") == 1) { diff --git a/v2.x-final更新.txt b/v2.x-final更新.txt index 66f6a14a..fdf09640 100644 --- a/v2.x-final更新.txt +++ b/v2.x-final更新.txt @@ -7,7 +7,7 @@ (已完成!) 6. core.drawAnimate()和对应的事件,建议增加一个boolean型参数来表示坐标是绝对坐标(即当前的实现)还是在视野中的相对坐标(以13*13为例相对坐标总是在0~12之间),以实现形如“在视野正中心播放某某动画”的需求(小地图可以写6,6,大地图怎么办) (已完成!) 7. 建议把core.playBgm(bgm, startTime)的startTime参数在事件中也提供出来,以用于一些演出(比如适当的剧情处直接从高潮开始)。同理可以让“暂停背景音乐”记录下当前播放到了第几秒,并在“恢复背景音乐”中自动从这个秒数恢复。作者还可以手动配合音量渐变效果 (已完成!) 8. 系统设置菜单中“音量”和“步时”的点击区并不是根据文本长度自动适配的,这导致作者修改文本(包括但不限于翻译)后玩家难以找到准确的点击区,建议优化 -9. 建议给“显示选择项”、“显示确认框”、“等待用户操作”这三个事件添加一个“若多少毫秒内不响应则触发的分支”,用来实现一些如新新2的QTE,录像中可以记录“choice: timeout”、“confirm: timeout”和“wait: timeout”来表示触发了超时分支 +(已完成!) 9. 建议给“显示选择项”、“显示确认框”、“等待用户操作”这三个事件添加一个“若多少毫秒内不响应则触发的分支”,用来实现一些如新新2的QTE,录像中可以记录“choice: timeout”、“confirm: timeout”和“wait: timeout”来表示触发了超时分支 10. 建议给“转变图块”事件增加一个淡入时间参数,用于原本是空地或空气墙的情况,目前这种效果必须借助存在安全隐患的红点 11. 建议修复勇士后退时跟随者的鬼畜行为,并推出一套能够对跟随者位置和朝向进行读写的API甚至事件,且允许这些信息被计入存档,以实现一些演出效果甚至游戏要素,如新新2用公主占位防冰块 12. “设置怪物属性”事件的下拉框目前只支持一部分,另一部分只能通过手敲json再解析来得到,希望提供完整支持 @@ -21,7 +21,7 @@ 20. 很多事件对应的脚本有默认参数,但在事件中省略参数却会变成0,建议修复 图块属性的nopass倒真可以改成勾选框,因为null一定表示不可通行(道具根本没有nopass) - +对话框淡入淡出