wait事件允许多键值和超时时间

This commit is contained in:
ckcz123 2020-05-05 16:48:35 +08:00
parent 77e29f6039
commit 22fca8d25f
5 changed files with 38 additions and 17 deletions

View File

@ -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([

View File

@ -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(),

View File

@ -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);

View File

@ -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) {

View File

@ -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
对话框淡入淡出