diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index 6449f4d5..48b6854c 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -412,6 +412,51 @@ var code = ' \n'; return code; */; +floorImage_m + : '楼层贴图' BGNL? Newline floorImageList+ BEND + + +/* floorImage_m +tooltip : 楼层贴图 +helpUrl : https://h5mota.com/games/template/_docs/#/event +var code = '[\n'+floorImageList_0+']\n'; +return code; +*/; + +floorImageList + : floorOneImage + | floorEmptyImage; + +floorOneImage + : '图片名' EvalString '翻转' Reverse_List '图层' Bg_Fg2_List '绘制坐标' 'x' Int 'y' Int '初始禁用' Bool BGNL? Newline + '裁剪起点坐标' 'x' IntString? 'y' IntString? '宽' IntString? '高' IntString? '帧数' IntString? BEND + + +/* floorOneImage +tooltip : 楼层贴图 +default : ["bg.jpg","null","bg",0,0,false,"","","","",""] +helpUrl : https://h5mota.com/games/template/_docs/#/event +if (Reverse_List_0 && Reverse_List_0 != 'null') { + Reverse_List_0 = ', "reverse": "' + Reverse_List_0 + '"'; +} else Reverse_List_0 = ''; +Bool_0 = Bool_0 ? (', "disable": true') : ''; +IntString_0 = IntString_0 && (', "sx": '+IntString_0); +IntString_1 = IntString_1 && (', "sy": '+IntString_1); +IntString_2 = IntString_2 && (', "w": '+IntString_2); +IntString_3 = IntString_3 && (', "h": '+IntString_3); +IntString_4 = IntString_4 && (', "frame": '+IntString_4); +return '{"name": "'+EvalString_0+'"'+Reverse_List_0+', "canvas": "'+Bg_Fg2_List_0+'", "x": '+Int_0+', "y": '+Int_1+Bool_0+IntString_0+IntString_1+IntString_2+IntString_3+IntString_4+'},\n'; +*/; + +floorEmptyImage + : Newline + +/* floorEmptyImage +var code = ' \n'; +return code; +*/; + + //为了避免关键字冲突,全部加了_s //动作 @@ -2910,6 +2955,10 @@ Bg_Fg_List : '背景层'|'前景层' /*Bg_Fg_List ['bg','fg']*/; +Bg_Fg2_List + : '背景层'|'前景层'|'自适配' + /*Bg_Fg2_List ['bg','fg','auto']*/; + IgnoreChangeFloor_List : '全局默认值' | '可穿透' | '不可穿透' /*IgnoreChangeFloor_List ['null','true','false']*/; diff --git a/_server/MotaActionParse.js b/_server/MotaActionParse.js index 5dc47b83..acfb4dcf 100644 --- a/_server/MotaActionParse.js +++ b/_server/MotaActionParse.js @@ -74,6 +74,17 @@ ActionParser.prototype.parse = function (obj,type) { } return MotaActionBlocks['equip_m'].xmlText([obj.type, obj.animate, buildEquip(obj.value), buildEquip(obj.percentage)]); + case 'floorImage': + if(!obj) obj=[]; + var text_choices = null; + for(var ii=obj.length-1,choice;choice=obj[ii];ii--) { + text_choices=MotaActionBlocks['floorOneImage'].xmlText([ + choice.name, choice.reverse, choice.canvas||'bg', choice.x||0, choice.y||0, choice.disable||false, + choice.sx, choice.sy, choice.w, choice.h, choice.frame, text_choices]); + } + return MotaActionBlocks['floorImage_m'].xmlText([text_choices]); + + case 'shop': var buildsub = function(obj,parser,next){ var text_choices = null; diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 74325011..d4cee0f8 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -78,6 +78,9 @@ editor_blockly = function () { MotaActionFunctions.actionParser.parse({ "type": 0, "value": {"atk": 10}, "percentage": {"speed": 10}, }, 'equip'), + MotaActionFunctions.actionParser.parse([{ + "name": "bg.jpg", "x": 0, "y": 0, "canvas": "bg" + }], 'floorImage'), ], '显示文字':[ MotaActionBlocks['text_0_s'].xmlText(), diff --git a/_server/table/comment.js b/_server/table/comment.js index 753dc71d..a10b93aa 100644 --- a/_server/table/comment.js +++ b/_server/table/comment.js @@ -458,7 +458,8 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { }, "images": { "_leaf": true, - "_type": "textarea", + "_type": "event", + "_event": "floorImage", "_docs": "楼层贴图", "_data": "背景/前景图;你可以选择若干张图片来作为背景/前景素材。详细用法请参见文档“自定义素材”中的说明。" }, diff --git a/editor-mobile.html b/editor-mobile.html index b82d63df..ac036b3f 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -219,6 +219,7 @@ + diff --git a/editor.html b/editor.html index 5c00ccf8..eaa90de5 100644 --- a/editor.html +++ b/editor.html @@ -215,6 +215,7 @@ + diff --git a/libs/events.js b/libs/events.js index c03d7379..66e9922b 100644 --- a/libs/events.js +++ b/libs/events.js @@ -928,6 +928,8 @@ events.prototype.doAction = function (keepUI) { } events.prototype._doAction_finishEvents = function () { + if (core.status.gameOver) return true; + // 事件处理完毕 if (core.status.event.data.list.length == 0) { // 检测并执行延迟自动事件 diff --git a/libs/maps.js b/libs/maps.js index f7a94593..b95d77b6 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -22,6 +22,17 @@ maps.prototype._setFloorSize = function (floorId) { core.floors[floorId].height = core.floors[floorId].height || core.__SIZE__; } +maps.prototype._resetFloorImages = function () { + for (var floorId in core.status.maps) { + (core.status.maps[floorId].images || []).forEach(function (one) { + var flag = "__floorImg__" + floorId + "_" + one.x + "_" + one.y; + if (core.getFlag(flag) == null) { + if (one.disabled) core.setFlag(flag, true); + } + }) + } +} + // ------ 加载地图与地图的存档读档(压缩与解压缩) ------ // ////// 加载某个楼层(从剧本或存档中) ////// @@ -896,39 +907,25 @@ maps.prototype._drawFloorImages = function (floorId, ctx, name, images, currStat floorId = floorId || core.status.floorId; if (!images) images = this._getFloorImages(floorId); var redraw = currStatus != null; - images.forEach(function (t) { - if (typeof t == 'string') t = [0, 0, t]; - var dx = parseInt(t[0]), dy = parseInt(t[1]), imageName = t[2], frame = core.clamp(parseInt(t[4]), 1, 8); - if (imageName.endsWith(':x') || imageName.endsWith(':y') || imageName.endsWith(':o')) { - imageName = imageName.substring(0, imageName.length - 2); - } - imageName = core.getMappedName(imageName); - var image = core.material.images.images[imageName]; + images.forEach(function (one) { + var image = core.material.images.images[core.getMappedName(one.name)]; + var frame = one.frame || 1; + if (!image) return; + var flag = "__floorImg__" + floorId + "_" + one.x + "_" + one.y; + if (core.hasFlag(flag)) return; if (redraw && frame == 1) return; // 不重绘 - if (core.isset(dx) && core.isset(dy) && image && - !core.hasFlag("__floorImg__" + floorId + "_" + dx + "_" + dy)) { - var width = parseInt(image.width / frame), offsetX = (currStatus || 0) % frame * width; - if (/.*\.gif/i.test(imageName) && main.mode == 'play') { - if (redraw) return; // 忽略gif - this._drawFloorImages_gif(image, dx, dy); - return; - } - core.maps._drawFloorImage(ctx, name, t[3], t[2], image, offsetX, width, dx, dy, redraw); + if (/.*\.gif/i.test(one.name)) { + if (redraw) return; + this._drawFloorImages_gif(image, one.x, one.y); + return; } - }); + this._drawFloorImage(ctx, name, one, image, currStatus); + }, this); } maps.prototype._getFloorImages = function (floorId) { - floorId = floorId || core.status.floorId; - var images = []; - if ((core.status.maps || core.floors)[floorId].images) { - images = (core.status.maps || core.floors)[floorId].images; - if (typeof images == 'string') { - images = [[0, 0, images]]; - } - } - return images; + return ((core.status.maps || core.floors)[floorId || core.status.floorId] || {}).images || []; } maps.prototype._drawFloorImages_gif = function (image, dx, dy) { @@ -944,30 +941,26 @@ maps.prototype._drawFloorImages_gif = function (image, dx, dy) { return; } -maps.prototype._drawFloorImage = function (ctx, name, type, imageName, image, offsetX, width, dx, dy, redraw) { +maps.prototype._drawFloorImage = function (ctx, name, one, image, currStatus) { var height = image.height; - var _draw = function () { - if (redraw) core.clearMap(ctx, dx, dy, width, height); - core.drawImage(ctx, imageName, offsetX, 0, width, height, dx, dy, width, height); - } - if (!type) { - if (name != 'bg') return; - return _draw(); - } - if (type == 1) { - if (name != 'fg') return; - return _draw(); - } - if (type == 2) { + var imageName = one.name + (one.reverse||''); + var width = parseInt((one.w == null ? image.width : one.w) / (one.frame || 1)); + var height = one.h == null ? image.height : one.h; + var sx = (one.sx || 0) + (currStatus || 0) % (one.frame || 1) * width; + var sy = one.sy || 0; + + if (one.canvas != 'auto' && one.canvas != name) return; + if (one.canvas != 'auto') { + if (currStatus != null) core.clearMap(ctx, one.x, one.y, width, height); + core.drawImage(ctx, imageName, sx, sy, width, height, one.x, one.y, width, height); + } else { if (name == 'bg') { - if (redraw) core.clearMap(ctx, dx, dy + height - 32, width, 32); - core.drawImage('bg', imageName, offsetX, height - 32, width, 32, dx, dy + height - 32, width, 32); + if (currStatus != null) core.clearMap(ctx, one.x, one.y + height - 32, width, 32); + core.drawImage(ctx, imageName, sx, sy + height - 32, width, 32, one.x, one.y+height - 32, width, 32); + } else if (name == 'fg') { + if (currStatus != null) core.clearMap(ctx, one.x, one.y, width, height - 32); + core.drawImage(ctx, imageName, sx, sy, width, height - 32, one.x, one.y, width, height - 32); } - else if (name == 'fg') { - if (redraw) core.clearMap(ctx, dx, dy, width, height - 32); - core.drawImage('fg', imageName, offsetX, 0, width, height - 32, dx, dy, width, height - 32); - } - return; } } diff --git a/project/floors/sample1.js b/project/floors/sample1.js index a3468def..14361334 100644 --- a/project/floors/sample1.js +++ b/project/floors/sample1.js @@ -7,12 +7,14 @@ main.floors.sample1= "canUseQuickShop": true, "defaultGround": "grass", "images": [ - [ - 0, - 0, - "bg.jpg", - 0 - ] + { + "name": "bg.jpg", + "canvas": "bg", + "x": 0, + "y": 0, + "w": 416, + "h": 416 + } ], "weather": [ "snow", @@ -263,13 +265,13 @@ main.floors.sample1= } ], "10,4": [ - "\t[blackKing]你终于还是来了。", + "\t[blackMS]你终于还是来了。", "\t[hero]放开我们的公主!", - "\t[blackKing]如果我不愿意呢?", + "\t[blackMS]如果我不愿意呢?", "\t[hero]无需多说,拔剑吧!", { "type": "battle", - "id": "blackKing" + "id": "blackMS" }, { "type": "hide", @@ -285,7 +287,7 @@ main.floors.sample1= 7 ] }, - "\t[blackKing]没想到你已经变得这么强大了... 算你厉害。\n公主就交给你了,请好好对她。", + "\t[blackMS]没想到你已经变得这么强大了... 算你厉害。\n公主就交给你了,请好好对她。", { "type": "hide" } diff --git a/project/functions.js b/project/functions.js index 220ffe03..2ba7ca99 100644 --- a/project/functions.js +++ b/project/functions.js @@ -26,6 +26,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = // 初始化地图 core.status.floorId = floorId; core.status.maps = maps; + core.maps._resetFloorImages(); // 初始化怪物和道具 core.material.enemys = core.enemys.getEnemys(); core.material.items = core.items.getItems(); diff --git a/v2.x-final更新.txt b/v2.x-final更新.txt index a66af87d..c9ebdcbd 100644 --- a/v2.x-final更新.txt +++ b/v2.x-final更新.txt @@ -64,6 +64,9 @@ 右键图块选择复制/粘贴事件 (已完成!) showImage, drawImage,立绘等加上对称选项 更多的图块blockly化 +勇士帧抖动 +怪物名和特殊属性自动缩小 + -------------