From c7f30538d8b4ca92182fb5f1d23bea32f2e6d248 Mon Sep 17 00:00:00 2001 From: tocque <364004564@qq.com> Date: Wed, 19 Dec 2018 16:36:42 +0900 Subject: [PATCH 1/2] screenFlash --- _server/blockly/MotaAction.g4 | 27 +++++++++++++++++++++++++++ _server/editor_blockly.js | 1 + docs/event.md | 19 +++++++++++++++++++ libs/control.js | 21 +++++++++++---------- libs/core.js | 5 +++++ libs/events.js | 13 +++++++++++-- libs/ui.js | 22 ++++++++++++++++++++++ project/floors/sample0.js | 3 ++- project/functions.js | 6 +++--- 9 files changed, 101 insertions(+), 16 deletions(-) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index b72170e4..93b9c7b1 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -270,6 +270,7 @@ action | showGif_1_s | setFg_0_s | setFg_1_s + | screenFlash_s | setWeather_s | move_s | moveHero_s @@ -1155,6 +1156,28 @@ var code = '{"type": "setFg"'+Int_0 +async+'},\n'; return code; */; +screenFlash_s + : '画面闪烁' Number ',' Number ',' Number '强度' Number '动画时间' Int '不等待执行完毕' Bool Newline + +/* screenFlash_s +tooltip : screenFlash: 更改画面色调,动画时间可不填 +helpUrl : https://h5mota.com/games/template/docs/#/event?id=screenFlash%EF%BC%9A%E7%94%BB%E9%9D%A2%E9%97%AA%E7%83%81 +default : [255,255,255,100,500,false] +colour : this.soundColor +var limit = function(v,min,max) { + if(v>max) return max; + if(v=steps) { + if (step <= 0) { delete core.animateFrame.asyncId[changeAnimate]; clearInterval(changeAnimate); core.status.curtainColor = color; diff --git a/libs/core.js b/libs/core.js index 079c52b0..e972c986 100644 --- a/libs/core.js +++ b/libs/core.js @@ -908,6 +908,11 @@ core.prototype.setFg = function(color, time, callback) { core.control.setFg(color, time, callback); } +////// 画面闪烁 ////// +core.prototype.screenFlash = function (color, intensity, time, callback) { + core.ui.screenFlash(color, intensity, time, callback); +} + ////// 更新全地图显伤 ////// core.prototype.updateDamage = function () { core.control.updateDamage(); diff --git a/libs/events.js b/libs/events.js index 64d083aa..80475de6 100644 --- a/libs/events.js +++ b/libs/events.js @@ -822,6 +822,17 @@ events.prototype.doAction = function() { }); } break; + case "screenFlash": // 画面闪烁 + if (data.async) { + core.screenFlash(data.color, data.intensity, data.time); + this.doAction(); + } + else { + core.screenFlash(data.color, data.intensity, data.time, function() { + core.events.doAction(); + }); + } + break; case "setWeather": // 更改天气 core.setWeather(data.name, data.level); if (core.isset(data.name)) @@ -845,8 +856,6 @@ events.prototype.doAction = function() { this.doAction(); } break; - this.doAction(); - break; } case "openShop": // 打开一个全局商店 if (core.status.replay.replaying) { // 正在播放录像,简单将visited置为true diff --git a/libs/ui.js b/libs/ui.js index 7a632dc9..14e35566 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2769,6 +2769,28 @@ ui.prototype.drawHelp = function () { ]); } +////// 画面闪烁 ////// +ui.prototype.screenFlash = function (color, intensity, time, callback) { + core.ui.createCanvas("screenFlash", 0, 0, 416, 416, 155); + core.dymCanvas.screenFlash.fillStyle = core.arrayToRGB(color); + core.dymCanvas.screenFlash.fillRect(0, 0, 416, 416); + core.dymCanvas.screenFlash.canvas.style.opacity = intensity / 100; + var per_time = 10, step = parseInt(time/per_time); + var changeAnimate = setInterval(function(){ + core.dymCanvas.screenFlash.canvas.style.opacity *= (step-1)/step; + step--; + if (step <= 0) { + clearInterval(changeAnimate); + core.ui.deleteCanvas("screenFlash"); + delete core.animateFrame.asyncId[changeAnimate]; + // core.status.replay.animate=false; + if (core.isset(callback)) callback(); + } + }, per_time); + + core.animateFrame.asyncId[changeAnimate] = true; +} + ////// 动态canvas ////// ////// canvas创建 ////// diff --git a/project/floors/sample0.js b/project/floors/sample0.js index 06e8c93a..c08187bb 100644 --- a/project/floors/sample0.js +++ b/project/floors/sample0.js @@ -27,7 +27,8 @@ main.floors.sample0= "firstArrive": [ { "type": "setText", - "background": "winskin.png" + "background": "winskin.png", + "time": 0 }, "\t[样板提示]首次到达某层可以触发 firstArrive 事件,该事件可类似于RMXP中的“自动执行脚本”。\n\n本事件支持一切的事件类型,常常用来触发对话,例如:", "\t[hero]\b[up,hero]我是谁?我从哪来?我又要到哪去?", diff --git a/project/functions.js b/project/functions.js index ecf7e223..81c672f6 100644 --- a/project/functions.js +++ b/project/functions.js @@ -688,7 +688,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = case 83: // S:存档 core.save(true); break; - case 68: // D:独挡 + case 68: // D:读档 core.load(true); break; case 69: // E:打开光标 @@ -903,9 +903,9 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (core.flags.enableLevelUp && core.status.hero.lv Date: Thu, 20 Dec 2018 22:43:22 +0900 Subject: [PATCH 2/2] setFg based screenFlash --- _server/blockly/MotaAction.g4 | 13 +++++++------ docs/event.md | 10 ++++++---- libs/core.js | 4 ++-- libs/events.js | 4 ++-- libs/ui.js | 32 +++++++++++++------------------- 5 files changed, 30 insertions(+), 33 deletions(-) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index 93b9c7b1..c5b33c53 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -1157,12 +1157,12 @@ return code; */; screenFlash_s - : '画面闪烁' Number ',' Number ',' Number '强度' Number '动画时间' Int '不等待执行完毕' Bool Newline + : '画面闪烁' Number ',' Number ',' Number '强度' Number '单次时间' Int '执行次数' Int? '不等待执行完毕' Bool Newline /* screenFlash_s -tooltip : screenFlash: 更改画面色调,动画时间可不填 +tooltip : screenFlash: 画面闪烁,动画时间可不填 helpUrl : https://h5mota.com/games/template/docs/#/event?id=screenFlash%EF%BC%9A%E7%94%BB%E9%9D%A2%E9%97%AA%E7%83%81 -default : [255,255,255,100,500,false] +default : [255,255,255,1,500,1,false] colour : this.soundColor var limit = function(v,min,max) { if(v>max) return max; @@ -1172,9 +1172,10 @@ var limit = function(v,min,max) { Number_0 = limit(Number_0,0,255); Number_1 = limit(Number_1,0,255); Number_2 = limit(Number_2,0,255); -Number_3 = limit(Number_3,0,100); +Number_3 = limit(Number_3,0,1); +Int_1 = Int_1!=='' ?(', "times": '+Int_1):''; var async = Bool_0?', "async": true':''; -var code = '{"type": "screenFlash", "color": ['+Number_0+','+Number_1+','+Number_2+'], "intensity": '+Number_3+', "time": '+Int_0 +async+'},\n'; +var code = '{"type": "screenFlash", "color": ['+Number_0+','+Number_1+','+Number_2+','+Number_3+'], "time": '+Int_0 +Int_1+async+'},\n'; return code; */; @@ -2165,7 +2166,7 @@ ActionParser.prototype.parseAction = function() { break; case "screenFlash": // 画面闪烁 this.next = MotaActionBlocks['screenFlash_s'].xmlText([ - data.color[0],data.color[1],data.color[2],data.intensity||100,data.time||500,data.async||false,this.next]); + data.color[0],data.color[1],data.color[2],data.color[3]||1,data.time||500,data.times||1,data.async||false,this.next]); break; case "setWeather": // 更改天气 this.next = MotaActionBlocks['setWeather_s'].xmlText([ diff --git a/docs/event.md b/docs/event.md index c928186c..2e1c1cd4 100644 --- a/docs/event.md +++ b/docs/event.md @@ -1067,17 +1067,19 @@ async可选,如果为true则会异步执行(即不等待当前事件执行 ``` js "x,y": [ // 实际执行的事件列表 - {"type": "screenFlash", "color": [255,255,255], "intensity": 60, "time": 500}, // 闪光为白色,强度为60,动画时间1000毫秒 - {"type": "screenFlash", "color": [255,0,0], "intensity": 100, "time": 100,"async": true}, // 闪光为红色,强度最大,动画时间100毫秒,且异步执行 + {"type": "screenFlash", "color": [255,255,255,0.6], "time": 500, "times": 1}, // 闪光为白色,不透明度0.6,动画时间1000毫秒 + {"type": "screenFlash", "color": [255,0,0,1], "time": 100, "times": 2, "async": true}, // 闪光为红色,强度最大,动画时间100毫秒,闪烁两次且异步执行 ] ``` -color为闪光的颜色。它是一个数组,分别指定目标颜色的R,G,B值。 +color为闪光的颜色。它是一个数组,分别指定目标颜色的R,G,B,A值。 - 常见RGB颜色: 纯黑[0,0,0],纯白[255,255,255],纯红[255,0,0],等等。 -intensity为强度,即闪光的不透明度,为一个0到100之间的数,值越高闪烁效果越强。默认为100 +A即闪光的不透明度,为一个0到1之间的数,值越高闪烁效果越强。默认为1 time为闪烁时间,默认值为500 +times为闪烁次数,两次闪烁会连续进行,默认值为1 + async可选,如果为true则会异步执行(即不等待当前事件执行完毕,立刻执行下一个事件)。 ### setWeather:更改天气 diff --git a/libs/core.js b/libs/core.js index e972c986..01796dbb 100644 --- a/libs/core.js +++ b/libs/core.js @@ -909,8 +909,8 @@ core.prototype.setFg = function(color, time, callback) { } ////// 画面闪烁 ////// -core.prototype.screenFlash = function (color, intensity, time, callback) { - core.ui.screenFlash(color, intensity, time, callback); +core.prototype.screenFlash = function (color, time, times, callback) { + core.ui.screenFlash(color, time, times, callback); } ////// 更新全地图显伤 ////// diff --git a/libs/events.js b/libs/events.js index 80475de6..20b95994 100644 --- a/libs/events.js +++ b/libs/events.js @@ -824,11 +824,11 @@ events.prototype.doAction = function() { break; case "screenFlash": // 画面闪烁 if (data.async) { - core.screenFlash(data.color, data.intensity, data.time); + core.screenFlash(data.color, data.time, data.times); this.doAction(); } else { - core.screenFlash(data.color, data.intensity, data.time, function() { + core.screenFlash(data.color, data.time, data.times, function() { core.events.doAction(); }); } diff --git a/libs/ui.js b/libs/ui.js index 14e35566..a11bf87c 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2770,25 +2770,19 @@ ui.prototype.drawHelp = function () { } ////// 画面闪烁 ////// -ui.prototype.screenFlash = function (color, intensity, time, callback) { - core.ui.createCanvas("screenFlash", 0, 0, 416, 416, 155); - core.dymCanvas.screenFlash.fillStyle = core.arrayToRGB(color); - core.dymCanvas.screenFlash.fillRect(0, 0, 416, 416); - core.dymCanvas.screenFlash.canvas.style.opacity = intensity / 100; - var per_time = 10, step = parseInt(time/per_time); - var changeAnimate = setInterval(function(){ - core.dymCanvas.screenFlash.canvas.style.opacity *= (step-1)/step; - step--; - if (step <= 0) { - clearInterval(changeAnimate); - core.ui.deleteCanvas("screenFlash"); - delete core.animateFrame.asyncId[changeAnimate]; - // core.status.replay.animate=false; - if (core.isset(callback)) callback(); - } - }, per_time); - - core.animateFrame.asyncId[changeAnimate] = true; +ui.prototype.screenFlash = function (color, time, times, callback) { + times = times || 1; + time = time/3; + var nowColor = core.clone(core.status.curtainColor); + core.setFg(color, time, function() { + core.setFg(nowColor, time * 2, function() { + if (times > 1) + core.screenFlash(color, time * 3, times - 1, callback); + else { + if (core.isset(callback)) callback(); + } + }); + }); } ////// 动态canvas //////