显示选择项/显示确认框可以指定超时时间
This commit is contained in:
parent
24e81a3872
commit
77e29f6039
@ -1895,13 +1895,13 @@ return code;
|
|||||||
*/;
|
*/;
|
||||||
|
|
||||||
choices_s
|
choices_s
|
||||||
: '选项' ':' EvalString? BGNL? '标题' EvalString? '图像' IdString? BGNL? Newline choicesContext+ BEND Newline
|
: '选项' ':' EvalString? BGNL? '标题' EvalString? '图像' IdString? '超时毫秒数' Int BGNL? Newline choicesContext+ BEND Newline
|
||||||
|
|
||||||
|
|
||||||
/* choices_s
|
/* choices_s
|
||||||
tooltip : choices: 给用户提供选项
|
tooltip : choices: 给用户提供选项
|
||||||
helpUrl : https://h5mota.com/games/template/_docs/#/event?id=choices%EF%BC%9A%E7%BB%99%E7%94%A8%E6%88%B7%E6%8F%90%E4%BE%9B%E9%80%89%E9%A1%B9
|
helpUrl : https://h5mota.com/games/template/_docs/#/event?id=choices%EF%BC%9A%E7%BB%99%E7%94%A8%E6%88%B7%E6%8F%90%E4%BE%9B%E9%80%89%E9%A1%B9
|
||||||
default : ["","流浪者","woman"]
|
default : ["","流浪者","woman",0]
|
||||||
var title='';
|
var title='';
|
||||||
if (EvalString_1==''){
|
if (EvalString_1==''){
|
||||||
if (IdString_0=='')title='';
|
if (IdString_0=='')title='';
|
||||||
@ -1912,7 +1912,8 @@ if (EvalString_1==''){
|
|||||||
}
|
}
|
||||||
EvalString_0 = title+EvalString_0;
|
EvalString_0 = title+EvalString_0;
|
||||||
EvalString_0 = EvalString_0 ?(', "text": "'+EvalString_0+'"'):'';
|
EvalString_0 = EvalString_0 ?(', "text": "'+EvalString_0+'"'):'';
|
||||||
var code = ['{"type": "choices"',EvalString_0,', "choices": [\n',
|
Int_0 = Int_0 ? (', "timeout": '+Int_0) : '';
|
||||||
|
var code = ['{"type": "choices"',EvalString_0,Int_0,', "choices": [\n',
|
||||||
choicesContext_0,
|
choicesContext_0,
|
||||||
']},\n'].join('');
|
']},\n'].join('');
|
||||||
return code;
|
return code;
|
||||||
@ -1941,14 +1942,15 @@ return code;
|
|||||||
*/;
|
*/;
|
||||||
|
|
||||||
confirm_s
|
confirm_s
|
||||||
: '显示确认框' ':' EvalString BGNL? '确定的场合' ':' '(默认选中' Bool ')' BGNL? Newline action+ '取消的场合' ':' BGNL? Newline action+ BEND Newline
|
: '显示确认框' ':' EvalString '超时毫秒数' Int BGNL? '确定的场合' ':' '(默认选中' Bool ')' BGNL? Newline action+ '取消的场合' ':' BGNL? Newline action+ BEND Newline
|
||||||
|
|
||||||
/* confirm_s
|
/* confirm_s
|
||||||
tooltip : 弹出确认框
|
tooltip : 弹出确认框
|
||||||
helpUrl : https://h5mota.com/games/template/_docs/#/
|
helpUrl : https://h5mota.com/games/template/_docs/#/
|
||||||
default : ["确认要xxx吗?",false]
|
default : ["确认要xxx吗?",0,false]
|
||||||
Bool_0 = Bool_0?', "default": true':''
|
Bool_0 = Bool_0?', "default": true':''
|
||||||
var code = ['{"type": "confirm"'+Bool_0+', "text": "',EvalString_0,'",\n',
|
Int_0 = Int_0 ? (', "timeout": '+Int_0) : '';
|
||||||
|
var code = ['{"type": "confirm"'+Int_0+Bool_0+', "text": "',EvalString_0,'",\n',
|
||||||
'"yes": [\n',action_0,'],\n',
|
'"yes": [\n',action_0,'],\n',
|
||||||
'"no": [\n',action_1,']\n',
|
'"no": [\n',action_1,']\n',
|
||||||
'},\n'].join('');
|
'},\n'].join('');
|
||||||
@ -3508,7 +3510,7 @@ ActionParser.prototype.parseAction = function() {
|
|||||||
break;
|
break;
|
||||||
case "confirm": // 显示确认框
|
case "confirm": // 显示确认框
|
||||||
this.next = MotaActionBlocks['confirm_s'].xmlText([
|
this.next = MotaActionBlocks['confirm_s'].xmlText([
|
||||||
this.EvalString(data.text), data["default"],
|
this.EvalString(data.text), data.timeout||0, data["default"],
|
||||||
this.insertActionList(data["yes"]),
|
this.insertActionList(data["yes"]),
|
||||||
this.insertActionList(data["no"]),
|
this.insertActionList(data["no"]),
|
||||||
this.next]);
|
this.next]);
|
||||||
@ -3534,7 +3536,7 @@ ActionParser.prototype.parseAction = function() {
|
|||||||
if (!this.isset(data.text)) data.text = '';
|
if (!this.isset(data.text)) data.text = '';
|
||||||
var info = this.getTitleAndPosition(data.text);
|
var info = this.getTitleAndPosition(data.text);
|
||||||
this.next = MotaActionBlocks['choices_s'].xmlText([
|
this.next = MotaActionBlocks['choices_s'].xmlText([
|
||||||
info[3],info[0],info[1],text_choices,this.next]);
|
info[3],info[0],info[1],data.timeout||0,text_choices,this.next]);
|
||||||
break;
|
break;
|
||||||
case "while": // 前置条件循环处理
|
case "while": // 前置条件循环处理
|
||||||
this.next = MotaActionBlocks['while_s'].xmlText([
|
this.next = MotaActionBlocks['while_s'].xmlText([
|
||||||
|
|||||||
@ -91,7 +91,7 @@ editor_blockly = function () {
|
|||||||
MotaActionBlocks['restart_s'].xmlText(),
|
MotaActionBlocks['restart_s'].xmlText(),
|
||||||
MotaActionBlocks['confirm_s'].xmlText(),
|
MotaActionBlocks['confirm_s'].xmlText(),
|
||||||
MotaActionBlocks['choices_s'].xmlText([
|
MotaActionBlocks['choices_s'].xmlText([
|
||||||
'选择剑或者盾','流浪者','man',MotaActionBlocks['choicesContext'].xmlText([
|
'选择剑或者盾','流浪者','man',0,MotaActionBlocks['choicesContext'].xmlText([
|
||||||
'剑','','',null,'',MotaActionFunctions.actionParser.parseList([{"type": "openDoor", "loc": [3,3]}]),
|
'剑','','',null,'',MotaActionFunctions.actionParser.parseList([{"type": "openDoor", "loc": [3,3]}]),
|
||||||
MotaActionBlocks['choicesContext'].xmlText([
|
MotaActionBlocks['choicesContext'].xmlText([
|
||||||
'盾','','',null,'',MotaActionFunctions.actionParser.parseList([{"type": "openDoor", "loc": [9,3]}]),
|
'盾','','',null,'',MotaActionFunctions.actionParser.parseList([{"type": "openDoor", "loc": [9,3]}]),
|
||||||
|
|||||||
@ -995,6 +995,7 @@ actions.prototype._clickAction = function (x, y) {
|
|||||||
if (x >= this.CHOICES_LEFT && x <= this.CHOICES_RIGHT) {
|
if (x >= this.CHOICES_LEFT && x <= this.CHOICES_RIGHT) {
|
||||||
var topIndex = this.HSIZE - parseInt((choices.length - 1) / 2) + (core.status.event.ui.offset || 0);
|
var topIndex = this.HSIZE - parseInt((choices.length - 1) / 2) + (core.status.event.ui.offset || 0);
|
||||||
if (y >= topIndex && y < topIndex + choices.length) {
|
if (y >= topIndex && y < topIndex + choices.length) {
|
||||||
|
clearTimeout(core.status.event.interval);
|
||||||
// 选择
|
// 选择
|
||||||
core.status.route.push("choices:" + (y - topIndex));
|
core.status.route.push("choices:" + (y - topIndex));
|
||||||
core.insertAction(choices[y - topIndex].action);
|
core.insertAction(choices[y - topIndex].action);
|
||||||
@ -1006,11 +1007,13 @@ actions.prototype._clickAction = function (x, y) {
|
|||||||
|
|
||||||
if (core.status.event.data.type == 'confirm') {
|
if (core.status.event.data.type == 'confirm') {
|
||||||
if ((x == this.HSIZE-2 || x == this.HSIZE-1) && y == this.HSIZE+1) {
|
if ((x == this.HSIZE-2 || x == this.HSIZE-1) && y == this.HSIZE+1) {
|
||||||
|
clearTimeout(core.status.event.interval);
|
||||||
core.status.route.push("choices:0");
|
core.status.route.push("choices:0");
|
||||||
core.insertAction(core.status.event.ui.yes);
|
core.insertAction(core.status.event.ui.yes);
|
||||||
core.doAction();
|
core.doAction();
|
||||||
}
|
}
|
||||||
else if ((x == this.HSIZE+2 || x == this.HSIZE+1) && y == this.HSIZE+1) {
|
else if ((x == this.HSIZE+2 || x == this.HSIZE+1) && y == this.HSIZE+1) {
|
||||||
|
clearTimeout(core.status.event.interval);
|
||||||
core.status.route.push("choices:1");
|
core.status.route.push("choices:1");
|
||||||
core.insertAction(core.status.event.ui.no);
|
core.insertAction(core.status.event.ui.no);
|
||||||
core.doAction();
|
core.doAction();
|
||||||
|
|||||||
@ -895,6 +895,7 @@ events.prototype.doAction = function (keepUI) {
|
|||||||
// 清空boxAnimate和UI层
|
// 清空boxAnimate和UI层
|
||||||
core.clearUI();
|
core.clearUI();
|
||||||
clearInterval(core.status.event.interval);
|
clearInterval(core.status.event.interval);
|
||||||
|
clearTimeout(core.status.event.interval);
|
||||||
core.status.event.interval = null;
|
core.status.event.interval = null;
|
||||||
}
|
}
|
||||||
// 判定是否执行完毕
|
// 判定是否执行完毕
|
||||||
@ -1763,21 +1764,27 @@ events.prototype._action_choices = function (data, x, y, prefix) {
|
|||||||
})
|
})
|
||||||
if (data.choices.length == 0) return this.doAction();
|
if (data.choices.length == 0) return this.doAction();
|
||||||
if (core.isReplaying()) {
|
if (core.isReplaying()) {
|
||||||
var action = core.status.replay.toReplay.shift(), index;
|
var action = core.status.replay.toReplay.shift();
|
||||||
// --- 忽略可能的turn事件
|
// --- 忽略可能的turn事件
|
||||||
if (action == 'turn') action = core.status.replay.toReplay.shift();
|
if (action == 'turn') action = core.status.replay.toReplay.shift();
|
||||||
if (action.indexOf("choices:") == 0 && ((index = parseInt(action.substring(8))) >= 0) && index < data.choices.length) {
|
if (action.indexOf('choices:') == 0) {
|
||||||
core.status.event.selection = index;
|
var index = action.substring(8);
|
||||||
setTimeout(function () {
|
if (index == 'none' || ((index = parseInt(index)) >= 0) && index < data.choices.length) {
|
||||||
core.status.route.push("choices:" + index);
|
core.status.event.selection = index;
|
||||||
core.insertAction(data.choices[index].action);
|
setTimeout(function () {
|
||||||
core.doAction();
|
core.status.route.push("choices:"+index);
|
||||||
}, core.status.replay.speed == 24 ? 1 : 750 / Math.max(1, core.status.replay.speed))
|
if (index != 'none') {
|
||||||
}
|
core.insertAction(data.choices[index].action);
|
||||||
else {
|
}
|
||||||
core.control._replay_error(action);
|
core.doAction();
|
||||||
return;
|
}, core.status.replay.speed == 24 ? 1 : 750 / Math.max(1, core.status.replay.speed));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else if (data.timeout) {
|
||||||
|
core.status.event.interval = setTimeout(function () {
|
||||||
|
core.status.route.push("choices:none");
|
||||||
|
core.doAction();
|
||||||
|
}, data.timeout);
|
||||||
}
|
}
|
||||||
core.ui.drawChoices(data.text, data.choices);
|
core.ui.drawChoices(data.text, data.choices);
|
||||||
}
|
}
|
||||||
@ -1795,25 +1802,35 @@ events.prototype._precompile_choices = function (data) {
|
|||||||
events.prototype._action_confirm = function (data, x, y, prefix) {
|
events.prototype._action_confirm = function (data, x, y, prefix) {
|
||||||
core.status.event.ui = {"text": data.text, "yes": data.yes, "no": data.no};
|
core.status.event.ui = {"text": data.text, "yes": data.yes, "no": data.no};
|
||||||
if (core.isReplaying()) {
|
if (core.isReplaying()) {
|
||||||
var action = core.status.replay.toReplay.shift(), index;
|
var action = core.status.replay.toReplay.shift();
|
||||||
// --- 忽略可能的turn事件
|
// --- 忽略可能的turn事件
|
||||||
if (action == 'turn') action = core.status.replay.toReplay.shift();
|
if (action == 'turn') action = core.status.replay.toReplay.shift();
|
||||||
if (action.indexOf("choices:") == 0 && ((index = parseInt(action.substring(8))) >= 0) && index < 2) {
|
if (action.indexOf('choices:') == 0) {
|
||||||
core.status.event.selection = index;
|
var index = action.substring(8);
|
||||||
setTimeout(function () {
|
if (index == 'none' || ((index = parseInt(index)) >= 0) && index < 2) {
|
||||||
core.status.route.push("choices:" + index);
|
core.status.event.selection = index;
|
||||||
if (index == 0) core.insertAction(data.yes);
|
setTimeout(function () {
|
||||||
else core.insertAction(data.no);
|
core.status.route.push("choices:"+index);
|
||||||
core.doAction();
|
if (index != 'none') {
|
||||||
}, core.status.replay.speed == 24 ? 1 : 750 / Math.max(1, core.status.replay.speed))
|
if (index == 0) core.insertAction(data.yes);
|
||||||
}
|
else core.insertAction(data.no);
|
||||||
else {
|
}
|
||||||
|
core.doAction();
|
||||||
|
}, core.status.replay.speed == 24 ? 1 : 750 / Math.max(1, core.status.replay.speed));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
core.control._replay_error(action);
|
core.control._replay_error(action);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
core.status.event.selection = data["default"] ? 0 : 1;
|
core.status.event.selection = data["default"] ? 0 : 1;
|
||||||
|
if (data.timeout) {
|
||||||
|
core.status.event.interval = setTimeout(function () {
|
||||||
|
core.status.route.push("choices:none");
|
||||||
|
core.doAction();
|
||||||
|
}, data.timeout);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
core.ui.drawConfirmBox(data.text);
|
core.ui.drawConfirmBox(data.text);
|
||||||
}
|
}
|
||||||
|
|||||||
21
libs/ui.js
21
libs/ui.js
@ -1409,7 +1409,7 @@ ui.prototype._drawChoices_drawChoices = function (choices, isWindowSkin, hPos, v
|
|||||||
core.fillText('ui', choices[i].text, offset, vPos.choice_top + 32 * i, color);
|
core.fillText('ui', choices[i].text, offset, vPos.choice_top + 32 * i, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (choices.length>0) {
|
if (choices.length>0 && core.status.event.selection != 'none') {
|
||||||
core.status.event.selection = core.status.event.selection || 0;
|
core.status.event.selection = core.status.event.selection || 0;
|
||||||
while (core.status.event.selection < 0) core.status.event.selection += choices.length;
|
while (core.status.event.selection < 0) core.status.event.selection += choices.length;
|
||||||
while (core.status.event.selection >= choices.length) core.status.event.selection -= choices.length;
|
while (core.status.event.selection >= choices.length) core.status.event.selection -= choices.length;
|
||||||
@ -1435,7 +1435,7 @@ ui.prototype.drawConfirmBox = function (text, yesCallback, noCallback) {
|
|||||||
core.status.event.data = {'yes': yesCallback, 'no': noCallback};
|
core.status.event.data = {'yes': yesCallback, 'no': noCallback};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (core.status.event.selection != 0) core.status.event.selection = 1;
|
if (core.status.event.selection != 0 && core.status.event.selection != 'none') core.status.event.selection = 1;
|
||||||
this.clearUI();
|
this.clearUI();
|
||||||
|
|
||||||
core.setFont('ui', this._buildFont(19, true));
|
core.setFont('ui', this._buildFont(19, true));
|
||||||
@ -1451,14 +1451,15 @@ ui.prototype.drawConfirmBox = function (text, yesCallback, noCallback) {
|
|||||||
|
|
||||||
core.fillText('ui', "确定", this.HPIXEL - 38, rect.bottom - 35, null, this._buildFont(17, true));
|
core.fillText('ui', "确定", this.HPIXEL - 38, rect.bottom - 35, null, this._buildFont(17, true));
|
||||||
core.fillText('ui', "取消", this.HPIXEL + 38, rect.bottom - 35);
|
core.fillText('ui', "取消", this.HPIXEL + 38, rect.bottom - 35);
|
||||||
var len=core.calWidth('ui', "确定");
|
if (core.status.event.selection != 'none') {
|
||||||
var strokeLeft = this.HPIXEL + (76*core.status.event.selection-38) - parseInt(len/2) - 5;
|
var len=core.calWidth('ui', "确定");
|
||||||
|
var strokeLeft = this.HPIXEL + (76*core.status.event.selection-38) - parseInt(len/2) - 5;
|
||||||
if (isWindowSkin)
|
|
||||||
this.drawWindowSelector(core.status.textAttribute.background, strokeLeft, rect.bottom-35-20, len+10, 28);
|
if (isWindowSkin)
|
||||||
else
|
this.drawWindowSelector(core.status.textAttribute.background, strokeLeft, rect.bottom-35-20, len+10, 28);
|
||||||
core.strokeRect('ui', strokeLeft, rect.bottom-35-20, len+10, 28, "#FFD700", 2);
|
else
|
||||||
|
core.strokeRect('ui', strokeLeft, rect.bottom-35-20, len+10, 28, "#FFD700", 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ui.prototype._drawConfirmBox_getRect = function (contents) {
|
ui.prototype._drawConfirmBox_getRect = function (contents) {
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
5. 建议优化core.splitLines()来避免把单词打断和触犯标点禁则,如点号和右标号禁止用于行首,左标号禁止用于行尾
|
5. 建议优化core.splitLines()来避免把单词打断和触犯标点禁则,如点号和右标号禁止用于行首,左标号禁止用于行尾
|
||||||
(已完成!) 6. core.drawAnimate()和对应的事件,建议增加一个boolean型参数来表示坐标是绝对坐标(即当前的实现)还是在视野中的相对坐标(以13*13为例相对坐标总是在0~12之间),以实现形如“在视野正中心播放某某动画”的需求(小地图可以写6,6,大地图怎么办)
|
(已完成!) 6. core.drawAnimate()和对应的事件,建议增加一个boolean型参数来表示坐标是绝对坐标(即当前的实现)还是在视野中的相对坐标(以13*13为例相对坐标总是在0~12之间),以实现形如“在视野正中心播放某某动画”的需求(小地图可以写6,6,大地图怎么办)
|
||||||
(已完成!) 7. 建议把core.playBgm(bgm, startTime)的startTime参数在事件中也提供出来,以用于一些演出(比如适当的剧情处直接从高潮开始)。同理可以让“暂停背景音乐”记录下当前播放到了第几秒,并在“恢复背景音乐”中自动从这个秒数恢复。作者还可以手动配合音量渐变效果
|
(已完成!) 7. 建议把core.playBgm(bgm, startTime)的startTime参数在事件中也提供出来,以用于一些演出(比如适当的剧情处直接从高潮开始)。同理可以让“暂停背景音乐”记录下当前播放到了第几秒,并在“恢复背景音乐”中自动从这个秒数恢复。作者还可以手动配合音量渐变效果
|
||||||
8. 系统设置菜单中“音量”和“步时”的点击区并不是根据文本长度自动适配的,这导致作者修改文本(包括但不限于翻译)后玩家难以找到准确的点击区,建议优化
|
(已完成!) 8. 系统设置菜单中“音量”和“步时”的点击区并不是根据文本长度自动适配的,这导致作者修改文本(包括但不限于翻译)后玩家难以找到准确的点击区,建议优化
|
||||||
9. 建议给“显示选择项”、“显示确认框”、“等待用户操作”这三个事件添加一个“若多少毫秒内不响应则触发的分支”,用来实现一些如新新2的QTE,录像中可以记录“choice: timeout”、“confirm: timeout”和“wait: timeout”来表示触发了超时分支
|
9. 建议给“显示选择项”、“显示确认框”、“等待用户操作”这三个事件添加一个“若多少毫秒内不响应则触发的分支”,用来实现一些如新新2的QTE,录像中可以记录“choice: timeout”、“confirm: timeout”和“wait: timeout”来表示触发了超时分支
|
||||||
10. 建议给“转变图块”事件增加一个淡入时间参数,用于原本是空地或空气墙的情况,目前这种效果必须借助存在安全隐患的红点
|
10. 建议给“转变图块”事件增加一个淡入时间参数,用于原本是空地或空气墙的情况,目前这种效果必须借助存在安全隐患的红点
|
||||||
11. 建议修复勇士后退时跟随者的鬼畜行为,并推出一套能够对跟随者位置和朝向进行读写的API甚至事件,且允许这些信息被计入存档,以实现一些演出效果甚至游戏要素,如新新2用公主占位防冰块
|
11. 建议修复勇士后退时跟随者的鬼畜行为,并推出一套能够对跟随者位置和朝向进行读写的API甚至事件,且允许这些信息被计入存档,以实现一些演出效果甚至游戏要素,如新新2用公主占位防冰块
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user