修复锁定视角闪烁 & 大怪物

This commit is contained in:
ckcz123 2021-08-31 16:52:09 +08:00
parent 3bac35cc36
commit 96477f77d0
4 changed files with 37 additions and 39 deletions

View File

@ -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;
}
////// 移动视野范围 //////

View File

@ -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 = [];

View File

@ -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);

View File

@ -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": {