From 47aaacb544efbcb8881f970d77346647f430825d Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sun, 26 Aug 2018 18:07:20 +0800 Subject: [PATCH] Fix centerfly for bigmap --- libs/actions.js | 98 ++++++++++++++++++++++++------------------------ libs/core.js | 1 - libs/events.js | 9 ++++- libs/ui.js | 2 +- project/items.js | 4 +- 5 files changed, 58 insertions(+), 56 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index 1003c29c..5fa63e2b 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -165,34 +165,8 @@ actions.prototype.keyDown = function(keyCode) { case 40: core.moveHero('down'); break; - case 13: case 32: case 67: case 51: // 快捷键3:飞 - // 因为加入了两次的检测机制,从keydown转移到keyup,同时保证位置信息正确,但以下情况会触发作图的bug: - // 在鼠标的路线移动中使用飞,绿块会滞后一格,显示的位置不对,同时也不会倍以下的代码清除 - if (core.status.heroStop && core.hasItem('centerFly')) { - if (core.status.usingCenterFly) { - if (core.canUseItem('centerFly')) { - core.useItem('centerFly'); - core.clearMap('ui', core.getHeroLoc('x')*32,core.getHeroLoc('y')*32,32,32); - } - else { - core.drawTip('当前不能使用中心对称飞行器'); - core.clearMap('ui', (12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32); - } - core.status.usingCenterFly = false; - } else if (keyCode==51) { - core.status.usingCenterFly = true; - core.setAlpha('ui', 0.5); - core.fillRect('ui',(12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32,core.canUseItem('centerFly')?'#00FF00':'#FF0000'); - core.setAlpha('ui', 1); - core.drawTip("请确认当前中心对称飞行器的位置"); - } - } break; } - if (core.status.usingCenterFly && keyCode!=51) { - core.clearMap('ui', (12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32); - core.status.usingCenterFly= false; - } } ////// 根据放开键的code来执行一系列操作 ////// @@ -283,6 +257,10 @@ actions.prototype.keyUp = function(keyCode, fromReplay) { this.keyUpReplay(keyCode); return; } + if (core.status.event.id=='centerFly') { + this.keyUpCenterFly(keyCode); + return; + } return; } @@ -366,7 +344,7 @@ actions.prototype.keyUp = function(keyCode, fromReplay) { break; case 40: // DOWN break; - case 49: // 快捷键1:破 + case 49: // 快捷键1: 破 if (core.status.heroStop && core.hasItem('pickaxe')) { if (core.canUseItem('pickaxe')) { core.useItem('pickaxe'); @@ -376,7 +354,7 @@ actions.prototype.keyUp = function(keyCode, fromReplay) { } } break; - case 50: // 快捷键2:炸 + case 50: // 快捷键2: 炸 if (core.status.heroStop) { if (core.hasItem('bomb')) { if (core.canUseItem('bomb')) { @@ -397,6 +375,11 @@ actions.prototype.keyUp = function(keyCode, fromReplay) { } } break; + case 51: // 快捷键3: 飞 + if (core.status.heroStop && core.hasItem('centerFly')) { + core.events.useItem('centerFly'); + } + break; } @@ -533,30 +516,18 @@ actions.prototype.onclick = function (x, y, stepPostfix) { // 非游戏屏幕内 if (x<0 || y<0 || x>12 || y>12) return; - // 中心对称飞行器 - if (core.status.usingCenterFly) { - if (x!=12-core.getHeroLoc('x') || y!=12-core.getHeroLoc('y')) { - core.clearMap('ui', (12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32); - } else { - if (core.canUseItem('centerFly')) { - core.useItem('centerFly'); - core.clearMap('ui', core.getHeroLoc('x')*32,core.getHeroLoc('y')*32,32,32); - return; - } - else { - core.drawTip('当前不能使用中心对称飞行器'); - core.clearMap('ui', (12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32); - } - } - core.status.usingCenterFly= false; - } - // 寻路 if (!core.status.lockControl) { core.setAutomaticRoute(x+parseInt(core.bigmap.offsetX/32), y+parseInt(core.bigmap.offsetY/32), stepPostfix); return; } + // 中心对称飞行器 + if (core.status.event.id == 'centerFly') { + this.clickCenterFly(x, y); + return; + } + // 怪物手册 if (core.status.event.id == 'book') { this.clickBook(x,y); @@ -705,8 +676,8 @@ actions.prototype.onmousewheel = function (direct) { // 浏览地图 if (core.status.lockControl && core.status.event.id == 'viewMaps') { - if (direct==1) this.clickViewMaps(6,2); - if (direct==-1) this.clickViewMaps(6,10); + if (direct==1) this.clickViewMaps(6,3); + if (direct==-1) this.clickViewMaps(6,9); return; } } @@ -747,6 +718,32 @@ actions.prototype.keyDownCtrl = function () { } } +////// +actions.prototype.clickCenterFly = function(x, y) { + if (x==core.status.event.data.x && y==core.status.event.data.y) { + if (core.canUseItem('centerFly')) { + core.useItem('centerFly'); + } + else { + core.drawTip('当前不能使用中心对称飞行器'); + } + } + core.ui.closePanel(); +} + +actions.prototype.keyUpCenterFly = function (keycode) { + if (keycode==51 || keycode==13 || keycode==32 || keycode==67) { + if (core.canUseItem('centerFly')) { + core.useItem('centerFly'); + } + else { + core.drawTip('当前不能使用中心对称飞行器'); + } + } + core.ui.closePanel(); +} + + ////// 点击确认框时 ////// actions.prototype.clickConfirmBox = function (x,y) { if ((x == 4 || x == 5) && y == 7 && core.isset(core.status.event.data.yes)) @@ -976,12 +973,13 @@ actions.prototype.clickViewMaps = function (x,y) { var now = core.floorIds.indexOf(core.status.floorId); var index = core.status.event.data.index; var cx = core.status.event.data.x, cy = core.status.event.data.y; + var floorId = core.floorIds[index], mw = core.floors[floorId].width||13, mh = core.floors[floorId].height||13; - if (x>=2 && x<=10 && y<=1) { + if (x>=2 && x<=10 && y<=1 && mh>13) { core.ui.drawMaps(index, cx, cy-1); return; } - if (x>=2 && x<=10 && y>=11) { + if (x>=2 && x<=10 && y>=11 && mh>13) { core.ui.drawMaps(index, cx, cy+1); return; } diff --git a/libs/core.js b/libs/core.js index bdb734b8..c18777a7 100644 --- a/libs/core.js +++ b/libs/core.js @@ -151,7 +151,6 @@ function core() { "time": 0, }, 'curtainColor': null, - 'usingCenterFly':false, 'openingDoor': null, 'isSkiing': false, diff --git a/libs/events.js b/libs/events.js index 215a6a51..718f3ec3 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1490,10 +1490,15 @@ events.prototype.useItem = function(itemId) { return; } if (itemId=='centerFly') { - core.status.usingCenterFly= true; + core.lockControl(); + core.status.event.id = 'centerFly'; var fillstyle = 'rgba(255,0,0,0.5)'; if (core.canUseItem('centerFly')) fillstyle = 'rgba(0,255,0,0.5)'; - core.fillRect('ui',(12-core.getHeroLoc('x'))*32,(12-core.getHeroLoc('y'))*32,32,32,fillstyle); + var toX = core.bigmap.width-1 - core.getHeroLoc('x'), toY = core.bigmap.height-1-core.getHeroLoc('y'); + core.ui.drawThumbnail(core.status.floorId, 'ui', core.status.thisMap.blocks, 0, 0, 416, toX, toY, core.status.hero.loc, core.getFlag('heroIcon', "hero.png")); + var offsetX = core.clamp(toX-6, 0, core.bigmap.width-13), offsetY = core.clamp(toY-6, 0, core.bigmap.height-13); + core.fillRect('ui',(toX-offsetX)*32,(toY-offsetY)*32,32,32,fillstyle); + core.status.event.data = {"x": toX, "y": toY, "poxX": toX-offsetX, "posY": toY-offsetY}; core.drawTip("请确认当前中心对称飞行器的位置"); return; } diff --git a/libs/ui.js b/libs/ui.js index b3fc3c82..0bc7eea4 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -1843,7 +1843,7 @@ ui.prototype.drawThumbnail = function(floorId, canvas, blocks, x, y, size, cente if (!core.isset(centerX)) centerX=parseInt(mw/2); if (!core.isset(centerY)) centerY=parseInt(mh/2); - var offsetX = core.clamp(centerX-6, 0, mw), offsetY = core.clamp(centerY-6, 0, mh); + var offsetX = core.clamp(centerX-6, 0, mw-13), offsetY = core.clamp(centerY-6, 0, mh-13); // offsetX~offsetX+12; offsetY~offsetY+12 core.canvas[canvas].drawImage(tempCanvas.canvas, offsetX*32, offsetY*32, 416, 416, x, y, size, size); } diff --git a/project/items.js b/project/items.js index b6848936..a0236f61 100644 --- a/project/items.js +++ b/project/items.js @@ -290,7 +290,7 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "bigKey": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n core.drawTip(core.material.items[itemId].name + '使用成功');\n});", "bomb": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n core.drawTip(core.material.items[itemId].name + '使用成功');\n core.events.afterUseBomb();\n});", "hammer": "core.removeBlockByIds(core.status.floorId, core.status.event.data);\ncore.drawMap(core.status.floorId, function () {\n core.drawTip(core.material.items[itemId].name + '使用成功');\n core.events.afterUseBomb();\n});", - "centerFly": "core.clearMap('hero');\ncore.setHeroLoc('x', core.status.event.data.x);\ncore.setHeroLoc('y', core.status.event.data.y);\ncore.drawHero();\ncore.drawTip(core.material.items[itemId].name + '使用成功');", + "centerFly": "core.clearMap('hero');\ncore.setHeroLoc('x', (core.bigmap.width||13)-1-core.getHeroLoc('x'));\ncore.setHeroLoc('y', (core.bigmap.height||13)-1-core.getHeroLoc('y'));\ncore.drawHero();\ncore.drawTip(core.material.items[itemId].name + '使用成功');", "upFly": "var loc = {'direction': core.status.hero.loc.direction, 'x': core.status.event.data.x, 'y': core.status.event.data.y};\ncore.changeFloor(core.status.event.data.id, null, loc, null, function (){\n core.drawTip(core.material.items[itemId].name + '使用成功');\n core.replay();\n});", "downFly": "var loc = {'direction': core.status.hero.loc.direction, 'x': core.status.event.data.x, 'y': core.status.event.data.y};\ncore.changeFloor(core.status.event.data.id, null, loc, null, function (){\n core.drawTip(core.material.items[itemId].name + '使用成功');\n core.replay();\n});", "poisonWine": "core.setFlag('poison', false);", @@ -320,7 +320,7 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "bomb": "var able=false;\nvar ids = [], id2s = [];\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) && block.event.cls.indexOf('enemy')==0 && \n\t\tMath.abs(block.x-core.status.hero.loc.x)+Math.abs(block.y-core.status.hero.loc.y)<=1) {\n\t\tvar enemy = core.material.enemys[block.event.id];\n\t\tif (core.isset(enemy) && enemy.notBomb) continue;\n\t\tif (core.flags.bombFourDirections || (block.x==core.nextX() && block.y==core.nextY()))\n\t\t\tids.push(i);\n\t\telse\n\t\t\tid2s.push(i);\n\t}\n}\nif (ids.length>0) {\n\tcore.status.event.data = ids;\n\table=true;\n}\nelse if (id2s.length==1) {\n\tcore.status.event.data = id2s;\n\table=true;\n}\nable", "hammer": "var able=false;\nvar ids = [], id2s = [];\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) && block.event.cls.indexOf('enemy')==0 && \n\t\tMath.abs(block.x-core.status.hero.loc.x)+Math.abs(block.y-core.status.hero.loc.y)<=1) {\n\t\tvar enemy = core.material.enemys[block.event.id];\n\t\tif (core.isset(enemy) && enemy.notBomb) continue;\n\t\tif (block.x==core.nextX() && block.y==core.nextY())\n\t\t\tids.push(i);\n\t\telse\n\t\t\tid2s.push(i);\n\t}\n}\nif (ids.length>0) {\n\tcore.status.event.data = ids;\n\table=true;\n}\nelse if (id2s.length==1) {\n\tcore.status.event.data = id2s;\n\table=true;\n}\nable", "earthquake": "var able=false;\nvar ids = [];\nfor (var i in core.status.thisMap.blocks) {\n var block = core.status.thisMap.blocks[i];\n if (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) && (block.event.id == 'yellowWall' || block.event.id == 'blueWall' || block.event.id == 'whiteWall')) // 能炸的墙壁\n ids.push(i);\n}\nif (ids.length>0) {\n core.status.event.data = ids;\n able=true;\n}\nable", - "centerFly": "var able=false;\nvar toX = 12 - core.getHeroLoc('x'), toY = 12-core.getHeroLoc('y');\nvar block = core.getBlock(toX, toY);\nif (block==null) {\n core.status.event.data = {'x': toX, 'y': toY};\n able = true;\n}\nable", + "centerFly": "var toX = (core.bigmap.width||13)-1-core.getHeroLoc('x'), toY = (core.bigmap.height||13)-1-core.getHeroLoc('y');\ncore.getBlockId(toX, toY) == null", "upFly": "var able=false;\nvar floorId = core.status.floorId, index = core.floorIds.indexOf(floorId);\nif (index0) {\n\tvar toId = core.floorIds[index-1], toX = core.getHeroLoc('x'), toY = core.getHeroLoc('y');\n\tif (core.getBlock(toX, toY, toId)==null) {\n\t\tcore.status.event.data = {'id': toId, 'x': toX, 'y': toY};\n\t\table=true;\n\t}\n}\nable", "snow": "var able=false;\nvar ids = [], id2s = [];\nfor (var i in core.status.thisMap.blocks) {\n\tvar block = core.status.thisMap.blocks[i];\n\tif (core.isset(block.event) && !(core.isset(block.enable) && !block.enable) \n\t\t&& block.event.id == 'lava' && Math.abs(block.x-core.status.hero.loc.x)+Math.abs(block.y-core.status.hero.loc.y)<=1) {\n\t\tif (core.flags.snowFourDirections || (block.x == core.nextX() && block.y == core.nextY()))\n\t\t\tids.push(i);\n\t\telse id2s.push(i);\n\t}\n}\nif (ids.length>0) {\n\tcore.status.event.data = ids;\n\table=true;\n}\nelse if (id2s.length==1) {\n\tcore.status.event.data = id2s;\n\table=true;\n}\nable",