events.js V2.6
This commit is contained in:
parent
b3b395c9aa
commit
8144ca8d17
@ -1080,6 +1080,20 @@ control.prototype.setGameCanvasTranslate = function(canvas,x,y){
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
////// 加减画布偏移
|
||||||
|
control.prototype.addGameCanvasTranslate = function (x, y) {
|
||||||
|
for(var ii=0,canvas;canvas=core.dom.gameCanvas[ii];ii++){
|
||||||
|
var id = canvas.getAttribute('id');
|
||||||
|
if (id=='ui' || id=='data') continue; // UI层和data层不移动
|
||||||
|
var offsetX = x, offsetY = y;
|
||||||
|
if (core.bigmap.canvas.indexOf(id)>=0) {
|
||||||
|
offsetX -= core.bigmap.offsetX;
|
||||||
|
offsetY -= core.bigmap.offsetY;
|
||||||
|
}
|
||||||
|
core.control.setGameCanvasTranslate(id, offsetX, offsetY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////// 更新视野范围 //////
|
////// 更新视野范围 //////
|
||||||
control.prototype.updateViewport = function() {
|
control.prototype.updateViewport = function() {
|
||||||
core.bigmap.canvas.forEach(function(cn){
|
core.bigmap.canvas.forEach(function(cn){
|
||||||
|
|||||||
406
libs/events.js
406
libs/events.js
@ -1045,7 +1045,7 @@ events.prototype._action_showTextImage = function (data, x, y, prefix) {
|
|||||||
var loc = this.__action_getLoc(data.loc, 0, 0, prefix);
|
var loc = this.__action_getLoc(data.loc, 0, 0, prefix);
|
||||||
if (core.isReplaying()) data.time = 0;
|
if (core.isReplaying()) data.time = 0;
|
||||||
this.__action_doAsyncFunc(data.async || data.time == 0, this.showImage,
|
this.__action_doAsyncFunc(data.async || data.time == 0, this.showImage,
|
||||||
data.code, this.textImage(data.text), loc[0], loc[1], 100, 100, data.opacity, data.time);
|
data.code, core.ui.textImage(data.text), loc[0], loc[1], 100, 100, data.opacity, data.time);
|
||||||
}
|
}
|
||||||
|
|
||||||
events.prototype._action_hideImage = function (data, x, y, prefix) {
|
events.prototype._action_hideImage = function (data, x, y, prefix) {
|
||||||
@ -1640,252 +1640,161 @@ events.prototype.showImage = function (code, image, x, y, dw, dh, opacityVal, ti
|
|||||||
dh /= 100;
|
dh /= 100;
|
||||||
x = core.calValue(x) || 0;
|
x = core.calValue(x) || 0;
|
||||||
y = core.calValue(y) || 0;
|
y = core.calValue(y) || 0;
|
||||||
|
if (typeof image == 'string') image = core.material.images.images[image];
|
||||||
|
if (!image) {
|
||||||
|
if (callback) callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
var zIndex = code + 100;
|
var zIndex = code + 100;
|
||||||
time = time || 0;
|
time = time || 0;
|
||||||
var name = "image"+ zIndex;
|
var name = "image"+ zIndex;
|
||||||
var ctx = core.createCanvas(name, x, y, image.width * dw, image.height * dh, zIndex);
|
var ctx = core.createCanvas(name, x, y, image.width * dw, image.height * dh, zIndex);
|
||||||
|
|
||||||
ctx.drawImage(image, 0, 0, image.width * dw, image.height * dh);
|
ctx.drawImage(image, 0, 0, image.width * dw, image.height * dh);
|
||||||
if (time == 0)
|
if (time == 0) {
|
||||||
core.setOpacity(name, opacityVal);
|
core.setOpacity(name, opacityVal);
|
||||||
else {
|
if (callback) callback();
|
||||||
var per_time = 10, steps = parseInt(time / per_time), per_add = opacityVal / steps;
|
return;
|
||||||
var opacity = 0;
|
|
||||||
core.setOpacity(name, 0);
|
|
||||||
var animate = setInterval(function () {
|
|
||||||
opacity += per_add;
|
|
||||||
core.setOpacity(name, opacity);
|
|
||||||
if (opacity >= opacityVal) {
|
|
||||||
delete core.animateFrame.asyncId[animate];
|
|
||||||
clearInterval(animate);
|
|
||||||
core.setOpacity(name, opacityVal);
|
|
||||||
if (core.isset(callback)) callback();
|
|
||||||
}
|
|
||||||
}, per_time);
|
|
||||||
|
|
||||||
core.animateFrame.asyncId[animate] = true;
|
|
||||||
}
|
}
|
||||||
|
core.setOpacity(name, 0);
|
||||||
|
this.moveImage(code, null, opacityVal, time, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
////// 隐藏图片 //////
|
////// 隐藏图片 //////
|
||||||
events.prototype.hideImage = function (code, time, callback) {
|
events.prototype.hideImage = function (code, time, callback) {
|
||||||
time = time || 0;
|
time = time || 0;
|
||||||
var name = "image"+ (code+100);
|
var name = "image" + (code + 100);
|
||||||
if (!core.isset(core.dymCanvas[name])) {
|
if (time == 0 || !core.dymCanvas[name]) {
|
||||||
if (core.isset(callback)) callback();
|
core.deleteCanvas(name);
|
||||||
|
if (callback) callback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (time == 0)
|
this.moveImage(code, null, 0, time, function () {
|
||||||
core.deleteCanvas(name);
|
core.deleteCanvas(name);
|
||||||
else {
|
if (callback) callback();
|
||||||
var opacityVal = parseFloat(core.dymCanvas[name].canvas.style.opacity);
|
});
|
||||||
var per_time = 10, steps = parseInt(time / per_time), per_add = opacityVal / steps;
|
|
||||||
var animate = setInterval(function () {
|
|
||||||
opacityVal -= per_add;
|
|
||||||
core.setOpacity(name, opacityVal);
|
|
||||||
if (opacityVal < 0) {
|
|
||||||
delete core.animateFrame.asyncId[animate];
|
|
||||||
clearInterval(animate);
|
|
||||||
core.deleteCanvas(name);
|
|
||||||
if (core.isset(callback)) callback();
|
|
||||||
}
|
|
||||||
}, per_time);
|
|
||||||
|
|
||||||
core.animateFrame.asyncId[animate] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
////// 文本图片化 //////
|
|
||||||
events.prototype.textImage = function (content) {
|
|
||||||
content = content || "";
|
|
||||||
|
|
||||||
// 获得颜色的盒子等信息
|
|
||||||
var textAttribute = core.status.textAttribute || core.initStatus.textAttribute;
|
|
||||||
var textfont = textAttribute.textfont || 16;
|
|
||||||
var offset = textAttribute.offset || 15;
|
|
||||||
var textColor = core.arrayToRGBA(textAttribute.text);
|
|
||||||
|
|
||||||
var font = textfont+"px "+core.status.globalAttribute.font;
|
|
||||||
if (textAttribute.bold) font = "bold "+font;
|
|
||||||
var contents = core.splitLines('ui', content), lines = contents.length;
|
|
||||||
|
|
||||||
// 计算总高度,按1.4倍行距计算
|
|
||||||
var width = 416, height = textfont * 1.4 * lines;
|
|
||||||
var tempCanvas = core.bigmap.tempCanvas;
|
|
||||||
tempCanvas.canvas.width = width;
|
|
||||||
tempCanvas.canvas.height = height;
|
|
||||||
tempCanvas.clearRect(0, 0, width, height);
|
|
||||||
tempCanvas.font = font;
|
|
||||||
tempCanvas.fillStyle = textColor;
|
|
||||||
|
|
||||||
// 全部绘制
|
|
||||||
var currH = textfont;
|
|
||||||
for (var i = 0; i < lines; ++i) {
|
|
||||||
var text = contents[i];
|
|
||||||
tempCanvas.fillText(text, offset, currH);
|
|
||||||
currH += 1.4 * textfont;
|
|
||||||
}
|
|
||||||
|
|
||||||
return tempCanvas.canvas;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////// 移动图片 //////
|
////// 移动图片 //////
|
||||||
events.prototype.moveImage = function (code, to, opacityVal, time, callback) {
|
events.prototype.moveImage = function (code, to, opacityVal, time, callback) {
|
||||||
time = time || 1000;
|
time = time || 1000;
|
||||||
|
to = to || [];
|
||||||
var name = "image"+ (code+100);
|
var name = "image"+ (code+100);
|
||||||
if (!core.isset(core.dymCanvas[name])) {
|
if (!core.dymCanvas[name]) {
|
||||||
if (core.isset(callback)) callback();
|
if (callback) callback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var fromX = parseFloat(core.dymCanvas[name].canvas.getAttribute("_left")),
|
var getOrDefault = function (a, b) {
|
||||||
fromY = parseFloat(core.dymCanvas[name].canvas.getAttribute("_top")),
|
a = core.calValue(a);
|
||||||
preX = fromX, preY = fromY, toX = fromX, toY = fromY;
|
return core.isset(a) ? a : b;
|
||||||
|
}
|
||||||
|
var canvas = core.dymCanvas[name].canvas;
|
||||||
|
var fromX = parseFloat(canvas.getAttribute("_left")),
|
||||||
|
fromY = parseFloat(canvas.getAttribute("_top")),
|
||||||
|
toX = getOrDefault(to[0], fromX), toY = getOrDefault(to[1], fromY);
|
||||||
|
|
||||||
if (core.isset(to)) {
|
var opacity = parseFloat(canvas.style.opacity), toOpacity = getOrDefault(opacityVal, opacity);
|
||||||
toX = core.calValue(to[0]);
|
|
||||||
toY = core.calValue(to[1]);
|
|
||||||
if (!core.isset(toX)) toX = fromX;
|
|
||||||
if (!core.isset(toY)) toY = fromY;
|
|
||||||
}
|
|
||||||
|
|
||||||
var step = 0;
|
this._moveImage_moving(name, {
|
||||||
var per_time = 10, steps = parseInt(time / per_time);
|
fromX: fromX, fromY: fromY, toX: toX, toY: toY, opacity: opacity, toOpacity: toOpacity, time: time
|
||||||
var preOpac = parseFloat(core.dymCanvas[name].canvas.style.opacity), opacStep = 0;
|
}, callback)
|
||||||
if (core.isset(opacityVal)) {
|
}
|
||||||
opacityVal = core.calValue(opacityVal);
|
|
||||||
opacStep = (opacityVal - preOpac) / steps;
|
events.prototype._moveImage_moving = function(name, moveInfo, callback) {
|
||||||
}
|
var per_time = 10, step = 0, steps = parseInt(moveInfo.time / 10);
|
||||||
|
var fromX = moveInfo.fromX, fromY = moveInfo.fromY, toX = moveInfo.toX, toY = moveInfo.toY,
|
||||||
var moveStep = function () {
|
opacity = moveInfo.opacity, toOpacity = moveInfo.toOpacity;
|
||||||
preOpac += opacStep;
|
var currX = fromX, currY = fromY, currOpacity = opacity;
|
||||||
core.setOpacity(name, preOpac);
|
|
||||||
preX = parseInt(fromX + (toX-fromX)*step/steps);
|
|
||||||
preY = parseInt(fromY + (toY-fromY)*step/steps);
|
|
||||||
core.relocateCanvas(name, preX, preY);
|
|
||||||
}
|
|
||||||
var animate = setInterval(function () {
|
var animate = setInterval(function () {
|
||||||
step++;
|
step++;
|
||||||
moveStep();
|
currOpacity = opacity + (toOpacity-opacity)*step/steps;
|
||||||
|
currX = parseInt(fromX + (toX-fromX)*step/steps);
|
||||||
|
currY = parseInt(fromY + (toY-fromY)*step/steps);
|
||||||
|
core.setOpacity(name, currOpacity);
|
||||||
|
core.relocateCanvas(name, currX, currY);
|
||||||
if (step == steps) {
|
if (step == steps) {
|
||||||
if (core.isset(opacityVal))
|
core.setOpacity(name, toOpacity);
|
||||||
core.setOpacity(name, opacityVal);
|
|
||||||
delete core.animateFrame.asyncId[animate];
|
delete core.animateFrame.asyncId[animate];
|
||||||
clearInterval(animate);
|
clearInterval(animate);
|
||||||
if (core.isset(callback)) callback();
|
if (callback) callback();
|
||||||
}
|
}
|
||||||
}, per_time);
|
}, per_time);
|
||||||
|
|
||||||
core.animateFrame.asyncId[animate] = true;
|
core.animateFrame.asyncId[animate] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
////// 淡入淡出音乐 //////
|
////// 淡入淡出音乐 //////
|
||||||
events.prototype.setVolume = function (value, time, callback) {
|
events.prototype.setVolume = function (value, time, callback) {
|
||||||
|
|
||||||
var set = function (value) {
|
var set = function (value) {
|
||||||
core.musicStatus.volume = value;
|
core.musicStatus.volume = value;
|
||||||
if (core.isset(core.musicStatus.playingBgm)) {
|
if (core.musicStatus.playingBgm)
|
||||||
core.material.bgms[core.musicStatus.playingBgm].volume = value;
|
core.material.bgms[core.musicStatus.playingBgm].volume = value;
|
||||||
}
|
|
||||||
// core.musicStatus.gainNode.gain.value = value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!core.isset(time) || time<100) {
|
if (!core.isset(time) || time<100) {
|
||||||
set(value);
|
set(value);
|
||||||
if (core.isset(callback)) callback();
|
if (callback) callback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var currVolume = core.musicStatus.volume;
|
var currVolume = core.musicStatus.volume;
|
||||||
var per_time = 10, step = 0, steps = parseInt(time / per_time);
|
var per_time = 10, step = 0, steps = parseInt(time / per_time);
|
||||||
var fade = setInterval(function () {
|
var fade = setInterval(function () {
|
||||||
step++;
|
step++;
|
||||||
var nowVolume = currVolume+(value-currVolume)*step/steps;
|
set(currVolume+(value-currVolume)*step/steps);
|
||||||
set(nowVolume);
|
|
||||||
if (step>=steps) {
|
if (step>=steps) {
|
||||||
delete core.animateFrame.asyncId[fade];
|
delete core.animateFrame.asyncId[fade];
|
||||||
clearInterval(fade);
|
clearInterval(fade);
|
||||||
if (core.isset(callback))
|
if (callback) callback();
|
||||||
callback();
|
|
||||||
}
|
}
|
||||||
}, per_time);
|
}, per_time);
|
||||||
|
|
||||||
core.animateFrame.asyncId[fade] = true;
|
core.animateFrame.asyncId[fade] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
////// 画面震动 //////
|
////// 画面震动 //////
|
||||||
events.prototype.vibrate = function(time, callback) {
|
events.prototype.vibrate = function(time, callback) {
|
||||||
|
|
||||||
if (core.isReplaying()) {
|
if (core.isReplaying()) {
|
||||||
if (core.isset(callback)) callback();
|
if (callback) callback();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// core.status.replay.animate=true;
|
|
||||||
|
|
||||||
var addGameCanvasTranslate=function(x,y){
|
|
||||||
for(var ii=0,canvas;canvas=core.dom.gameCanvas[ii];ii++){
|
|
||||||
var id = canvas.getAttribute('id');
|
|
||||||
if (id=='ui' || id=='data') continue;
|
|
||||||
var offsetX = x, offsetY = y;
|
|
||||||
if (core.bigmap.canvas.indexOf(id)>=0) {
|
|
||||||
offsetX-=core.bigmap.offsetX;
|
|
||||||
offsetY-=core.bigmap.offsetY;
|
|
||||||
}
|
|
||||||
core.control.setGameCanvasTranslate(id, offsetX, offsetY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!core.isset(time) || time<1000) time=1000;
|
if (!core.isset(time) || time<1000) time=1000;
|
||||||
|
// --- 将time调整为500的倍数(上整),不然会出错
|
||||||
var shake_duration = time*3/50;
|
time = Math.ceil(time / 500) * 500;
|
||||||
var shake_speed = 5;
|
var shakeInfo = { duration: time * 3 / 50, speed: 5, power: 5, direction: 1, shake: 0 };
|
||||||
var shake_power = 5;
|
|
||||||
var shake_direction = 1;
|
|
||||||
var shake = 0;
|
|
||||||
|
|
||||||
var update = function() {
|
|
||||||
if(shake_duration >= 1 || shake != 0){
|
|
||||||
var delta = (shake_power * shake_speed * shake_direction) / 10.0;
|
|
||||||
if(shake_duration <= 1 && shake * (shake + delta) < 0){
|
|
||||||
shake = 0;
|
|
||||||
}else{
|
|
||||||
shake += delta;
|
|
||||||
}
|
|
||||||
if(shake > shake_power * 2){
|
|
||||||
shake_direction = -1;
|
|
||||||
}
|
|
||||||
if(shake < - shake_power * 2){
|
|
||||||
shake_direction = 1;
|
|
||||||
}
|
|
||||||
if(shake_duration >= 1){
|
|
||||||
shake_duration -= 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var animate=setInterval(function(){
|
var animate=setInterval(function(){
|
||||||
update();
|
core.events._vibrate_update(shakeInfo);
|
||||||
addGameCanvasTranslate(shake, 0);
|
core.control.addGameCanvasTranslate(shakeInfo.shake, 0);
|
||||||
if(shake_duration===0) {
|
if(shakeInfo.duration===0) {
|
||||||
delete core.animateFrame.asyncId[animate];
|
delete core.animateFrame.asyncId[animate];
|
||||||
clearInterval(animate);
|
clearInterval(animate);
|
||||||
// core.status.replay.animate=false;
|
if (callback) callback();
|
||||||
if (core.isset(callback)) callback();
|
|
||||||
}
|
}
|
||||||
}, 50/3);
|
}, 50 / 3);
|
||||||
|
|
||||||
core.animateFrame.asyncId[animate] = true;
|
core.animateFrame.asyncId[animate] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._vibrate_update = function (shakeInfo) {
|
||||||
|
if(shakeInfo.duration >= 1 || shakeInfo.shake != 0){
|
||||||
|
var delta = (shakeInfo.power * shakeInfo.speed * shakeInfo.direction) / 10.0;
|
||||||
|
if(shakeInfo.duration <= 1 && shakeInfo.shake * (shakeInfo.shake + delta) < 0){
|
||||||
|
shakeInfo.shake = 0;
|
||||||
|
}else{
|
||||||
|
shakeInfo.shake += delta;
|
||||||
|
}
|
||||||
|
if(shakeInfo.shake > shakeInfo.power * 2){
|
||||||
|
shakeInfo.direction = -1;
|
||||||
|
}
|
||||||
|
if(shakeInfo.shake < - shakeInfo.power * 2){
|
||||||
|
shakeInfo.direction = 1;
|
||||||
|
}
|
||||||
|
if(shakeInfo.duration >= 1){
|
||||||
|
shakeInfo.duration -= 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////// 打开一个全局商店 //////
|
////// 打开一个全局商店 //////
|
||||||
events.prototype.openShop = function(shopId, needVisited) {
|
events.prototype.openShop = function(shopId, needVisited) {
|
||||||
var shop = core.status.shops[shopId];
|
var shop = core.status.shops[shopId];
|
||||||
shop.times = shop.times || 0;
|
shop.times = shop.times || 0;
|
||||||
if (shop.commonTimes)
|
if (shop.commonTimes) shop.times = core.getFlag('commonTimes', 0);
|
||||||
shop.times = core.getFlag('commonTimes', 0);
|
|
||||||
shop.visited = shop.visited || false;
|
|
||||||
|
|
||||||
if (needVisited && !shop.visited) {
|
if (needVisited && !shop.visited) {
|
||||||
if (!core.flags.enableDisabledShop) {
|
if (!core.flags.enableDisabledShop) {
|
||||||
if (shop.times==0) core.drawTip("该商店尚未开启");
|
if (shop.times==0) core.drawTip("该商店尚未开启");
|
||||||
@ -1897,85 +1806,30 @@ events.prototype.openShop = function(shopId, needVisited) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else shop.visited = true;
|
else shop.visited = true;
|
||||||
|
core.ui.drawShop(shopId);
|
||||||
var selection = core.status.event.selection;
|
|
||||||
var actions = [];
|
|
||||||
if (core.isset(core.status.event.data) && core.isset(core.status.event.data.actions))
|
|
||||||
actions=core.status.event.data.actions;
|
|
||||||
var fromList;
|
|
||||||
if (core.isset(core.status.event.data) && core.isset(core.status.event.data.fromList))
|
|
||||||
fromList = core.status.event.data.fromList;
|
|
||||||
|
|
||||||
core.ui.closePanel();
|
|
||||||
core.lockControl();
|
|
||||||
// core.status.event = {'id': 'shop', 'data': {'id': shopId, 'shop': shop}};
|
|
||||||
core.status.event.id = 'shop';
|
|
||||||
core.status.event.data = {'id': shopId, 'shop': shop, 'actions': actions, 'fromList': fromList};
|
|
||||||
core.status.event.selection = selection;
|
|
||||||
|
|
||||||
// 拼词
|
|
||||||
var content = "\t["+shop.name+","+shop.icon+"]";
|
|
||||||
var times = shop.times, need=core.calValue(shop.need, null, null, times);
|
|
||||||
|
|
||||||
content += core.replaceText(shop.text, need, times);
|
|
||||||
|
|
||||||
var use = shop.use=='experience'?'经验':'金币';
|
|
||||||
|
|
||||||
var choices = [];
|
|
||||||
for (var i=0;i<shop.choices.length;i++) {
|
|
||||||
var choice = shop.choices[i];
|
|
||||||
var text = core.replaceText(choice.text, need, times);
|
|
||||||
if (core.isset(choice.need))
|
|
||||||
text += "("+core.calValue(choice.need, null, null, times)+use+")";
|
|
||||||
choices.push({"text": text, "color":shop.visited?null:"#999999"});
|
|
||||||
}
|
|
||||||
choices.push("离开");
|
|
||||||
core.ui.drawChoices(content, choices);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
events.prototype._useShop = function (shop, index) {
|
events.prototype._useShop = function (shop, index) {
|
||||||
// 检查能否使用快捷商店
|
|
||||||
var reason = core.events.canUseQuickShop(shop.id);
|
var reason = core.events.canUseQuickShop(shop.id);
|
||||||
if (core.isset(reason)) {
|
if (!reason && !shop.visited) reason = shop.times ? "该商店已失效" : "该商店尚未开启";
|
||||||
core.drawText(reason);
|
if (reason) {
|
||||||
|
core.drawTip(reason);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!shop.visited) {
|
var use = shop.use, choice = shop.choices[index];
|
||||||
if (shop.times==0) core.drawTip("该商店尚未开启");
|
var times = shop.times, need = core.calValue(choice.need||shop.need, null, null, times);
|
||||||
else core.drawTip("该商店已失效");
|
if (need > core.getStatus(use)) {
|
||||||
|
core.drawTip("你的"+(use=='money'?"金币":"经验")+"不足");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var money = core.getStatus('money'), experience = core.getStatus('experience');
|
|
||||||
var times = shop.times, need = core.calValue(shop.need, null, null, times);
|
|
||||||
var use = shop.use;
|
|
||||||
var use_text = use=='money'?"金币":"经验";
|
|
||||||
|
|
||||||
var choice = shop.choices[index];
|
|
||||||
if (core.isset(choice.need))
|
|
||||||
need = core.calValue(choice.need, null, null, times);
|
|
||||||
|
|
||||||
if (need > eval(use)) {
|
|
||||||
core.drawTip("你的"+use_text+"不足");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
core.status.event.selection = index;
|
core.status.event.selection = index;
|
||||||
core.status.event.data.actions.push(index);
|
core.status.event.data.actions.push(index);
|
||||||
|
core.setStatus(use, core.getStatus(use) - need);
|
||||||
eval(use+'-='+need);
|
core.doEffect(choice.effect, need, times);
|
||||||
core.setStatus('money', money);
|
|
||||||
core.setStatus('experience', experience);
|
|
||||||
|
|
||||||
// 更新属性
|
|
||||||
choice.effect.split(";").forEach(function (t) {
|
|
||||||
core.doEffect(t, need, times);
|
|
||||||
});
|
|
||||||
core.updateStatusBar();
|
core.updateStatusBar();
|
||||||
shop.times++;
|
shop.times++;
|
||||||
if (shop.commonTimes)
|
if (shop.commonTimes) core.setFlag('commonTimes', shop.times);
|
||||||
core.setFlag('commonTimes', shop.times);
|
this.openShop(shop.id);
|
||||||
core.events.openShop(shop.id);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2003,69 +1857,51 @@ events.prototype.canUseQuickShop = function(shopId) {
|
|||||||
|
|
||||||
////// 设置角色行走图 //////
|
////// 设置角色行走图 //////
|
||||||
events.prototype.setHeroIcon = function (name, noDraw) {
|
events.prototype.setHeroIcon = function (name, noDraw) {
|
||||||
if (core.isset(core.material.images.images[name]) && core.material.images.images[name].width==128) {
|
var img = core.material.images.images[name];
|
||||||
core.setFlag("heroIcon", name);
|
if (!img || img.width != 128) return;
|
||||||
core.material.images.hero.onload = function () {
|
core.setFlag("heroIcon", name);
|
||||||
core.material.icons.hero.height = core.material.images.images[name].height/4;
|
core.material.images.hero.onload = function () {
|
||||||
core.control.updateHeroIcon(name);
|
core.material.icons.hero.height = img.height/4;
|
||||||
if (!noDraw) core.drawHero();
|
core.control.updateHeroIcon(name);
|
||||||
}
|
if (!noDraw) core.drawHero();
|
||||||
core.material.images.hero.src = core.material.images.images[name].src;
|
|
||||||
}
|
}
|
||||||
|
core.material.images.hero.src = img.src;
|
||||||
}
|
}
|
||||||
|
|
||||||
////// 检查升级事件 //////
|
////// 检查升级事件 //////
|
||||||
events.prototype.checkLvUp = function () {
|
events.prototype.checkLvUp = function () {
|
||||||
var check = function () {
|
|
||||||
if (!core.flags.enableLevelUp || !core.isset(core.firstData.levelUp)
|
|
||||||
|| core.status.hero.lv>=core.firstData.levelUp.length) return null;
|
|
||||||
// 计算下一个所需要的数值
|
|
||||||
var next = (core.firstData.levelUp[core.status.hero.lv]||{});
|
|
||||||
var need = core.calValue(next.need);
|
|
||||||
if (!core.isset(need)) return null;
|
|
||||||
if (core.status.hero.experience>=need) {
|
|
||||||
// 升级
|
|
||||||
core.status.hero.lv++;
|
|
||||||
if (next.clear) core.status.hero.experience -= need;
|
|
||||||
return next.action||[];
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
var actions = [];
|
var actions = [];
|
||||||
while (true) {
|
while (true) {
|
||||||
var next = check();
|
var next = this._checkLvUp_check();
|
||||||
if (next == null) break;
|
if (next == null) break;
|
||||||
actions = actions.concat(next);
|
actions = actions.concat(next);
|
||||||
}
|
}
|
||||||
if (actions.length>0) core.insertAction(actions);
|
if (actions.length>0) core.insertAction(actions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
events.prototype._checkLvUp_check = function () {
|
||||||
|
if (!core.flags.enableLevelUp || !core.isset(core.firstData.levelUp)
|
||||||
|
|| core.status.hero.lv>=core.firstData.levelUp.length) return null;
|
||||||
|
// 计算下一个所需要的数值
|
||||||
|
var next = (core.firstData.levelUp[core.status.hero.lv]||{});
|
||||||
|
var need = core.calValue(next.need);
|
||||||
|
if (!core.isset(need)) return null;
|
||||||
|
if (core.status.hero.experience>=need) {
|
||||||
|
// 升级
|
||||||
|
core.status.hero.lv++;
|
||||||
|
if (next.clear) core.status.hero.experience -= need;
|
||||||
|
return next.action||[];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
////// 尝试使用道具 //////
|
////// 尝试使用道具 //////
|
||||||
events.prototype.tryUseItem = function(itemId) {
|
events.prototype.tryUseItem = function(itemId) {
|
||||||
core.ui.closePanel();
|
core.ui.closePanel();
|
||||||
|
|
||||||
if (itemId=='book') {
|
if (itemId=='book') return core.openBook(false);
|
||||||
core.openBook(false);
|
if (itemId=='fly') return core.useFly(false);
|
||||||
return;
|
if (itemId=='centerFly') return core.ui.drawCenterFly();
|
||||||
}
|
|
||||||
if (itemId=='fly') {
|
|
||||||
core.useFly(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (itemId=='centerFly') {
|
|
||||||
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)';
|
|
||||||
var toX = core.bigmap.width-1 - core.getHeroLoc('x'), toY = core.bigmap.height-1-core.getHeroLoc('y');
|
|
||||||
core.drawThumbnail(null, null, {heroLoc: core.status.hero.loc, heroIcon: core.getFlag('heroIcon', "hero.png")},
|
|
||||||
{ctx: 'ui', centerX: toX, centerY: toY});
|
|
||||||
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, "posX": toX-offsetX, "posY": toY-offsetY};
|
|
||||||
core.drawTip("请确认当前中心对称飞行器的位置");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (core.canUseItem(itemId))core.useItem(itemId);
|
if (core.canUseItem(itemId))core.useItem(itemId);
|
||||||
else core.drawTip("当前无法使用"+core.material.items[itemId].name);
|
else core.drawTip("当前无法使用"+core.material.items[itemId].name);
|
||||||
|
|||||||
83
libs/ui.js
83
libs/ui.js
@ -8,6 +8,10 @@
|
|||||||
|
|
||||||
function ui() {
|
function ui() {
|
||||||
this._init();
|
this._init();
|
||||||
|
this.DEFAULT_WIDTH = 13;
|
||||||
|
this.DEFAULT_HEIGHT = 13;
|
||||||
|
this.DEFAULT_PIXEL_WIDTH = this.DEFAULT_WIDTH * 32;
|
||||||
|
this.DEFAULT_PIXEL_HEIGHT = this.DEFAULT_HEIGHT * 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化UI
|
// 初始化UI
|
||||||
@ -1042,6 +1046,40 @@ ui.prototype.drawChoices = function(content, choices) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////// 文本图片化 //////
|
||||||
|
ui.prototype.textImage = function (content) {
|
||||||
|
content = content || "";
|
||||||
|
|
||||||
|
// 获得颜色的盒子等信息
|
||||||
|
var textAttribute = core.status.textAttribute || core.initStatus.textAttribute;
|
||||||
|
var textfont = textAttribute.textfont || 16;
|
||||||
|
var offset = textAttribute.offset || 15;
|
||||||
|
var textColor = core.arrayToRGBA(textAttribute.text);
|
||||||
|
|
||||||
|
var font = textfont+"px "+core.status.globalAttribute.font;
|
||||||
|
if (textAttribute.bold) font = "bold "+font;
|
||||||
|
var contents = core.splitLines('ui', content), lines = contents.length;
|
||||||
|
|
||||||
|
// 计算总高度,按1.4倍行距计算
|
||||||
|
var width = 416, height = textfont * 1.4 * lines;
|
||||||
|
var tempCanvas = core.bigmap.tempCanvas;
|
||||||
|
tempCanvas.canvas.width = width;
|
||||||
|
tempCanvas.canvas.height = height;
|
||||||
|
tempCanvas.clearRect(0, 0, width, height);
|
||||||
|
tempCanvas.font = font;
|
||||||
|
tempCanvas.fillStyle = textColor;
|
||||||
|
|
||||||
|
// 全部绘制
|
||||||
|
var currH = textfont;
|
||||||
|
for (var i = 0; i < lines; ++i) {
|
||||||
|
var text = contents[i];
|
||||||
|
tempCanvas.fillText(text, offset, currH);
|
||||||
|
currH += 1.4 * textfont;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tempCanvas.canvas;
|
||||||
|
}
|
||||||
|
|
||||||
////// 绘制一个确认/取消的警告页面 //////
|
////// 绘制一个确认/取消的警告页面 //////
|
||||||
ui.prototype.drawConfirmBox = function (text, yesCallback, noCallback) {
|
ui.prototype.drawConfirmBox = function (text, yesCallback, noCallback) {
|
||||||
core.lockControl();
|
core.lockControl();
|
||||||
@ -1604,6 +1642,51 @@ ui.prototype.drawFly = function(page) {
|
|||||||
core.drawThumbnail(floorId, null, null, {ctx: 'ui', x: 20, y: 100, size: 273});
|
core.drawThumbnail(floorId, null, null, {ctx: 'ui', x: 20, y: 100, size: 273});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////// 绘制中心对称飞行器
|
||||||
|
ui.prototype.drawCenterFly = function () {
|
||||||
|
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)';
|
||||||
|
var toX = core.bigmap.width - 1 - core.getHeroLoc('x'), toY = core.bigmap.height - 1 - core.getHeroLoc('y');
|
||||||
|
core.drawThumbnail(null, null, {heroLoc: core.status.hero.loc, heroIcon: core.getFlag('heroIcon', "hero.png")},
|
||||||
|
{ctx: 'ui', centerX: toX, centerY: toY});
|
||||||
|
var midX = Math.floor(this.DEFAULT_WIDTH / 2), midY = Math.floor(this.DEFAULT_HEIGHT / 2);
|
||||||
|
var offsetX = core.clamp(toX - midX, 0, core.bigmap.width - this.DEFAULT_WIDTH),
|
||||||
|
offsetY = core.clamp(toY - midY, 0, core.bigmap.height - this.DEFAULT_HEIGHT);
|
||||||
|
core.fillRect('ui', (toX - offsetX) * 32, (toY - offsetY) * 32, 32, 32, fillstyle);
|
||||||
|
core.status.event.data = {"x": toX, "y": toY, "posX": toX - offsetX, "posY": toY - offsetY};
|
||||||
|
core.drawTip("请确认当前中心对称飞行器的位置");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
////// 绘制全局商店
|
||||||
|
ui.prototype.drawShop = function (shopId) {
|
||||||
|
var shop = core.status.shops[shopId];
|
||||||
|
var actions = [], fromList = (core.status.event.data||{}).fromList, selection = core.status.event.selection;
|
||||||
|
if (core.status.event.data && core.status.event.data.actions) actions=core.status.event.data.actions;
|
||||||
|
|
||||||
|
core.ui.closePanel();
|
||||||
|
core.lockControl();
|
||||||
|
core.status.event.id = 'shop';
|
||||||
|
core.status.event.data = {'id': shopId, 'shop': shop, 'actions': actions, 'fromList': fromList};
|
||||||
|
core.status.event.selection = selection;
|
||||||
|
|
||||||
|
var times = shop.times, need=core.calValue(shop.need, null, null, times);
|
||||||
|
var content = "\t["+shop.name+","+shop.icon+"]" + core.replaceText(shop.text, need, times);
|
||||||
|
var use = shop.use=='experience'?'经验':'金币';
|
||||||
|
var choices = [];
|
||||||
|
for (var i=0;i<shop.choices.length;i++) {
|
||||||
|
var choice = shop.choices[i];
|
||||||
|
var text = core.replaceText(choice.text, need, times);
|
||||||
|
if (core.isset(choice.need))
|
||||||
|
text += "("+core.calValue(choice.need, null, null, times)+use+")";
|
||||||
|
choices.push({"text": text, "color":shop.visited?null:"#999999"});
|
||||||
|
}
|
||||||
|
choices.push("离开");
|
||||||
|
core.ui.drawChoices(content, choices);
|
||||||
|
}
|
||||||
|
|
||||||
////// 绘制浏览地图界面 //////
|
////// 绘制浏览地图界面 //////
|
||||||
ui.prototype.drawMaps = function (index, x, y) {
|
ui.prototype.drawMaps = function (index, x, y) {
|
||||||
core.lockControl();
|
core.lockControl();
|
||||||
|
|||||||
@ -600,7 +600,7 @@ utils.prototype.setStatusBarInnerHTML = function (name, value, css) {
|
|||||||
var length = this.strlen(value) || 1;
|
var length = this.strlen(value) || 1;
|
||||||
style += 'font-size: ' + Math.min(1, 7/length) + 'em; ';
|
style += 'font-size: ' + Math.min(1, 7/length) + 'em; ';
|
||||||
if (core.isset(css)) style += css;
|
if (core.isset(css)) style += css;
|
||||||
core.statusBar[name].innerHTML = "<span style='" + style + "'>" + value + "</span>";
|
core.statusBar[name].innerHTML = "<span class='_status' style='" + style + "'>" + value + "</span>";
|
||||||
}
|
}
|
||||||
|
|
||||||
utils.prototype.strlen = function (str) {
|
utils.prototype.strlen = function (str) {
|
||||||
|
|||||||
@ -194,7 +194,6 @@
|
|||||||
max-height: 1.6em;
|
max-height: 1.6em;
|
||||||
}
|
}
|
||||||
#statusBar span{
|
#statusBar span{
|
||||||
color: white;
|
|
||||||
font: bold italic 1.1em Verdana;
|
font: bold italic 1.1em Verdana;
|
||||||
}
|
}
|
||||||
#statusBar p {
|
#statusBar p {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user