大怪物支持
This commit is contained in:
parent
d1dc12208f
commit
4f2dd58387
@ -1846,8 +1846,9 @@ zIndex: 创建的纵向高度(关系到画布之间的覆盖),z值高的
|
||||
deleteAllCanvas: fn()
|
||||
清空所有的自定义画布
|
||||
|
||||
deleteCanvas: fn(name: string)
|
||||
deleteCanvas: fn(name: string|fn(name: string) -> bool)
|
||||
删除一个自定义画布
|
||||
name: 画布名;也可以传入一个filter对画布名进行筛选。
|
||||
|
||||
drawArrow: fn(name: string|CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number, style?: string, lineWidth?: number)
|
||||
在某个canvas上绘制一个箭头
|
||||
|
||||
@ -3393,8 +3393,8 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [
|
||||
"!type": "fn(name: string, x: number, y: number)"
|
||||
},
|
||||
"deleteCanvas": {
|
||||
"!doc": "删除一个自定义画布",
|
||||
"!type": "fn(name: string)"
|
||||
"!doc": "删除一个自定义画布<br/>name: 画布名,也可以传入一个函数对所有画布进行筛选",
|
||||
"!type": "fn(name: string|fn(name: string) -> bool)"
|
||||
},
|
||||
"deleteAllCanvas": {
|
||||
"!doc": "清空所有的自定义画布",
|
||||
|
||||
@ -696,7 +696,7 @@ editor_ui_wrapper = function (editor) {
|
||||
|
||||
var html = "<p style='margin-left: 10px'>该变量出现的所有位置如下:</p><ul>";
|
||||
var list = uievent._searchUsedFlags(flag);
|
||||
list.forEach(function (v) {
|
||||
list.forEach(function (x) {
|
||||
html += "<li>" + x + "</li>";
|
||||
});
|
||||
html += "</ul>";
|
||||
|
||||
@ -946,7 +946,7 @@ actions.prototype._clickCenterFly = function (x, y) {
|
||||
|
||||
actions.prototype._keyUpCenterFly = function (keycode) {
|
||||
core.ui.closePanel();
|
||||
if (keycode == 13 || keycode == 32 || keycode == 67) {
|
||||
if (keycode == 51 || keycode == 13 || keycode == 32 || keycode == 67) {
|
||||
if (core.canUseItem('centerFly')) {
|
||||
core.useItem('centerFly');
|
||||
}
|
||||
|
||||
@ -977,6 +977,17 @@ control.prototype.updateViewport = function() {
|
||||
});
|
||||
// ------ 路线
|
||||
core.relocateCanvas('route', core.status.automaticRoute.offsetX - core.bigmap.offsetX, core.status.automaticRoute.offsetY - core.bigmap.offsetY);
|
||||
// ------ 所有的大怪物也都需要重定位
|
||||
for (var one in core.dymCanvas) {
|
||||
if (one.startsWith('_bigImage_')) {
|
||||
var ox = core.dymCanvas[one].canvas.getAttribute('_ox');
|
||||
var oy = core.dymCanvas[one].canvas.getAttribute('_oy');
|
||||
if (ox != null && oy != null) {
|
||||
core.relocateCanvas(one, parseInt(ox) - core.bigmap.offsetX, parseInt(oy) - core.bigmap.offsetY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
////// 设置视野范围 //////
|
||||
@ -988,6 +999,7 @@ control.prototype.setViewport = function (px, py) {
|
||||
var hero_x = core.clamp((core.getHeroLoc('x') - core.__HALF_SIZE__) * 32, 0, 32*core.bigmap.width-core.__PIXELS__);
|
||||
var hero_y = core.clamp((core.getHeroLoc('y') - core.__HALF_SIZE__) * 32, 0, 32*core.bigmap.height-core.__PIXELS__);
|
||||
core.control.setGameCanvasTranslate('hero', hero_x - core.bigmap.offsetX, hero_y - core.bigmap.offsetY);
|
||||
|
||||
}
|
||||
|
||||
////// 移动视野范围 //////
|
||||
|
||||
193
libs/maps.js
193
libs/maps.js
@ -954,6 +954,29 @@ maps.prototype._automaticRoute_deepAdd = function (x, y, blocks) {
|
||||
|
||||
// -------- 绘制地图,各层图块,楼层贴图,Autotile -------- //
|
||||
|
||||
maps.prototype._getBigImageInfo = function (bigImage, face, animate) {
|
||||
face = face || "down";
|
||||
if (["up", "down", "left", "right"].indexOf(face) < 0) face = "down";
|
||||
var per_width = bigImage.width / 4;
|
||||
var per_height = bigImage.height / 4;
|
||||
var sx = animate * per_width, sy;
|
||||
if (per_height < per_width / 2) { // 强制视为 1*4 的怪物
|
||||
per_height = bigImage.height;
|
||||
sy = 0;
|
||||
} else {
|
||||
sy = core.material.icons.hero[face].loc * per_height;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
return {sx: sx, sy: sy, per_width: per_width, per_height: per_height, face: face, dx: dx, dy: dy};
|
||||
}
|
||||
|
||||
////// 绘制一个图块 //////
|
||||
maps.prototype.drawBlock = function (block, animate, ctx) {
|
||||
if (block.event.id == 'none') return;
|
||||
@ -987,66 +1010,104 @@ maps.prototype.drawBlock = function (block, animate, ctx) {
|
||||
this._drawBlockInfo_bgfg(blockInfo, block.name, block.x, block.y, ctx);
|
||||
}
|
||||
|
||||
maps.prototype._drawBlockInfo_bigImage = function (blockInfo, x, y) {
|
||||
var face = blockInfo.face || "down";
|
||||
if (["up", "down", "left", "right"].indexOf(face) < 0) face = "down";
|
||||
maps.prototype._drawBlockInfo_bigImage = function (blockInfo, x, y, ctx) {
|
||||
var bigImageInfo = this._getBigImageInfo(blockInfo.bigImage, blockInfo.face, blockInfo.posX);
|
||||
var per_width = bigImageInfo.per_width, per_height = bigImageInfo.per_height, sx = bigImageInfo.sx, sy = bigImageInfo.sy;
|
||||
var bigImage = blockInfo.bigImage;
|
||||
var per_width = bigImage.width / 4;
|
||||
var per_height = bigImage.height / 4;
|
||||
if (face == 'down' && per_height < per_width / 2) { // 强制视为 1*4 的怪物
|
||||
per_height = bigImage.height;
|
||||
|
||||
if (main.mode == 'editor') {
|
||||
var px = 32 * x - 32 * core.bigmap.posX;
|
||||
var py = 32 * y - 32 * core.bigmap.posY;
|
||||
if (ctx == null) ctx = 'event';
|
||||
core.clearMap(ctx, px, py, 32, 32);
|
||||
core.drawImage(ctx, bigImage, sx, sy, per_width, per_height, px, py, 32, 32);
|
||||
return;
|
||||
}
|
||||
var sx = blockInfo.posX * per_width;
|
||||
var sy = core.material.icons.hero[face].loc * per_height;
|
||||
|
||||
var px = 32 * x - core.bigmap.offsetX;
|
||||
var py = 32 * y - core.bigmap.offsetY;
|
||||
|
||||
// 上半部分 - 会遮挡勇士;z值高于event2,为51
|
||||
var header = "_bigImage_header_" + x + "_" + y;
|
||||
// 下半部分 - 会被勇士遮挡;z值高于event,为31
|
||||
var body = "_bigImage_body_" + x + "_" + y;
|
||||
var px = 32 * x - core.bigmap.offsetX;
|
||||
var py = 32 * y - core.bigmap.offsetY;
|
||||
var dx = bigImageInfo.dx, dy = bigImageInfo.dy;
|
||||
|
||||
switch (face) {
|
||||
switch (bigImageInfo.face) {
|
||||
case "down":
|
||||
var dx = px + 16 - per_width / 2;
|
||||
var dy = py + 32 - per_height;
|
||||
core.createCanvas(header, dx, dy, per_width, per_height - 32, 51);
|
||||
core.createCanvas(header, px + dx, py + dy, per_width, per_height - 32, 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.createCanvas(body, dx, dy + per_height - 32, per_width, 32, 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 - 32, per_width, 32, 0, 0, per_width, 32);
|
||||
})
|
||||
break;
|
||||
case "left":
|
||||
core.createCanvas(header, px, py + 16 - per_height / 2, per_width, per_height / 2 - 16, 51);
|
||||
core.createCanvas(header, px + dx, py + dy, per_width, per_height / 2 - 16, 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.createCanvas(body, px, py, per_width, per_height / 2 + 16, 31);
|
||||
});
|
||||
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 "right":
|
||||
core.createCanvas(header, px + dx, py + dy, per_width, per_height / 2 - 16, 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.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);
|
||||
});
|
||||
break;
|
||||
}
|
||||
if (core.dymCanvas[header]) {
|
||||
core.dymCanvas[header].canvas.setAttribute('_ox', 32 * x + dx);
|
||||
core.dymCanvas[header].canvas.setAttribute('_oy', 32 * y + dy);
|
||||
}
|
||||
if (core.dymCanvas[body]) {
|
||||
core.dymCanvas[body].canvas.setAttribute('_ox', 32 * x + dx);
|
||||
core.dymCanvas[body].canvas.setAttribute('_oy', 32 * y);
|
||||
}
|
||||
}
|
||||
|
||||
maps.prototype._drawBlockInfo_drawWithFilter = function (blockInfo, ctx, func) {
|
||||
var alpha = null;
|
||||
if (blockInfo.opacity != null) alpha = core.setAlpha(ctx, blockInfo.opacity);
|
||||
core.setFilter(ctx, blockInfo.filter);
|
||||
func();
|
||||
core.setFilter(ctx, null);
|
||||
if (alpha != null) core.setAlpha(ctx, alpha);
|
||||
}
|
||||
|
||||
maps.prototype._drawBlockInfo = function (blockInfo, x, y, ctx) {
|
||||
if (blockInfo.bigImage) return this._drawBlockInfo_bigImage(blockInfo, x, y);
|
||||
if (blockInfo.bigImage) return this._drawBlockInfo_bigImage(blockInfo, x, y, ctx);
|
||||
|
||||
var image = blockInfo.image, posX = blockInfo.posX, posY = blockInfo.posY, height = blockInfo.height;
|
||||
var px = 32 * x - 32 * core.bigmap.posX;
|
||||
var py = 32 * y - 32 * core.bigmap.posY;
|
||||
if (ctx == null) ctx = 'event';
|
||||
|
||||
var alpha = null;
|
||||
if (blockInfo.opacity != null) alpha = core.setAlpha(ctx, blockInfo.opacity);
|
||||
core.setFilter(ctx, blockInfo.filter);
|
||||
this._drawBlockInfo_drawWithFilter(blockInfo, ctx, function () {
|
||||
core.clearMap(ctx, px, py, 32, 32);
|
||||
core.drawImage(ctx, image, posX * 32, posY * height + height - 32, 32, 32, px, py, 32, 32);
|
||||
core.setFilter(ctx, null);
|
||||
if (alpha != null) core.setAlpha(ctx, alpha);
|
||||
});
|
||||
if (height > 32) {
|
||||
alpha = null;
|
||||
if (blockInfo.opacity != null) alpha = core.setAlpha('event2', blockInfo.opacity);
|
||||
core.setFilter('event2', blockInfo.filter);
|
||||
core.clearMap('event2', px, py + 32 - height, 32, height - 32)
|
||||
this._drawBlockInfo_drawWithFilter(blockInfo, 'event2', function () {
|
||||
core.clearMap('event2', px, py + 32 - height, 32, height - 32);
|
||||
core.drawImage('event2', image, posX * 32, posY * height, 32, height - 32, px, py + 32 - height, 32, height - 32);
|
||||
core.setFilter('event2', null);
|
||||
if (alpha != null) core.setAlpha('event2', alpha);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -1130,8 +1191,9 @@ maps.prototype._drawMap_drawAll = function (floorId, config) {
|
||||
this.drawFg(floorId, config);
|
||||
}
|
||||
|
||||
maps.prototype._drawMap_drawBlockInfo = function (ctx, block, blockInfo, arr, onMap) {
|
||||
maps.prototype._drawMap_drawBlockInfo = function (ctx, block, blockInfo, arr, config) {
|
||||
if (blockInfo == null) return;
|
||||
var onMap = config.onMap;
|
||||
if (onMap && core.bigmap.v2) {
|
||||
// 判定是否绘制
|
||||
var posX = core.bigmap.posX, posY = core.bigmap.posY;
|
||||
@ -1152,12 +1214,20 @@ maps.prototype._drawMap_drawBlockInfo = function (ctx, block, blockInfo, arr, on
|
||||
}
|
||||
if (!onMap) {
|
||||
var height = blockInfo.height;
|
||||
var alpha = null;
|
||||
if (block.opacity != null) alpha = core.setAlpha(ctx, block.opacity);
|
||||
core.setFilter(ctx, block.filter);
|
||||
if (blockInfo.bigImage) {
|
||||
config.postDraw.push(function () {
|
||||
var bigImageInfo = core.maps._getBigImageInfo(blockInfo.bigImage, blockInfo.face, 0);
|
||||
var per_width = bigImageInfo.per_width, per_height = bigImageInfo.per_height;
|
||||
core.maps._drawBlockInfo_drawWithFilter(block, ctx, function () {
|
||||
core.drawImage(ctx, blockInfo.bigImage, bigImageInfo.sx, bigImageInfo.sy, per_width, per_height,
|
||||
32 * block.x + bigImageInfo.dx, 32 * block.y + bigImageInfo.dy, per_width, per_height);
|
||||
});
|
||||
});
|
||||
return;
|
||||
}
|
||||
this._drawBlockInfo_drawWithFilter(block, ctx, function () {
|
||||
core.drawImage(ctx, blockInfo.image, 32 * blockInfo.posX, height * blockInfo.posY, 32, height, 32 * block.x, 32 * block.y + 32 - height, 32, height);
|
||||
core.setFilter(ctx, null);
|
||||
if (alpha != null) core.setAlpha(ctx, alpha);
|
||||
});
|
||||
return;
|
||||
}
|
||||
this.drawBlock(block, null, ctx);
|
||||
@ -1251,6 +1321,7 @@ maps.prototype.drawEvents = function (floorId, blocks, config) {
|
||||
} else {
|
||||
arr = this._getMapArrayFromBlocks(blocks, core.floors[floorId].width, core.floors[floorId].height);
|
||||
}
|
||||
config.postDraw = [];
|
||||
|
||||
blocks.filter(function (block) {
|
||||
if (config.onMap && core.bigmap.v2) {
|
||||
@ -1262,8 +1333,10 @@ maps.prototype.drawEvents = function (floorId, blocks, config) {
|
||||
}
|
||||
return block.event && !block.disable;
|
||||
}).forEach(function (block) {
|
||||
core.maps._drawMap_drawBlockInfo(cacheCtx, block, core.maps.getBlockInfo(block), arr, config.onMap);
|
||||
core.maps._drawMap_drawBlockInfo(cacheCtx, block, core.maps.getBlockInfo(block), arr, config);
|
||||
});
|
||||
config.postDraw.forEach(function (v) { v(); });
|
||||
delete config.postDraw;
|
||||
|
||||
if (config.onMap) {
|
||||
core.drawImage(toDrawCtx, cacheCtx.canvas, core.bigmap.v2 ? -32 : 0, core.bigmap.v2 ? -32 : 0);
|
||||
@ -1323,6 +1396,7 @@ maps.prototype._drawBgFgMap = function (floorId, name, config) {
|
||||
var endY = config.onMap && core.bigmap.v2 ? Math.min(height, core.bigmap.posY + core.__SIZE__ + 2) : height; // +1 for 48 px
|
||||
|
||||
var arr = this._getBgFgMapArray(name, floorId, !config.redraw);
|
||||
config.postDraw = [];
|
||||
for (var x = startX; x < endX; x++) {
|
||||
for (var y = startY; y < endY; y++) {
|
||||
if (arr[y][x] == 0) continue;
|
||||
@ -1330,9 +1404,11 @@ maps.prototype._drawBgFgMap = function (floorId, name, config) {
|
||||
block.name = name;
|
||||
var blockInfo = this.getBlockInfo(block);
|
||||
if (!blockInfo) continue;
|
||||
this._drawMap_drawBlockInfo(config.ctx, block, blockInfo, arr, config.onMap);
|
||||
this._drawMap_drawBlockInfo(config.ctx, block, blockInfo, arr, config);
|
||||
}
|
||||
}
|
||||
config.postDraw.forEach(function (v) { v(); });
|
||||
delete config.postDraw;
|
||||
}
|
||||
|
||||
////// 绘制楼层贴图 //////
|
||||
@ -2034,8 +2110,10 @@ maps.prototype._removeBlockFromMap = function (floorId, block) {
|
||||
core.removeGlobalAnimate(x, y);
|
||||
core.clearMap('event', px, py, 32, 32);
|
||||
var height = block.event.height || 32;
|
||||
if (height > 32)
|
||||
core.clearMap('event2', px, py + 32 - height, 32, height - 32);
|
||||
if (height > 32) core.clearMap('event2', px, py + 32 - height, 32, height - 32);
|
||||
// 删除大怪物
|
||||
core.deleteCanvas("_bigImage_header_" + x + "_" + y);
|
||||
core.deleteCanvas("_bigImage_body_" + x + "_" + y);
|
||||
core.updateStatusBar();
|
||||
}
|
||||
}
|
||||
@ -2391,12 +2469,17 @@ maps.prototype.resetMap = function (floorId) {
|
||||
maps.prototype._initDetachedBlock = function (blockInfo, x, y, displayDamage) {
|
||||
var headCanvas = null, bodyCanvas = '__body_' + x + "_" + y, damageCanvas = null;
|
||||
// head
|
||||
if (blockInfo.height > 32) {
|
||||
if (!blockInfo.bigImage && blockInfo.height > 32) {
|
||||
headCanvas = "__head_" + x + "_" + y;
|
||||
core.createCanvas(headCanvas, 0, 0, 32, blockInfo.height - 32, 55);
|
||||
}
|
||||
// body
|
||||
if (blockInfo.bigImage) {
|
||||
var bigImageInfo = this._getBigImageInfo(blockInfo.bigImage, blockInfo.face, blockInfo.posX);
|
||||
core.createCanvas(bodyCanvas, 0, 0, bigImageInfo.per_width, bigImageInfo.per_height, 35);
|
||||
} else {
|
||||
core.createCanvas(bodyCanvas, 0, 0, 32, 32, 35);
|
||||
}
|
||||
// damage
|
||||
var damage = null, damageColor = null;
|
||||
if (blockInfo.cls.indexOf('enemy') == 0 && core.hasItem('book') && displayDamage) {
|
||||
@ -2436,11 +2519,20 @@ maps.prototype._moveDetachedBlock = function (blockInfo, nowX, nowY, opacity, ca
|
||||
core.setOpacity(headCanvas, opacity);
|
||||
}
|
||||
if (bodyCanvas) {
|
||||
if (blockInfo.bigImage) {
|
||||
var bigImageInfo = this._getBigImageInfo(blockInfo.bigImage, blockInfo.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);
|
||||
core.relocateCanvas(bodyCanvas, nowX - core.bigmap.offsetX + bigImageInfo.dx, nowY - core.bigmap.offsetY + bigImageInfo.dy);
|
||||
core.setOpacity(bodyCanvas, opacity);
|
||||
} else {
|
||||
core.dymCanvas[bodyCanvas].clearRect(0, 0, 32, 32);
|
||||
core.dymCanvas[bodyCanvas].drawImage(image, posX * 32, posY * height + height - 32, 32, 32, 0, 0, 32, 32);
|
||||
core.relocateCanvas(bodyCanvas, nowX - core.bigmap.offsetX, nowY - core.bigmap.offsetY);
|
||||
core.setOpacity(bodyCanvas, opacity);
|
||||
}
|
||||
}
|
||||
if (damageCanvas) {
|
||||
core.relocateCanvas(damageCanvas, nowX - core.bigmap.offsetX, nowY - core.bigmap.offsetY);
|
||||
core.setOpacity(damageCanvas, opacity);
|
||||
@ -2560,6 +2652,7 @@ maps.prototype._moveBlock_updateDirection = function (blockInfo, moveInfo) {
|
||||
if (faceDirection == 'leftup' || faceDirection == 'leftdown') faceDirection = 'left';
|
||||
if (faceDirection == 'rightup' || faceDirection == 'rightdown') faceDirection = 'right';
|
||||
var currid = blockInfo.faceIds[faceDirection];
|
||||
blockInfo.face = faceDirection;
|
||||
if (currid) {
|
||||
var posY = core.material.icons[blockInfo.cls][currid];
|
||||
if (posY != null) {
|
||||
@ -2719,9 +2812,10 @@ maps.prototype._animateBlock_getList = function (loc, type) {
|
||||
var list = [];
|
||||
loc.forEach(function (t) {
|
||||
var block = core.getBlock(t[0], t[1], null, true);
|
||||
if (block == null) return;
|
||||
|
||||
var fromOpacity = block.opacity;
|
||||
if (fromOpacity == null) fromOpacity = 1.0;
|
||||
if (block == null) return;
|
||||
|
||||
var blockInfo = core.maps.getBlockInfo(block);
|
||||
if (blockInfo == null) {
|
||||
@ -2807,12 +2901,27 @@ maps.prototype.removeGlobalAnimate = function (x, y, name) {
|
||||
////// 绘制UI层的box动画 //////
|
||||
maps.prototype.drawBoxAnimate = function () {
|
||||
if (core.status.boxAnimateObjs.length == 0) return;
|
||||
// check ui2
|
||||
if (main.mode == 'play' && core.status.boxAnimateObjs.filter(function (one) { return one.bigImage }).length > 0 && !core.dymCanvas.ui2) {
|
||||
core.createCanvas('ui2', 0, 0, core.__PIXELS__, core.__PIXELS__, 142);
|
||||
}
|
||||
core.clearMap('ui2');
|
||||
|
||||
core.status.boxAnimateObjs.forEach(function (obj) {
|
||||
if (obj.bigImage) {
|
||||
var ctx = obj.ctx || 'ui2';
|
||||
var bigImageInfo = core.maps._getBigImageInfo(obj.bigImage, obj.face, core.status.globalAnimateStatus % 4);
|
||||
var sx = bigImageInfo.sx, sy = bigImageInfo.sy, per_width = bigImageInfo.per_width, per_height = bigImageInfo.per_height;
|
||||
var actual_width = Math.min(per_width, obj.max_width || per_width), actual_height = per_height * actual_width / per_width;
|
||||
core.drawImage(ctx, obj.bigImage, sx, sy, per_width, per_height,
|
||||
obj.centerX - actual_width / 2, obj.centerY - actual_height / 2, actual_width, actual_height);
|
||||
} else {
|
||||
var ctx = obj.ctx || 'ui';
|
||||
core.clearMap(ctx, obj.bgx, obj.bgy, obj.bgWidth, obj.bgHeight);
|
||||
core.fillRect(ctx, obj.bgx, obj.bgy, obj.bgWidth, obj.bgHeight, core.material.groundPattern);
|
||||
core.drawImage(ctx, obj.image, core.status.globalAnimateStatus % obj.animate * 32, obj.pos,
|
||||
32, obj.height, obj.x, obj.y, obj.dw || 32, obj.dh || obj.height);
|
||||
}
|
||||
});
|
||||
if (main.mode != 'play') core.status.boxAnimateObjs = [];
|
||||
}
|
||||
|
||||
57
libs/ui.js
57
libs/ui.js
@ -54,6 +54,7 @@ ui.prototype.clearMap = function (name, x, y, width, height) {
|
||||
}
|
||||
core.dom.gif.innerHTML = "";
|
||||
core.removeGlobalAnimate();
|
||||
core.deleteCanvas(function (one) { return one.startsWith('_bigImage_'); });
|
||||
core.setWeather(null);
|
||||
}
|
||||
else {
|
||||
@ -681,12 +682,13 @@ ui.prototype.closePanel = function () {
|
||||
|
||||
ui.prototype.clearUI = function () {
|
||||
core.status.boxAnimateObjs = [];
|
||||
if (core.dymCanvas._selector) core.deleteCanvas("_selector");
|
||||
core.deleteCanvas("_selector");
|
||||
main.dom.next.style.display = 'none';
|
||||
main.dom.next.style.opacity = 1;
|
||||
core.clearMap('ui');
|
||||
core.setAlpha('ui', 1);
|
||||
core.setOpacity('ui', 1);
|
||||
core.deleteCanvas('ui2');
|
||||
}
|
||||
|
||||
////// 左上角绘制一段提示 //////
|
||||
@ -704,7 +706,7 @@ ui.prototype.drawTip = function (text, id, frame) {
|
||||
};
|
||||
if (id != null) {
|
||||
var info = core.getBlockInfo(id);
|
||||
if (info == null || !info.image) {
|
||||
if (info == null || !info.image || info.bigImage) {
|
||||
// 检查状态栏图标
|
||||
if (core.statusBar.icons[id] instanceof Image) {
|
||||
info = {image: core.statusBar.icons[id], posX: 0, posY: 0, height: 32};
|
||||
@ -767,6 +769,7 @@ ui.prototype._drawText_setContent = function (contents, callback) {
|
||||
////// 正则处理 \t[xx,yy] 问题
|
||||
ui.prototype._getTitleAndIcon = function (content) {
|
||||
var title = null, image = null, icon = null, height = 32, animate = 1;
|
||||
var bigImage = null, face = null;
|
||||
content = content.replace(/(\t|\\t)\[(([^\],]+),)?([^\],]+)\]/g, function (s0, s1, s2, s3, s4) {
|
||||
if (s4) {
|
||||
if (s4 == 'hero') {
|
||||
@ -784,9 +787,11 @@ ui.prototype._getTitleAndIcon = function (content) {
|
||||
var blockInfo = core.getBlockInfo(s4);
|
||||
if (blockInfo != null) {
|
||||
if (blockInfo.name) title = blockInfo.name;
|
||||
bigImage = blockInfo.bigImage;
|
||||
face = blockInfo.face;
|
||||
image = blockInfo.image;
|
||||
icon = blockInfo.posY;
|
||||
height = blockInfo.height;
|
||||
height = bigImage == null ? blockInfo.height : 32;
|
||||
animate = blockInfo.animate;
|
||||
}
|
||||
else title = s4;
|
||||
@ -804,7 +809,9 @@ ui.prototype._getTitleAndIcon = function (content) {
|
||||
image: image,
|
||||
icon: icon,
|
||||
height: height,
|
||||
animate: animate
|
||||
animate: animate,
|
||||
bigImage: bigImage,
|
||||
face: face,
|
||||
};
|
||||
}
|
||||
|
||||
@ -882,11 +889,7 @@ ui.prototype._uievent_drawSelector = function (data) {
|
||||
////// 清除自绘的选择光标
|
||||
ui.prototype.clearUIEventSelector = function (codes) {
|
||||
if (codes == null) {
|
||||
Object.keys(core.dymCanvas).forEach(function (name) {
|
||||
if (name.startsWith('_uievent_selector_')) {
|
||||
core.deleteCanvas(name);
|
||||
}
|
||||
});
|
||||
core.deleteCanvas(function (one) { return one.startsWith('_uievent_selector_'); })
|
||||
return;
|
||||
}
|
||||
if (codes instanceof Array) {
|
||||
@ -1615,12 +1618,19 @@ ui.prototype._drawTextBox_drawTitleAndIcon = function (titleInfo, hPos, vPos, al
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (titleInfo.bigImage) {
|
||||
core.status.boxAnimateObjs.push({
|
||||
bigImage: titleInfo.bigImage, face: titleInfo.face, centerX: hPos.left + 15 + 16,
|
||||
centerY: image_top + titleInfo.height / 2, max_width: 50, ctx: ctx
|
||||
});
|
||||
} else {
|
||||
core.status.boxAnimateObjs.push({
|
||||
'bgx': hPos.left + 15, 'bgy': image_top, 'bgWidth': 32, 'bgHeight': titleInfo.height,
|
||||
'x': hPos.left + 15, 'y': image_top, 'height': titleInfo.height, 'animate': titleInfo.animate,
|
||||
'image': titleInfo.image, 'pos': titleInfo.icon * titleInfo.height, ctx: ctx,
|
||||
});
|
||||
}
|
||||
}
|
||||
core.drawBoxAnimate();
|
||||
}
|
||||
if (titleInfo.image != null && titleInfo.icon == null) { // 头像图
|
||||
@ -1761,11 +1771,18 @@ ui.prototype._drawChoices_drawTitle = function (titleInfo, hPos, vPos, ctx) {
|
||||
title_offset += 12;
|
||||
core.strokeRect(ctx, hPos.left + 15 - 1, vPos.top + 30 - 1, 34, titleInfo.height + 2, '#DDDDDD', 2);
|
||||
core.status.boxAnimateObjs = [];
|
||||
if (titleInfo.bigImage) {
|
||||
core.status.boxAnimateObjs.push({
|
||||
bigImage: titleInfo.bigImage, face: titleInfo.face, centerX: hPos.left + 15 + 16,
|
||||
centerY: vPos.top + 30 + titleInfo.height / 2, max_width: 50, ctx: ctx
|
||||
});
|
||||
} else {
|
||||
core.status.boxAnimateObjs.push({
|
||||
'bgx': hPos.left + 15, 'bgy': vPos.top + 30, 'bgWidth': 32, 'bgHeight': titleInfo.height,
|
||||
'x': hPos.left + 15, 'y': vPos.top + 30, 'height': titleInfo.height, 'animate': titleInfo.animate,
|
||||
'image': titleInfo.image, 'pos': titleInfo.icon * titleInfo.height, ctx: ctx
|
||||
});
|
||||
}
|
||||
core.drawBoxAnimate();
|
||||
};
|
||||
|
||||
@ -2154,7 +2171,15 @@ ui.prototype._drawBook_drawBox = function (index, enemy, top, pageinfo) {
|
||||
var img_top = border_top + 5, img_left = border_left + 5;
|
||||
core.strokeRect('ui', 22, border_top, 42, 42, '#DDDDDD', 2);
|
||||
var blockInfo = core.getBlockInfo(enemy.id);
|
||||
if (blockInfo.height >= 42) {
|
||||
|
||||
// 检查大怪物
|
||||
if (blockInfo.bigImage) {
|
||||
core.status.boxAnimateObjs.push({
|
||||
bigImage: blockInfo.bigImage, face: blockInfo.face, centerX: border_left + 21, centerY: border_top + 21,
|
||||
max_width: 60
|
||||
});
|
||||
}
|
||||
else if (blockInfo.height >= 42) {
|
||||
var originEnemy = core.material.enemys[enemy.id] || {};
|
||||
// 检查上半部分是不是纯透明的;取用原始值避免重复计算
|
||||
if (originEnemy.is32x32 == null) {
|
||||
@ -3415,6 +3440,13 @@ ui.prototype.resizeCanvas = function (name, width, height, styleOnly) {
|
||||
}
|
||||
////// canvas删除 //////
|
||||
ui.prototype.deleteCanvas = function (name) {
|
||||
if (name instanceof Function) {
|
||||
Object.keys(core.dymCanvas).forEach(function (one) {
|
||||
if (name(one)) core.deleteCanvas(one);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (!core.dymCanvas[name]) return null;
|
||||
core.dom.gameDraw.removeChild(core.dymCanvas[name].canvas);
|
||||
delete core.dymCanvas[name];
|
||||
@ -3422,8 +3454,5 @@ ui.prototype.deleteCanvas = function (name) {
|
||||
|
||||
////// 删除所有动态canvas //////
|
||||
ui.prototype.deleteAllCanvas = function () {
|
||||
Object.keys(core.dymCanvas).forEach(function (name) {
|
||||
core.dom.gameDraw.removeChild(core.dymCanvas[name].canvas);
|
||||
delete core.dymCanvas[name];
|
||||
});
|
||||
return this.deleteCanvas(function () { return true; })
|
||||
}
|
||||
|
||||
3
runtime.d.ts
vendored
3
runtime.d.ts
vendored
@ -2149,8 +2149,7 @@ declare class ui {
|
||||
rotateCanvas(name: string, angle: number, centerX?: number, centerY?: number): void
|
||||
|
||||
/** 删除一个自定义画布 */
|
||||
deleteCanvas(name: string): void
|
||||
|
||||
deleteCanvas(name: string | ((name: string) => bool)): void
|
||||
|
||||
/** 清空所有的自定义画布 */
|
||||
deleteAllCanvas(): void
|
||||
|
||||
Loading…
Reference in New Issue
Block a user