diff --git a/libs/control.js b/libs/control.js index c8d4c901..3c6e2084 100644 --- a/libs/control.js +++ b/libs/control.js @@ -831,20 +831,16 @@ control.prototype.drawHero = function (status, offset, frame) { core.status.heroCenter.py = 32 * y + offsetY + 32 - core.material.icons.hero.height / 2; // 重置hero层画布 - var px = parseFloat(core.canvas.hero.canvas.getAttribute('_px')) || 0; - var py = parseFloat(core.canvas.hero.canvas.getAttribute('_py')) || 0; core.setGameCanvasTranslate('hero', 0, 0); - core.canvas.hero.canvas.removeAttribute('_px'); - core.canvas.hero.canvas.removeAttribute('_py'); - offset.px = px; - offset.py = py; + delete core.canvas.hero._px; + delete core.canvas.hero._py; if (!core.hasFlag('__lockViewport__')) { this._drawHero_updateViewport(x, y, offset); } if (!core.hasFlag('hideHero')) { this._drawHero_draw(direction, x, y, status, offset, frame); - } + } } control.prototype._drawHero_updateViewport = function (x, y, offset) { @@ -858,7 +854,7 @@ control.prototype._drawHero_draw = function (direction, x, y, status, offset, fr this._drawHero_getDrawObjs(direction, x, y, status, offset).forEach(function (block) { core.drawImage('hero', block.img, (block.heroIcon[block.status] + (frame || 0))%4*block.width, block.heroIcon.loc * block.height, block.width, block.height, - offset.px+block.posx+(32-block.width)/2, offset.py+block.posy+32-block.height, block.width, block.height); + block.posx+(32-block.width)/2, block.posy+32-block.height, block.width, block.height); }); } @@ -1015,14 +1011,13 @@ control.prototype.setViewport = function (px, py) { core.bigmap.offsetY = core.clamp(py, 0, 32 * core.bigmap.height - core.__PIXELS__); this.updateViewport(); // ------ hero层也需要! - var canvas = core.canvas.hero.canvas; - var px = parseFloat(canvas.getAttribute('_px')) || 0; - var py = parseFloat(canvas.getAttribute('_py')) || 0; + var px = parseFloat(core.canvas.hero._px) || 0; + var py = parseFloat(core.canvas.hero._py) || 0; px += originOffsetX - core.bigmap.offsetX; py += originOffsetY - core.bigmap.offsetY; core.control.setGameCanvasTranslate('hero', px, py); - core.canvas.hero.canvas.setAttribute('_px', px); - core.canvas.hero.canvas.setAttribute('_py', py); + core.canvas.hero._px = px; + core.canvas.hero._py = py; } ////// 移动视野范围 ////// diff --git a/libs/events.js b/libs/events.js index 3585720e..1ac07c1d 100644 --- a/libs/events.js +++ b/libs/events.js @@ -423,7 +423,7 @@ events.prototype._trigger_ignoreChangeFloor = function (block) { events.prototype._sys_battle = function (data, callback) { // 检查是否需要改变朝向 - if (data.x == core.nextX() && data.y == core.nextY()) { + /* if (data.x == core.nextX() && data.y == core.nextY()) { var dir = core.turnDirection(":back"); var id = data.event.id, toId = (data.event.faceIds || {})[dir]; if (toId && id != toId) { @@ -431,7 +431,7 @@ events.prototype._sys_battle = function (data, callback) { if (number > 0) core.setBlock(number, data.x, data.y); } - } + } */ // 检查战前事件 var beforeBattle = []; diff --git a/libs/maps.js b/libs/maps.js index e1d6094b..5663e92e 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -968,10 +968,9 @@ maps.prototype._getBigImageInfo = function (bigImage, face, animate) { } var dx, dy; switch (face) { - case "down": dx = 16 - per_width / 2; dy = 32 - per_height; break; - case "left": dx = 0; dy = 16 - per_height / 2; break; - case "right": dx = 32 - per_width; dy = 16 - per_height / 2; break; - case "up": dx = 16 - per_width / 2; dy = 0; break; + case "down": case "up": dx = 16 - per_width / 2; dy = 32 - per_height; break; + case "left": dx = 0; dy = 32 - per_height; break; + case "right": dx = 32 - per_width; dy = 32 - per_height; break; } return {sx: sx, sy: sy, per_width: per_width, per_height: per_height, face: face, dx: dx, dy: dy}; @@ -1034,41 +1033,34 @@ maps.prototype._drawBlockInfo_bigImage = function (blockInfo, x, y, ctx) { var dx = bigImageInfo.dx, dy = bigImageInfo.dy; switch (bigImageInfo.face) { - case "down": - core.createCanvas(header, px + dx, py + dy, per_width, per_height - 32, 51); + case "down": case "up": + core.createCanvas(header, px + dx, py + dy, per_width, -dy, 51); this._drawBlockInfo_drawWithFilter(blockInfo, header, function () { - core.drawImage(header, bigImage, sx, sy, per_width, per_height - 32, 0, 0, per_width, per_height - 32); + core.drawImage(header, bigImage, sx, sy, per_width, -dy, 0, 0, per_width, -dy); }); core.createCanvas(body, px + dx, py, per_width, 32, 31); this._drawBlockInfo_drawWithFilter(blockInfo, body, function () { - core.drawImage(body, bigImage, sx, sy + per_height - 32, per_width, 32, 0, 0, per_width, 32); + core.drawImage(body, bigImage, sx, sy - dy, per_width, 32, 0, 0, per_width, 32); }) break; case "left": - core.createCanvas(header, px + dx, py + dy, per_width, per_height / 2 - 16, 51); + core.createCanvas(header, px + dx, py + dy, per_width, -dy, 51); this._drawBlockInfo_drawWithFilter(blockInfo, header, function () { - core.drawImage(header, bigImage, sx, sy, per_width, per_height / 2 - 16, 0, 0, per_width, per_height / 2 - 16); + core.drawImage(header, bigImage, sx, sy, per_width, -dy, 0, 0, per_width, -dy); }); - core.createCanvas(body, px + dx, py, per_width, per_height / 2 + 16, 31); + core.createCanvas(body, px + dx, py, per_width, 32, 31); this._drawBlockInfo_drawWithFilter(blockInfo, body, function () { - core.drawImage(body, bigImage, sx, sy + per_height / 2 - 16, per_width, per_height / 2 + 16, 0, 0, per_width, per_height / 2 + 16); + core.drawImage(body, bigImage, sx, sy - dy, per_width, 32, 0, 0, per_width, 32); }); break; case "right": - core.createCanvas(header, px + dx, py + dy, per_width, per_height / 2 - 16, 51); + core.createCanvas(header, px + dx, py + dy, per_width, -dy, 51); this._drawBlockInfo_drawWithFilter(blockInfo, header, function () { - core.drawImage(header, bigImage, sx, sy, per_width, per_height / 2 - 16, 0, 0, per_width, per_height / 2 - 16); + core.drawImage(header, bigImage, sx, sy, per_width, -dy, 0, 0, per_width, -dy); }); core.createCanvas(body, px + dx, py, per_width, per_height / 2 + 16, 31); this._drawBlockInfo_drawWithFilter(blockInfo, body, function () { - core.drawImage(body, bigImage, sx, sy + per_height / 2 - 16, per_width, per_height / 2 + 16, 0, 0, per_width, per_height / 2 + 16); - }); - break; - case "up": - core.deleteCanvas(header); - core.createCanvas(body, px + dx, py, per_width, per_height, 31); - this._drawBlockInfo_drawWithFilter(blockInfo, body, function () { - core.drawImage(body, bigImage, sx, sy, per_width, per_height, 0, 0, per_width, per_height); + core.drawImage(body, bigImage, sx, sy - dy, per_width, 32, 0, 0, per_width, 32); }); break; } @@ -2525,7 +2517,18 @@ maps.prototype._moveDetachedBlock = function (blockInfo, nowX, nowY, opacity, ca } if (bodyCanvas) { if (blockInfo.bigImage) { - var bigImageInfo = this._getBigImageInfo(blockInfo.bigImage, blockInfo.face, blockInfo.posX); + var face = blockInfo.face; + if (!blockInfo.faceIds) face = 'down'; + else if (!blockInfo.faceIds[face]) { + // 维持此时朝向 + face = 'down'; + for (var f in blockInfo.faceIds) { + if (blockInfo.faceIds[f] == blockInfo.id) { + face = f; + } + } + } + var bigImageInfo = this._getBigImageInfo(blockInfo.bigImage, face, blockInfo.posX); var per_width = bigImageInfo.per_width, per_height = bigImageInfo.per_height; core.dymCanvas[bodyCanvas].clearRect(0, 0, bigImageInfo.per_width, bigImageInfo.per_height); core.dymCanvas[bodyCanvas].drawImage(blockInfo.bigImage, bigImageInfo.sx, bigImageInfo.sy, per_width, per_height, 0, 0, per_width, per_height); diff --git a/project/items.js b/project/items.js index 3406d3f4..6c2b4665 100644 --- a/project/items.js +++ b/project/items.js @@ -382,7 +382,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "cls": "tools", "name": "炸弹", "text": "可以炸掉勇士面前的怪物", - "useItemEffect": "(function () {\n\tvar bombList = []; // 炸掉的怪物坐标列表\n\tvar todo = []; // 炸弹后事件\n\tvar money = 0,\n\t\texp = 0; // 炸弹获得的金币和经验\n\n\tvar canBomb = function (x, y) {\n\t\tvar block = core.getBlock(x, y);\n\t\tif (block == null || block.disable || block.event.cls.indexOf('enemy') != 0) return false;\n\t\tvar enemy = core.material.enemys[block.event.id];\n\t\treturn enemy && !enemy.notBomb;\n\t};\n\n\tvar bomb = function (x, y) {\n\t\tif (!canBomb(x, y)) return;\n\t\tbombList.push([x, y]);\n\t\tvar id = core.getBlockId(x, y),\n\t\t\tenemy = core.material.enemys[id];\n\t\tmoney += core.getEnemyValue(enemy, 'money', x, y) || 0;\n\t\texp += core.getEnemyValue(enemy, 'exp', x, y) || 0;\n\t\tcore.push(todo, core.floors[core.status.floorId].afterBattle[x + \",\" + y]);\n\t\tcore.push(todo, enemy.afterBattle);\n\t\tcore.removeBlock(x, y);\n\t}\n\n\t// 如果要多方向可炸,把这里的false改成true\n\tif (false) {\n\t\tvar scan = core.utils.scan; // 多方向炸时默认四方向,如果要改成八方向炸可以改成 core.utils.scan2\n\t\tfor (var direction in scan) {\n\t\t\tvar delta = scan[direction];\n\t\t\tbomb(core.getHeroLoc('x') + delta.x, core.getHeroLoc('y') + delta.y);\n\t\t}\n\t} else {\n\t\t// 仅炸当前\n\t\tbomb(core.nextX(), core.nextY());\n\t}\n\n\tif (bombList.length > 0) {\n\t\tcore.playSound('炸弹');\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功', itemId);\n\t\t// 取消这里的注释可以炸弹后获得金币和经验\n\t\t// core.status.hero.money += money;\n\t\t// core.status.hero.exp += exp;\n\n\t\t// 取消这里的注释可以炸弹引发战后事件\n\t\t// if (todo.length > 0) core.insertAction(todo);\n\t} else {\n\t\tcore.playSound('操作失败');\n\t\tcore.drawTip('当前无法使用' + core.material.items[itemId].name, itemId);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n\n\t// 炸弹后事件\n\t// 这是一个使用炸弹也能开门的例子\n\t/*\n\tif (core.status.floorId=='xxx' && core.terrainExists(x0,y0,'specialDoor') // 某个楼层,该机关门存在\n\t\t&& !core.enemyExists(x1,y1) && !core.enemyExists(x2,y2)) // 且守门的怪物都不存在\n\t{\n\t\tcore.insertAction([ // 插入事件\n\t\t\t{\"type\": \"openDoor\", \"loc\": [x0,y0]} // 开门\n\t\t])\n\t}\n\t*/\n})();", + "useItemEffect": "(function () {\n\tvar bombList = []; // 炸掉的怪物坐标列表\n\tvar todo = []; // 炸弹后事件\n\tvar money = 0,\n\t\texp = 0; // 炸弹获得的金币和经验\n\n\tvar canBomb = function (x, y) {\n\t\tvar block = core.getBlock(x, y);\n\t\tif (block == null || block.disable || block.event.cls.indexOf('enemy') != 0) return false;\n\t\tvar enemy = core.material.enemys[block.event.id];\n\t\treturn enemy && !enemy.notBomb;\n\t};\n\n\tvar bomb = function (x, y) {\n\t\tif (!canBomb(x, y)) return;\n\t\tbombList.push([x, y]);\n\t\tvar id = core.getBlockId(x, y),\n\t\t\tenemy = core.material.enemys[id];\n\t\tmoney += core.getEnemyValue(enemy, 'money', x, y) || 0;\n\t\texp += core.getEnemyValue(enemy, 'exp', x, y) || 0;\n\t\tcore.push(todo, core.floors[core.status.floorId].afterBattle[x + \",\" + y]);\n\t\tcore.push(todo, enemy.afterBattle);\n\t\tcore.removeBlock(x, y);\n\t}\n\n\t// 如果要多方向可炸,把这里的false改成true\n\tif (false) {\n\t\tvar scan = core.utils.scan; // 多方向炸时默认四方向,如果要改成八方向炸可以改成 core.utils.scan2\n\t\tfor (var direction in scan) {\n\t\t\tvar delta = scan[direction];\n\t\t\tbomb(core.getHeroLoc('x') + delta.x, core.getHeroLoc('y') + delta.y);\n\t\t}\n\t} else {\n\t\t// 仅炸当前\n\t\tbomb(core.nextX(), core.nextY());\n\t}\n\n\tif (bomb.length == 0) {\n\t\tcore.playSound('操作失败');\n\t\tcore.drawTip('当前无法使用' + core.material.items[itemId].name, itemId);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n\n\tcore.playSound('炸弹');\n\tcore.drawTip(core.material.items[itemId].name + '使用成功', itemId);\n\n\t// 取消这里的注释可以炸弹后获得金币和经验\n\t// core.status.hero.money += money;\n\t// core.status.hero.exp += exp;\n\n\t// 取消这里的注释可以炸弹引发战后事件\n\t// if (todo.length > 0) core.insertAction(todo);\n\n})();", "canUseItemEffect": "true" }, "centerFly": {