352 lines
8.6 KiB
JavaScript
352 lines
8.6 KiB
JavaScript
"use strict";
|
|
cc._RF.push(module, '9fe83+xnvFHA4hlrs6hqPBN', 'cmp.plot.guide.wnd');
|
|
// Scripts/mod/plot/cmps/cmp.plot.guide.wnd.js
|
|
|
|
"use strict";
|
|
|
|
/******************************************************************
|
|
* Copyright(C) 2019 - 2020 Nx Studio
|
|
*
|
|
* 剧情/引导
|
|
*
|
|
*
|
|
******************************************************************/
|
|
|
|
var BridgeWindow = require("bridge.window");
|
|
var NxSpine = require("nx.fx.spine");
|
|
var PlotDefine = require("plot.define");
|
|
var BattleController = require("battle_controller");
|
|
var BattleEvent = require("battle_event");
|
|
cc.Class({
|
|
"extends": BridgeWindow,
|
|
properties: {
|
|
nodPanel: {
|
|
"default": null,
|
|
type: cc.Node
|
|
},
|
|
nodArea: {
|
|
"default": null,
|
|
type: cc.Node
|
|
},
|
|
nodFigure: {
|
|
"default": null,
|
|
type: cc.Node
|
|
},
|
|
nodTell: {
|
|
"default": null,
|
|
type: cc.Node
|
|
},
|
|
nodSkip: {
|
|
"default": null,
|
|
type: cc.Button
|
|
},
|
|
spRole: {
|
|
"default": null,
|
|
type: NxSpine
|
|
}
|
|
},
|
|
// 重载:参数打开
|
|
onOpenConfigs: function onOpenConfigs(_params) {
|
|
// 清理
|
|
this.doneStep();
|
|
|
|
// 是否主动激活
|
|
var id = nx.bridge.plot.vget("id");
|
|
if (nx.dt.strEmpty(id)) {
|
|
nx.error("$PlotWnd:引导失败,查找当前引导失败!");
|
|
this.delayClose();
|
|
return;
|
|
}
|
|
|
|
// 视图监听
|
|
nx.bridge.plot.vbind(this, [["skip", this.onSkipChanged.bind(this)], ["step", this.onStepChanged.bind(this)], ["key", this.onKeyChanged.bind(this)]]);
|
|
var step = nx.bridge.plot.vget("step");
|
|
if (step < 0) {
|
|
nx.bridge.plot.next();
|
|
}
|
|
nx.wp = this;
|
|
},
|
|
// 关闭
|
|
onDisable: function onDisable() {
|
|
// 视图解绑
|
|
nx.bridge.plot.vunbind(this);
|
|
},
|
|
// 点击热区
|
|
onTouchArea: function onTouchArea() {
|
|
if (!this.unit) {
|
|
return;
|
|
}
|
|
|
|
// 隐藏热区&&手指
|
|
this.nodArea.active = false;
|
|
this.nodFigure.active = false;
|
|
var key = this.wkey;
|
|
|
|
// 触发
|
|
this.unit.cb();
|
|
|
|
// 下一步
|
|
if (nx.dt.strEmpty(key)) {
|
|
nx.bridge.plot.next();
|
|
}
|
|
},
|
|
// 执行单步
|
|
doStep: function doStep(_data) {
|
|
if (nx.dt.objEmpty(_data)) {
|
|
return;
|
|
}
|
|
|
|
// 界面显示
|
|
this.step = _data;
|
|
this.nodPanel.active = true;
|
|
|
|
// 特殊操作
|
|
if (nx.dt.strNEmpty(this.step.op)) {
|
|
this.doOp(this.step.op);
|
|
}
|
|
if (this.step) {
|
|
// 窗口关闭
|
|
if (this.step.close && nx.dt.strNEmpty(this.step.close)) {
|
|
this.doClosePanel(this.step.close);
|
|
}
|
|
|
|
// 讲述
|
|
if (this.step.words && nx.dt.strNEmpty(this.step.words)) {
|
|
this.startTell(this.step.tpos, this.step.words, this.step.emo);
|
|
}
|
|
|
|
// 引导元素
|
|
if (nx.dt.strNEmpty(this.step.unit)) {
|
|
this.focusUnit(this.step.unit);
|
|
// 聚焦失败,提前结束
|
|
if (!this.step) {
|
|
return;
|
|
}
|
|
this.showFigure(this.step.figure || "");
|
|
}
|
|
|
|
// 弹窗
|
|
if (nx.dt.strNEmpty(this.step.window)) {
|
|
nx.bridge.createPanel(this.step.window);
|
|
}
|
|
|
|
// 等待
|
|
this.wkey = this.step.event || "";
|
|
|
|
// 背景刷新
|
|
this.freshBG();
|
|
}
|
|
|
|
// 超时跳过
|
|
// this.openTimeoutSkip( !nx.bridge.plot.vget( "skip" ) );
|
|
},
|
|
|
|
// 单步完毕
|
|
doneStep: function doneStep() {
|
|
// 数据清理
|
|
this.step = null;
|
|
this.unit = null;
|
|
this.wkey = "";
|
|
|
|
// 隐藏热区&&手指
|
|
this.nodArea.active = false;
|
|
this.nodFigure.active = false;
|
|
this.nodTell.active = false;
|
|
|
|
// 界面隐藏
|
|
this.nodPanel.active = false;
|
|
|
|
// 超时跳过
|
|
this.openTimeoutSkip(false);
|
|
},
|
|
// 特殊操作
|
|
doOp: function doOp(_op) {
|
|
switch (_op) {
|
|
// 返回主界面
|
|
case "main":
|
|
{
|
|
//处于战斗中发送此消息通知服务端切出战斗,必须执行
|
|
var BC = BattleController.getInstance();
|
|
if (BC) {
|
|
BC.SendProtocal(20060, {
|
|
combat_type: 0
|
|
});
|
|
BC.setUIFightType(0);
|
|
}
|
|
nx.bridge.ui.cleanWindows();
|
|
nx.bridge.vset("CloseSpecial", 1);
|
|
}
|
|
break;
|
|
|
|
// 提前完成记录
|
|
case "commit":
|
|
{
|
|
var id = nx.bridge.plot.vget("id");
|
|
nx.bridge.plot.reqComplete(id);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
this.doneStep();
|
|
nx.bridge.plot.next();
|
|
},
|
|
// 窗体关闭
|
|
doClosePanel: function doClosePanel(_wid) {
|
|
nx.bridge.closePanel(_wid);
|
|
this.doneStep();
|
|
nx.bridge.plot.next();
|
|
},
|
|
// 讲述
|
|
startTell: function startTell(_tpos, _words, _emo) {
|
|
var _nx$gui;
|
|
if (_emo === void 0) {
|
|
_emo = "idle";
|
|
}
|
|
this.nodTell.active = true;
|
|
|
|
// 位置
|
|
// TPOS: [对齐方式,偏移,偏移,对白角色序号0开始]
|
|
var pos = _tpos || ["center"];
|
|
(_nx$gui = nx.gui).setAligment.apply(_nx$gui, [this.nodTell, ""].concat(pos));
|
|
|
|
// 角色
|
|
var index = pos[3] || 0;
|
|
var info = nx.bridge.plot.vget("info");
|
|
var role = info.roles[index] || info.roles[0];
|
|
|
|
// 名字
|
|
nx.gui.setString(this.nodTell, "name", nx.text.getKey(role[0]));
|
|
nx.gui.setColor(this.nodTell, "name", cc.color().fromHEX(role[2]));
|
|
|
|
// 模型
|
|
var path = cc.path.join("prefab/plot/models", role[1]);
|
|
this.spRole.play(path, _emo, function () {}, true);
|
|
|
|
// 文本
|
|
this.texts = nx.dt.objClone(nx.text.keymap[_words]);
|
|
if (nx.dt.arrEmpty(this.texts)) {
|
|
this.texts = [_words];
|
|
}
|
|
this.continueTell();
|
|
},
|
|
// 讲述继续
|
|
continueTell: function continueTell() {
|
|
// 结束
|
|
if (nx.dt.arrEmpty(this.texts)) {
|
|
this.doneStep();
|
|
nx.bridge.plot.next();
|
|
return;
|
|
}
|
|
|
|
// 文本
|
|
var text = this.texts.shift();
|
|
nx.gui.setString(this.nodTell, "content", text);
|
|
|
|
// 标记
|
|
nx.gui.setActive(this.nodTell, "continue", this.texts.length > 0);
|
|
},
|
|
// 聚焦指定元素
|
|
focusUnit: function focusUnit(_name) {
|
|
this.unit = nx.bridge.plot.queryUnit(_name);
|
|
if (!this.unit) {
|
|
this.nodArea.active = false;
|
|
nx.error("$Plot:聚焦失败,未找到.", _name);
|
|
this.onTouchSkip();
|
|
return;
|
|
}
|
|
var pos = this.unit.node.convertToWorldSpaceAR(cc.Vec2.ZERO);
|
|
pos = this.nodPanel.convertToNodeSpaceAR(pos);
|
|
this.nodArea.active = true;
|
|
this.nodArea.anchorX = this.unit.node.anchorX;
|
|
this.nodArea.anchorY = this.unit.node.anchorY;
|
|
this.nodArea.position = pos;
|
|
this.nodArea.width = this.unit.node.width + 20;
|
|
this.nodArea.height = this.unit.node.height + 20;
|
|
this.nodArea.scale = 1;
|
|
nx.tween.breatheForever(this.nodArea, "", 2, 0.05);
|
|
},
|
|
// 显示手指
|
|
showFigure: function showFigure(_pos) {
|
|
// 不显示
|
|
if (nx.dt.strEmpty(_pos)) {
|
|
this.nodFigure.active = false;
|
|
return;
|
|
}
|
|
this.nodFigure.active = true;
|
|
this.nodFigure.position = this.nodArea.position;
|
|
this.nodFigure.width = this.nodArea.width;
|
|
this.nodFigure.height = this.nodArea.height;
|
|
this.nodFigure.children.forEach(function (node) {
|
|
node.active = node.name == _pos;
|
|
});
|
|
},
|
|
// 点击跳过
|
|
onTouchSkip: function onTouchSkip() {
|
|
this.doneStep();
|
|
nx.bridge.plot.done();
|
|
},
|
|
// 点击背景
|
|
onTouchBG: function onTouchBG() {
|
|
if (this.nodArea.active) {
|
|
return;
|
|
}
|
|
|
|
// 讲述
|
|
if (this.nodTell.active) {
|
|
this.continueTell();
|
|
}
|
|
},
|
|
// 显示背景
|
|
freshBG: function freshBG() {
|
|
var show = this.nodTell.active && !this.nodArea.active;
|
|
nx.gui.setActive(this, "panel/touch", show);
|
|
},
|
|
// 剧情可否跳过
|
|
onSkipChanged: function onSkipChanged(_skip) {
|
|
var _this = this;
|
|
this.nodSkip.node.active = false;
|
|
if (!_skip) {
|
|
return;
|
|
}
|
|
this.nodSkip.interactable = false;
|
|
nx.tween.delayFadeIn(this.nodSkip, "", 3, 1, function () {
|
|
_this.nodSkip.interactable = true;
|
|
});
|
|
},
|
|
// 步数改变
|
|
onStepChanged: function onStepChanged(_step, _, _init) {
|
|
var step = nx.bridge.plot.stepData();
|
|
if (nx.dt.objEmpty(step)) {
|
|
this.doneStep();
|
|
return;
|
|
}
|
|
|
|
// 执行
|
|
this.doStep(step);
|
|
},
|
|
// 触发事件改变
|
|
onKeyChanged: function onKeyChanged(_key, _, _init) {
|
|
if (_init || nx.dt.strEmpty(_key)) {
|
|
return;
|
|
}
|
|
if (this.wkey == _key) {
|
|
nx.bridge.plot.next();
|
|
}
|
|
},
|
|
// 异常情况超时跳过机制
|
|
openTimeoutSkip: function openTimeoutSkip(_open) {
|
|
var _this2 = this;
|
|
nx.timers.delTimer("PlotToutSkip");
|
|
nx.gui.setActive(this.nodSkip, "", false);
|
|
if (!_open) {
|
|
return;
|
|
}
|
|
nx.timers.newTimer("PlotToutSkip", 15, 1, function () {
|
|
nx.gui.setActive(_this2.nodSkip, "", true);
|
|
nx.tween.delayFadeIn(_this2.nodSkip, "", 3, 1);
|
|
});
|
|
}
|
|
});
|
|
|
|
cc._RF.pop(); |