diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index b0f62c8f..c0cc73ff 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -650,7 +650,7 @@ return code; */ animateImage_0_s - : '图片淡入' EvalString '起点像素位置' 'x' Number 'y' Number '动画时间' Int Newline + : '图片淡入' EvalString '起点像素位置' 'x' PosString 'y' PosString '动画时间' Int Newline ; /* animateImage_0_s @@ -658,12 +658,12 @@ tooltip : animageImage:图片淡入 helpUrl : https://ckcz123.github.io/mota-js/#/event?id=animateimage%ef%bc%9a%e5%9b%be%e7%89%87%e6%b7%a1%e5%85%a5%e6%b7%a1%e5%87%b default : ["bg.jpg",0,0,500] colour : this.printColor -var code = '{"type": "animateImage", "action": "show", "name": "'+EvalString_0+'", "loc": ['+Number_0+','+Number_1+'], "time": '+Int_0+'},\n'; +var code = '{"type": "animateImage", "action": "show", "name": "'+EvalString_0+'", "loc": ['+PosString_0+','+PosString_1+'], "time": '+Int_0+'},\n'; return code; */ animateImage_1_s - : '图片淡出' EvalString '起点像素位置' 'x' Number 'y' Number '动画时间' Int Newline + : '图片淡出' EvalString '起点像素位置' 'x' PosString 'y' PosString '动画时间' Int Newline ; /* animateImage_1_s @@ -671,12 +671,12 @@ tooltip : animageImage:图片淡出 helpUrl : https://ckcz123.github.io/mota-js/#/event?id=animateimage%ef%bc%9a%e5%9b%be%e7%89%87%e6%b7%a1%e5%85%a5%e6%b7%a1%e5%87%b default : ["bg.jpg",0,0,500] colour : this.printColor -var code = '{"type": "animateImage", "action": "hide", "name": "'+EvalString_0+'", "loc": ['+Number_0+','+Number_1+'], "time": '+Int_0+'},\n'; +var code = '{"type": "animateImage", "action": "hide", "name": "'+EvalString_0+'", "loc": ['+PosString_0+','+PosString_1+'], "time": '+Int_0+'},\n'; return code; */ showGif_0_s - : '显示动图' EvalString '起点像素位置' 'x' Number 'y' Number Newline + : '显示动图' EvalString '起点像素位置' 'x' PosString 'y' PosString Newline ; /* showGif_0_s @@ -684,7 +684,7 @@ tooltip : showGif:显示动图 helpUrl : https://ckcz123.github.io/mota-js/#/event?id=showgif%ef%bc%9a%e6%98%be%e7%a4%ba%e5%8a%a8%e5%9b%be default : ["bg.gif",0,0] colour : this.printColor -var code = '{"type": "showGif", "name": "'+EvalString_0+'", "loc": ['+Number_0+','+Number_1+']},\n'; +var code = '{"type": "showGif", "name": "'+EvalString_0+'", "loc": ['+PosString_0+','+PosString_1+']},\n'; return code; */ diff --git a/libs/control.js b/libs/control.js index 70103bb9..fdc58a67 100644 --- a/libs/control.js +++ b/libs/control.js @@ -583,9 +583,14 @@ control.prototype.setHeroMoveInterval = function (direction, x, y, callback) { 'down': {'x': 0, 'y': 1}, 'right': {'x': 1, 'y': 0} }; + + var toAdd = 1; + if (core.status.replay.speed>3) + toAdd = 2; + core.interval.heroMoveInterval = window.setInterval(function () { - core.status.heroMoving++; - if (core.status.heroMoving==8) { + core.status.heroMoving+=toAdd; + if (core.status.heroMoving>=8) { core.setHeroLoc('x', x+scan[direction].x); core.setHeroLoc('y', y+scan[direction].y); core.moveOneStep(); @@ -595,7 +600,7 @@ control.prototype.setHeroMoveInterval = function (direction, x, y, callback) { core.status.heroMoving = 0; if (core.isset(callback)) callback(); } - }, 12.5 / core.status.replay.speed); + }, 12.5 * toAdd / core.status.replay.speed); } ////// 实际每一步的行走过程 ////// @@ -1428,8 +1433,9 @@ control.prototype.resumeReplay = function () { control.prototype.speedUpReplay = function () { if (core.status.event.id=='save') return; if (!core.status.replay.replaying) return; - core.status.replay.speed = parseInt(10*core.status.replay.speed + 1)/10; - if (core.status.replay.speed>3.0) core.status.replay.speed=3.0; + var toAdd = core.status.replay.speed>2?2:1; + core.status.replay.speed = parseInt(10*core.status.replay.speed + toAdd)/10; + if (core.status.replay.speed>6.0) core.status.replay.speed=6.0; core.drawTip("x"+core.status.replay.speed+"倍"); } @@ -1437,7 +1443,8 @@ control.prototype.speedUpReplay = function () { control.prototype.speedDownReplay = function () { if (core.status.event.id=='save') return; if (!core.status.replay.replaying) return; - core.status.replay.speed = parseInt(10*core.status.replay.speed - 1)/10; + var toAdd = core.status.replay.speed>2?2:1; + core.status.replay.speed = parseInt(10*core.status.replay.speed - toAdd)/10; if (core.status.replay.speed<0.3) core.status.replay.speed=0.3; core.drawTip("x"+core.status.replay.speed+"倍"); } diff --git a/libs/events.js b/libs/events.js index 4d2cf429..c5b5616a 100644 --- a/libs/events.js +++ b/libs/events.js @@ -310,8 +310,9 @@ events.prototype.doAction = function() { core.events.doAction(); break; case "show": // 显示 - if (typeof data.loc[0] == 'number' && typeof data.loc[1] == 'number') - data.loc = [data.loc]; + if ((typeof data.loc[0] == 'number' || typeof data.loc[0] == 'string') + && (typeof data.loc[1] == 'number' || typeof data.loc[1] == 'string')) + data.loc = [[core.calValue(data.loc[0]), core.calValue(data.loc[1])]]; if (core.isset(data.time) && data.time>0 && (!core.isset(data.floorId) || data.floorId==core.status.floorId)) { core.animateBlock(data.loc,'show', data.time, function () { data.loc.forEach(function (t) { @@ -330,8 +331,9 @@ events.prototype.doAction = function() { case "hide": // 消失 if (!core.isset(data.loc)) data.loc = [x,y]; - if (typeof data.loc[0] == 'number' && typeof data.loc[1] == 'number') - data.loc = [data.loc]; + if ((typeof data.loc[0] == 'number' || typeof data.loc[0] == 'string') + && (typeof data.loc[1] == 'number' || typeof data.loc[1] == 'string')) + data.loc = [[core.calValue(data.loc[0]), core.calValue(data.loc[1])]]; data.loc.forEach(function (t) { core.removeBlock(t[0],t[1],data.floorId); }) @@ -345,8 +347,8 @@ events.prototype.doAction = function() { case "setBlock": // 设置某图块 { if (core.isset(data.loc)) { - x=data.loc[0]; - y=data.loc[1]; + x=core.calValue(data.loc[0]); + y=core.calValue(data.loc[1]); } var floorId = data.floorId||core.status.floorId; var originBlock=core.getBlock(x,y,floorId,false); @@ -378,8 +380,8 @@ events.prototype.doAction = function() { y=core.getHeroLoc('y'); } else if (data.loc instanceof Array) { - x=data.loc[0]; - y=data.loc[1]; + x=core.calValue(data.loc[0]); + y=core.calValue(data.loc[1]); } } core.drawAnimate(data.name, x, y, function () { @@ -388,8 +390,8 @@ events.prototype.doAction = function() { break; case "move": // 移动事件 if (core.isset(data.loc)) { - x=data.loc[0]; - y=data.loc[1]; + x=core.calValue(data.loc[0]); + y=core.calValue(data.loc[1]); } core.moveBlock(x,y,data.steps,data.time,data.immediateHide,function() { core.events.doAction(); @@ -402,7 +404,7 @@ events.prototype.doAction = function() { break; case "changeFloor": // 楼层转换 { - var heroLoc = {"x": data.loc[0], "y": data.loc[1]}; + var heroLoc = {"x": core.calValue(data.loc[0]), "y": core.calValue(data.loc[1])}; if (core.isset(data.direction)) heroLoc.direction=data.direction; core.changeFloor(data.floorId||core.status.floorId, null, heroLoc, data.time, function() { core.lockControl(); @@ -413,8 +415,8 @@ events.prototype.doAction = function() { case "changePos": // 直接更换勇士位置,不切换楼层 core.clearMap('hero', 0, 0, 416, 416); if (core.isset(data.loc)) { - core.setHeroLoc('x', data.loc[0]); - core.setHeroLoc('y', data.loc[1]); + core.setHeroLoc('x', core.calValue(data.loc[0])); + core.setHeroLoc('y', core.calValue(data.loc[1])); } if (core.isset(data.direction)) core.setHeroLoc('direction', data.direction); core.drawHero(); @@ -422,7 +424,8 @@ events.prototype.doAction = function() { break; case "showImage": // 显示图片 if (core.isset(data.loc) && core.isset(core.material.images.images[data.name])) { - core.canvas.animate.drawImage(core.material.images.images[data.name], data.loc[0], data.loc[1]); + core.canvas.animate.drawImage(core.material.images.images[data.name], + core.calValue(data.loc[0]), core.calValue(data.loc[1])); } else core.clearMap('animate', 0, 0, 416, 416); this.doAction(); @@ -447,8 +450,8 @@ events.prototype.doAction = function() { var gif = new Image(); gif.src = core.material.images.images[data.name].src; gif.style.position = 'absolute'; - gif.style.left = (data.loc[0]*core.domStyle.scale)+"px"; - gif.style.top = (data.loc[1]*core.domStyle.scale)+"px"; + gif.style.left = (core.calValue(data.loc[0])*core.domStyle.scale)+"px"; + gif.style.top = (core.calValue(data.loc[1])*core.domStyle.scale)+"px"; core.dom.gif2.appendChild(gif); } else { @@ -468,7 +471,7 @@ events.prototype.doAction = function() { case "openDoor": // 开一个门,包括暗墙 { var floorId=data.floorId || core.status.floorId; - var block=core.getBlock(data.loc[0], data.loc[1], floorId); + var block=core.getBlock(core.calValue(data.loc[0]), core.calValue(data.loc[1]), floorId); if (block!=null) { if (floorId==core.status.floorId) core.openDoor(block.block.event.id, block.block.x, block.block.y, false, function() { @@ -503,7 +506,7 @@ events.prototype.doAction = function() { break; case "trigger": // 触发另一个事件;当前事件会被立刻结束。需要另一个地点的事件是有效的 { - var toX=data.loc[0], toY=data.loc[1]; + var toX=core.calValue(data.loc[0]), toY=core.calValue(data.loc[1]); var block=core.getBlock(toX, toY); if (block!=null) { block = block.block; @@ -1031,7 +1034,7 @@ events.prototype.animateImage = function (type, image, loc, time, callback) { if (type == 'hide') opacityVal = 1; core.setOpacity('data', opacityVal); - core.canvas.data.drawImage(image, loc[0], loc[1]); + core.canvas.data.drawImage(image, core.calValue(loc[0]), core.calValue(loc[1])); core.status.replay.animate=true; var animate = setInterval(function () { if (type=='show') opacityVal += 0.1; diff --git a/libs/utils.js b/libs/utils.js index fd69165d..05cca350 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -20,6 +20,12 @@ utils.prototype.replaceText = function (text) { ////// 计算表达式的值 ////// utils.prototype.calValue = function (value) { + if (typeof value == 'number') { + return value; + } + if (value instanceof Function) { + return value(); + } value=value.replace(/status:([\w\d_]+)/g, "core.getStatus('$1')"); value=value.replace(/item:([\w\d_]+)/g, "core.itemCount('$1')"); value=value.replace(/flag:([\w\d_]+)/g, "core.getFlag('$1', 0)"); diff --git a/更新说明.txt b/更新说明.txt index 9f288b02..13d3611f 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -1,20 +1,20 @@ HTML5魔塔样板V2.2 -事件坐标可用变量指定 -全局商店也可以使用图块编辑 +事件坐标可用变量指定 √ +全局商店也可以使用图块编辑 √ 高亮显示有事件的格子 自动注册所有未注册的素材 -等待用户点击事件 +等待用户点击事件 √ 图片移动事件 -事件:设置BGM音量 +事件:设置BGM音量 √ 提供core.random函数提供随机数 作弊处理 状态栏绘制 -六倍速播放 +六倍速播放 √ 播放视频时可以C键查看怪物手册 -修复标题文字太长导致无法开始游戏的问题 -新增纯新手简易造塔流程 -部分效果和性能的优化 +修复标题文字太长导致无法开始游戏的问题 √ +新增纯新手简易造塔流程 √ +部分效果和性能的优化 √ -----------------------------------------------------------------------