SamsaraGame/assets/Script/game/PubFunction.js
2025-04-24 17:03:28 +08:00

1256 lines
42 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import GameModel from "../ts/core/GameModel";
import GameUtil from "../ts/core/GameUtil";
import ItemUtil from "../ts/core/ItemUtil";
import SKDataUtil from "../ts/gear_2.3.4/util/SKDataUtil";
import SKUIUtil from "../ts/gear_2.3.4/util/SKUIUtil";
let GameRes = require('./GameRes');
let pScreenNoticeMgr = require('./ScreenNotice');
class CPubFunction {
constructor() {
this.vecScreenCutDown = [];
this.noticeNum = 0;
this.vecRoleBroadCast = [];
this.nTimeIndex = 0;
this.btntimer = {
timer: null,
times: 0,
};
this.vecExpLevel = [0, 100, 500, 1000, 5000, 10000, 50000, 100000, 500000, 1000000, 5000000, 10000000, 50000000, 100000000]; //zzzErr
this.mapAttribute = {};
this.mapAttribute['AdSpdEhan'] = {
Name: '加強加速',
Kind: '物理屬性'
};
this.mapAttribute['CharmEhan'] = {
Name: '加強魅惑',
Kind: '法術增強'
};
this.mapAttribute['AdAtkEhan'] = {
Name: '加強加功',
Kind: '物理屬性'
};
this.mapAttribute['AdDefEhan'] = {
Name: '加強防禦',
Kind: '物理屬性'
};
this.mapAttribute['RecoverEhan'] = {
Name: '加強遺忘',
Kind: '法術增強'
};
this.mapAttribute['DisorderDef'] = {
Name: '抗混亂',
Kind: '法術抗性'
};
this.mapAttribute['DisorderDefNeg'] = {
Name: '忽視抗混',
Kind: '法術增強'
};
this.mapAttribute['DisorderEhan'] = {
Name: '加強混亂',
Kind: '法術增強'
};
this.mapAttribute['Atk'] = {
Name: '攻擊',
Kind: '物理屬性'
};
this.mapAttribute['Speed'] = {
Name: '速度',
Kind: '物理屬性'
};
this.mapAttribute['HitCombo'] = {
Name: '連擊次數',
Kind: '物理屬性'
};
this.mapAttribute['HitComboRate'] = {
Name: '連擊率',
Kind: '物理屬性'
};
this.mapAttribute['HitRate'] = {
Name: '命中率',
Kind: '物理屬性'
};
this.mapAttribute['FatalRate'] = {
Name: '狂暴率',
Kind: '物理屬性'
};
this.mapAttribute['PhyDef'] = {
Name: '物理吸收',
Kind: '物理屬性'
};
this.mapAttribute['PhyDefNef'] = {
Name: '破防程度',
Kind: '物理屬性'
};
this.mapAttribute['PhyDefNefRate'] = {
Name: '破防概率',
Kind: '物理屬性'
};
this.mapAttribute['VoidRate'] = {
Name: '閃避率',
Kind: '物理屬性'
};
this.mapAttribute['HpMax'] = {
Name: '氣血',
Kind: '物理屬性'
};
this.mapAttribute['FireDef'] = {
Name: '抗火',
Kind: '法術抗性'
};
this.mapAttribute['ForgetDef'] = {
Name: '抗遺忘',
Kind: '法術抗性'
};
this.mapAttribute['GfireDef'] = {
Name: '抗鬼火',
Kind: '法術抗性'
};
this.mapAttribute['GfireDefNeg'] = {
Name: '忽視抗鬼火',
Kind: '法術增強'
};
this.mapAttribute['GfireRageOdds'] = {
Name: '鬼火狂暴率',
Kind: '法術增強'
};
this.mapAttribute['PoisonDef'] = {
Name: '抗毒',
Kind: '法術抗性'
};
this.mapAttribute['RainDef'] = {
Name: '抗水',
Kind: '法術抗性'
};
this.mapAttribute['RainDefNeg'] = {
Name: '忽視抗水',
Kind: '法術增強'
};
this.mapAttribute['RainEhan'] = {
Name: '加強水系',
Kind: '法術增強'
};
this.mapAttribute['RainRageOdds'] = {
Name: '水系狂暴率',
Kind: '法術增強'
};
this.mapAttribute['SanshiDef'] = {
Name: '抗三尸',
Kind: '法術抗性'
};
this.mapAttribute['SanshiDefNeg'] = {
Name: '忽視抗三尸',
Kind: '法術增強'
};
this.mapAttribute['ShanshiRageOdds'] = {
Name: '三尸狂暴率',
Kind: '法術增強'
};
this.mapAttribute['SealDef'] = {
Name: '抗封印',
Kind: '法術抗性'
};
this.mapAttribute['ShockDef'] = {
Name: '抗震',
Kind: '法術抗性'
};
this.mapAttribute['ShockDefNeg'] = {
Name: '忽視抗震懾',
Kind: '法術增強'
};
this.mapAttribute['ShockEhan'] = {
Name: '加強震懾',
Kind: '法術增強'
};
this.mapAttribute['SleepDef'] = {
Name: '抗昏睡',
Kind: '法術抗性'
};
this.mapAttribute['ThunderDef'] = {
Name: '抗雷',
Kind: '法術抗性'
};
this.mapAttribute['ThunderRageOdds'] = {
Name: '雷系狂暴率',
Kind: '法術增強'
};
this.mapAttribute['WindDef'] = {
Name: '抗風',
Kind: '法術抗性'
};
this.mapAttribute['WindDefNeg'] = {
Name: '忽視抗風',
Kind: '法術增強'
};
this.mapAttribute['WindEhan'] = {
Name: '加強風系',
Kind: '法術增強'
};
this.mapAttribute['WindRageOdds'] = {
Name: '風系狂暴率',
Kind: '法術增強'
};
this.mapAttribute['AtkPercent'] = {
Name: '攻擊改變',
Kind: '物理屬性'
};
//----------------------------------
}
// ResetTimer(nValue) {
// let pSelf = this;
// clearInterval(this.m_timer);
// this.m_timer = setInterval(function () {
// pSelf.OnTimer();
// }, nValue);
// }
// OnTimer() { //50 毫秒一次
// this.nTimeIndex += 1;
// if (this.nTimeIndex % 20 == 0) // 降頻為 1 秒一次
// {
// // this.CheckAndDeleteNotice();
// //this.CheckAndDeleteRoleBroadCast();
// }
// // if (pScreenNoticeMgr) {
// // pScreenNoticeMgr.OnUpdate(this.nTimeIndex);
// // }
// }
runAnimation(runNode) {
runNode.active = false;
let url = 'ccbtex/panel/2251'
cc.loader.loadRes(url, cc.SpriteAtlas, function (error, atlas) {
if (error) {
cc.warn(`$警告:加載動畫資源錯誤:${url}`);
return;
}
if (!SKUIUtil.isValid(runNode)) {
return;
}
if (!atlas) {
return;
}
let curFrames = atlas.getSpriteFrames();
let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, 8);
curClip.name = 'run';
curClip.wrapMode = cc.WrapMode.Loop;
let nodeAni = runNode.getComponent(cc.Animation);
nodeAni.addClip(curClip);
nodeAni.play(curClip.name);
runNode.active = true;
});
}
BtnAnimation(btnNode1,btnNode2) {
btnNode1.active = false;
btnNode2.active = false;
let url = 'ccbtex/panel/2249'
cc.loader.loadRes(url, cc.SpriteAtlas, function (error, atlas) {
if (error) {
cc.warn(`$警告:加載動畫資源錯誤:${url}`);
return;
}
if (!SKUIUtil.isValid(btnNode1)) {
return;
}
if (!atlas) {
return;
}
let curFrames = atlas.getSpriteFrames();
let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, 12);
curClip.name = 'run';
curClip.wrapMode = cc.WrapMode.Normal;
let nodeAni = btnNode1.getComponent(cc.Animation);
nodeAni.addClip(curClip);
nodeAni.play(curClip.name);
btnNode1.active = true;
});
let url1 = 'ccbtex/panel/2250'
cc.loader.loadRes(url1, cc.SpriteAtlas, function (error, atlas) {
if (error) {
cc.warn(`$警告:加載動畫資源錯誤:${url1}`);
return;
}
if (!SKUIUtil.isValid(btnNode2)) {
return;
}
if (!atlas) {
return;
}
let curFrames = atlas.getSpriteFrames();
let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, 12);
curClip.name = 'run';
curClip.wrapMode = cc.WrapMode.Normal;
let nodeAni = btnNode2.getComponent(cc.Animation);
nodeAni.addClip(curClip);
nodeAni.play(curClip.name);
btnNode2.active = true;
});
}
CreateScreenNotice(strRichText, bInstertFront) {
pScreenNoticeMgr.AddNotice(strRichText, bInstertFront);
}
// CheckAndDeleteRoleBroadCast() {
// let nCurTime = this.GetTime();
// for (let nIndex in this.vecRoleBroadCast) {
// if (nCurTime >= this.vecRoleBroadCast[nIndex].nCreateTime + this.vecRoleBroadCast[nIndex].nLiveTime) {
// let goTmp = this.vecRoleBroadCast[nIndex];
// goTmp.goRoleBroadCast.destroy();
// this.vecRoleBroadCast.splice(nIndex, 1);
// }
// }
// }
CreateNpcNotice(nNpcConfigID, strText) {
let pNpcMgr = require('../game/NpcMgr');
let CSpeak = require('../game/Speak');
let pConfigInfo = pNpcMgr.GetNpcConfigInfo(nNpcConfigID);
if (null == pConfigInfo)
return;
let stSpeak = new CSpeak(pConfigInfo.nResID, strText, pConfigInfo.strName, 2);
this.CreateNpcTalk([stSpeak], null);
}
GetLevel(nExp) {
let nLen = this.vecExpLevel.length;
for (let nIndex = nLen - 1; nIndex >= 0; nIndex--) {
if (nExp >= this.vecExpLevel[nIndex]) {
let nCur = 0;
let nMax = 0;
if (nIndex == nLen - 1) {
nCur = this.vecExpLevel[nIndex];
nMax = this.vecExpLevel[nIndex];
} else {
nCur = nExp - this.vecExpLevel[nIndex];
nMax = this.vecExpLevel[nIndex + 1];
}
return {
nLevel: nIndex + 1,
nMax: nMax,
nCur: nCur
};
}
}
return {};
}
CreateSubNode(vParent, stPos, strPrefab, strName) {
let goItem = cc.instantiate(strPrefab);
goItem.parent = vParent;
goItem.name = strName;
goItem.setPosition(cc.v2(stPos.nX, stPos.nY));
return goItem;
}
CreateSubNodeByType(vParent, stPos, strPrefab, strName, type) {
let goItem = cc.instantiate(strPrefab);
goItem.parent = vParent;
goItem.name = strName;
goItem.opType = type;
goItem.setPosition(cc.v2(stPos.nX, stPos.nY));
return goItem;
}
isNumString(str) {
var regPos = /^\d+$/; //非負浮點數
if (regPos.test(str)) {
return true;
} else {
return false;
}
}
getWeaponName(equip) {
// console.log(equip)
let weaponname = '';
if (equip.type == 0) {
weaponname = '0000';
} //新手裝備
if (equip.type == 1) { //高級裝備
weaponname = '0100';
if (equip.level == 100 && equip.gemcnt >= 10) { //100級打滿寶石
weaponname = '0101';
} else if (equip.level == 120) { //120級
weaponname = '0200';
if (equip.gemcnt >= 12) { //打滿寶石
weaponname = '0202';
}
}
} else if (equip.type == 2) {
weaponname = '0300';
if (equip.gemcnt >= 13) {
weaponname = '0302';
} else if (equip.gemcnt >= 10) {
weaponname = '0301';
}
} else if (equip.type == 3) {
weaponname = '0400';
if (equip.level == 5)
weaponname = "0601"
else
if (equip.gemcnt >= 16) {
weaponname = '0501';
} else if (equip.gemcnt >= 13) {
weaponname = '0403';
} else if (equip.gemcnt >= 10) {
weaponname = '0401';
}
}
return weaponname;
}
addWeaponAnimation(weaponInfo, weaponNode, animationNode, logic, resid, act, dir, show = false) {
if (animationNode.name.length < 1) {
cc.log("?");
}
if (!animationNode || !weaponNode || GameUtil.roleName[resid] == null || animationNode.active == false) {
return;
}
let clips = weaponNode.getComponent(cc.Animation).getClips();
for (const clip of clips) {
if (clip.name == act) {
weaponNode.getComponent(cc.Animation).stop(act);
weaponNode.getComponent(cc.Animation).removeClip(clip, true);
}
}
weaponNode.active = false;
let weaponname = '0000';
if (weaponInfo.length > 0) {
weaponname = this.getWeaponName(JSON.parse(weaponInfo));
}
let url = `weapon/${resid}/${weaponname}_${act}_${dir}_wp`;
if (resid == 1111 && weaponname != '0601') {
url = `weapon/${resid}/${weaponname}_${act}_${dir}_wp_l`;
}
cc.loader.loadRes(url, cc.SpriteAtlas, function (error, atlas) {
if(error){
cc.error(error);
return;
}
if (!animationNode || !animationNode.parent || animationNode.parent.parent == null) return;
if (Array.isArray(atlas)) {
return;
}
if (GameModel.player.tResid != 0 && !show) return;
let curFrames = [];
for (let i = 1; ; i++) {
let frame = atlas.getSpriteFrame(i);
if (frame) curFrames.push(frame);
else break;
}
if (curFrames.length == 0)
curFrames = atlas.getSpriteFrames()
let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, 15);
curClip.name = act;
if (act == 'stand' || act == 'run') {
curClip.wrapMode = cc.WrapMode.Loop;
} else {
curClip.wrapMode = cc.WrapMode.Normal;
}
let nodeAni = weaponNode.getComponent(cc.Animation);
nodeAni.addClip(curClip);
nodeAni.play(act);
logic.scheduleOnce(() => {
if (SKUIUtil.isValid(animationNode)) {
weaponNode.scaleX = animationNode.width / weaponNode.width;
weaponNode.scaleY = animationNode.height / weaponNode.height;
}
}, 0);
weaponNode.active = true;
if (GameModel.conf_res_anchor[resid]) {
weaponNode.anchorY = GameModel.conf_res_anchor[resid].anchorY;
}
});
if (!animationNode.getChildByName('addon')) {
let addon = new cc.Node();
addon.parent = animationNode;
addon.addComponent(cc.Animation);
let addonsp = addon.addComponent(cc.Sprite);
addonsp.trim = false;
addonsp.sizeMode = cc.Sprite.SizeMode.RAW;
addon.name = 'addon';
}
let addonNode = animationNode.getChildByName('addon');
let addonclips = addonNode.getComponent(cc.Animation).getClips();
for (const clip of addonclips) {
if (clip.name == act) {
addonNode.getComponent(cc.Animation).stop(act);
addonNode.getComponent(cc.Animation).removeClip(clip, true);
}
}
addonNode.active = false;
//let addonname = weaponname.substr(0, 3) + '0';
let urls = `weapon/${resid}/${weaponname}_${act}_${dir}_wp_addon`;
if (resid == 1111 && weaponname != '0601') {
urls = `weapon/${resid}/${weaponname}_${act}_${dir}_wp_r`;
}
if (resid == 3006 && weaponname != '0601') {
urls = `weapon/${resid}/${weaponname}_${act}_${dir}_addon`;
}
cc.loader.loadRes(urls, cc.SpriteAtlas, function (err, atlas) {
if (!animationNode || !animationNode.parent || !animationNode.parent.parent == null) return;
if (Array.isArray(atlas)) {
return;
}
let addonani = addonNode.getComponent(cc.Animation);
let addonsp = addonNode.getComponent(cc.Sprite);
addonsp.spriteFrame = atlas.getSpriteFrame(0);
let addonFrames = [];
for (let i = 1; ; i++) {
let frame = atlas.getSpriteFrame(i);
if (frame) addonFrames.push(frame);
else break;
}
if (addonFrames.length == 0)
addonFrames = atlas.getSpriteFrames()
let curClip = cc.AnimationClip.createWithSpriteFrames(addonFrames, 15);
curClip.name = act;
if (act == 'stand' || act == 'run') {
curClip.wrapMode = cc.WrapMode.Loop;
} else {
curClip.wrapMode = cc.WrapMode.Normal;
}
addonani.addClip(curClip);
addonani.play(act);
logic.scheduleOnce(() => {
if (SKUIUtil.isValid(addonNode) && SKUIUtil.isValid(animationNode)) {
addonNode.scaleX = animationNode.width / addonNode.width;
addonNode.scaleY = animationNode.height / addonNode.height;
}
}, 0);
if (GameModel.conf_res_anchor[resid]) {
addonNode.anchorY = GameModel.conf_res_anchor[resid].anchorY;
} else
addonNode.anchorY = 0.4
addonNode.active = true;
});
}
CreateRole(nOnlyID, nResID, strName, nHP, nMP, stPos, vParent) {
let preRole = GameModel.role;
let goRole = this.CreateSubNode(vParent, stPos, preRole, 'BattleSoldier');
cc.find('name', goRole).getComponent(cc.Label).string = strName;
let comRole = goRole.getComponent('role');
comRole.onlyid = nOnlyID;
comRole.resid = nResID;
comRole.hp = nHP;
comRole.animationNode.anchorY = 0;
if (SKDataUtil.hasProperty(GameModel.conf_res_anchor, nResID)) {
comRole.animationNode.anchorY = GameModel.conf_res_anchor[nResID].anchorY;
}
comRole.resAtlas = GameRes.getRoleRes(nResID);
comRole.initAnimation();
return goRole;
}
CreateNpc(nOnlyID, nResID, strName, nHP, nMP, stPos, vParent) {
let preRole = GameModel.npc;
let goRole = this.CreateSubNode(vParent, stPos, preRole, 'BattleSoldier');
cc.find('name', goRole).getComponent(cc.Label).string = strName;
let comRole = goRole.getComponent('Npc');
if (SKDataUtil.hasProperty(GameModel.conf_res_anchor, nResID)) {
comRole.animationNode.anchorY = GameModel.conf_res_anchor[nResID].anchorY;
}
return goRole;
}
GetMapSum(mapTmp) {
let nNum = 0;
for (const it in mapTmp) {
nNum += mapTmp[it];
}
return nNum;
}
GetMapLen(mapTmp) {
let nCnt = 0;
for (let key in mapTmp) {
key;
nCnt++;
}
return nCnt;
}
CreateEventHandler(goNode, comName, strFunction, varParam) {
let varHandler = new cc.Component.EventHandler();
varHandler.target = goNode;
varHandler.component = comName;
varHandler.handler = strFunction;
varHandler.customEventData = varParam;
return varHandler;
}
FindAndDeleteNode(nodParent, strName) {
let nodTmp = nodParent.getChildByName(strName);
if (nodTmp != null)
nodTmp.destroy();
}
FindAndHidenNode(nodParent, stPos) {
let nodTmp = nodParent.getChildByName("TalkUI");
if (nodTmp == null) {
nodTmp = this.CreateSubNode(nodParent, {
nX: 0,
nY: 0
}, GameModel.talkUI, "TalkUI");
}
nodTmp.setPosition(cc.v2(stPos.nX, stPos.nY));
nodTmp.zIndex = 1;
return nodTmp;
}
NumToString(nNum, nLen) {
return (Array(nLen).join(0) + nNum).slice(-nLen);
}
CreateSubFrame(vParent, stPos, strPrefab, strClipName, callback) {
let goEffectFrame = this.CreateSubNode(vParent, {
nX: stPos.nX,
nY: stPos.nY
}, strPrefab, '');
SKUIUtil.loadAtlasAni("effect", strClipName, (clip) => {
if (!SKUIUtil.isValid(goEffectFrame)) {
cc.warn(`$警告:創建幀動畫節點無效${strClipName}`);
} else {
clip.name = strClipName;
clip.wrapMode = cc.WrapMode.Normal; //循環播放
let effect = goEffectFrame.getComponent('Effect');
effect.CreateAndPlayAnimation(clip, callback);
}
});
}
CreateSubFrame1(vParent, stPos, strPrefab, strClipName, callback) {
let goEffectFrame = this.CreateSubNode(vParent, {
nX: stPos.nX,
nY: stPos.nY
}, strPrefab, '');
SKUIUtil.loadAtlasAni("buff", strClipName, (clip) => {
if (!SKUIUtil.isValid(goEffectFrame)) {
cc.warn(`$警告:創建幀動畫節點無效${strClipName}`);
} else {
clip.name = strClipName;
clip.wrapMode = cc.WrapMode.Normal; //循環播放
let effect = goEffectFrame.getComponent('Effect');
effect.CreateAndPlayAnimation(clip, callback);
}
});
}
CreateSubFrameBoom(vParent, stPos, strPrefab, strClipName, callback) {
let goEffectFrame = this.CreateSubNode(vParent, {
nX: stPos.nX,
nY: stPos.nY
}, strPrefab, '');
SKUIUtil.loadAtlasAni("buff", strClipName, (clip) => {
if (!SKUIUtil.isValid(goEffectFrame)) {
cc.warn(`$警告:創建幀動畫節點無效${strClipName}`);
} else {
clip.name = strClipName;
clip.wrapMode = cc.WrapMode.Normal; //循環播放
let effect = goEffectFrame.getComponent('Effect');
effect.CreateAndPlayAnimation(clip, callback);
}
});
}
CreateSubFrameLoop(vParent, stPos, strPrefab, strClipName) {
let goEffectFrame = this.CreateSubNode(vParent, {
nX: stPos.nX,
nY: stPos.nY
}, strPrefab, '');
SKUIUtil.loadAtlasAni("effect", strClipName, (clip) => {
if (!SKUIUtil.isValid(goEffectFrame)) {
cc.warn(`$警告:創建幀循環節點無效${strClipName}`);
} else {
clip.name = strClipName;
clip.wrapMode = cc.WrapMode.Loop; //循環播放
let effect = goEffectFrame.getComponent('Effect');
effect.CreateAndPlayAnimation(clip);
}
});
return goEffectFrame;
}
CreateNpcTalk(vecSpeak, pCallBack) {
if (vecSpeak.length <= 0) {
if (pCallBack)
pCallBack();
return;
}
let goTalkUI = this.FindAndHidenNode(cc.find('Canvas/MainUI'), {
nX: 0,
nY: -188
});
goTalkUI.getComponent('Talk').Init(vecSpeak, pCallBack);
}
//spine骨骼動畫
SetSpineAvatar(nodSpine, nodAvatar, nResID, nodDragonBone) {
nodSpine.active = false;
nodDragonBone.active = false;
if (nodAvatar) nodAvatar.active = false;
cc.loader.loadResDir(`spineres/${nResID}`, function (err, assets){
if (err != null || nodSpine.isValid == false)
return;
if (assets.length > 0) {
nodSpine.active = true;
let spineRes = {};
for (let i = 0; i < assets.length; i++) {
if (assets[i] instanceof sp.SkeletonData) {
spineRes.spineAsset = assets[i];
}
}
//展現
let t = nodSpine.getComponent(sp.Skeleton);
let oldAnimationName = null;
if(t){
oldAnimationName = t.animation;
}
if(nResID == 6140 || nResID == 6141 || nResID == 6142 ){
oldAnimationName = "idle";
}
nodSpine.removeComponent(sp.Skeleton);
let comArmatureDisplay = nodSpine.addComponent(sp.Skeleton);
comArmatureDisplay.skeletonData = null;
comArmatureDisplay.skeletonData = spineRes.spineAsset;
//comArmatureDisplay.setSkin = 'default';
if(oldAnimationName){
comArmatureDisplay.setAnimation(0, oldAnimationName, true);
}
} else {
if (nodAvatar == null)
return;
cc.loader.loadResDir(`ui/photo/${nResID}`, cc.SpriteFrame, (e, frame) => {
nodAvatar.active = true;
nodAvatar.getComponent(cc.Sprite).spriteFrame = frame[0];
})
}
});
}
//龍骨動畫
SetDragonBoneAvatar(nodDragonBone, nodAvatar, nResID, nodSpine) {
nodDragonBone.active = false;
nodSpine.active = false;
if (nodAvatar) nodAvatar.active = false;
cc.loader.loadResDir(`dragonbone/${nResID}`, function (err, assets){
if (err != null || nodDragonBone.isValid == false)
return;
if (assets.length > 0) {
nodDragonBone.active = true;
let dragonRes = {};
for (let i = 0; i < assets.length; i++) {
if (assets[i] instanceof dragonBones.DragonBonesAsset) {
dragonRes.dragonAsset = assets[i];
}
if (assets[i] instanceof dragonBones.DragonBonesAtlasAsset) {
dragonRes.dragonAtlasAsset = assets[i];
}
}
//展現
let t = nodDragonBone.getComponent(dragonBones.ArmatureDisplay);
let oldAnimationName = null;
if(t){
oldAnimationName = t.animationName;
}
nodDragonBone.removeComponent(dragonBones.ArmatureDisplay);
let comArmatureDisplay = nodDragonBone.addComponent(dragonBones.ArmatureDisplay);
// cc.sys.isNative && comArmatureDisplay._factory.clear(false); //在手機上加載相同的資源會出現閃退
comArmatureDisplay.dragonAsset = null;
comArmatureDisplay.dragonAtlasAsset = null;
comArmatureDisplay.dragonAsset = dragonRes.dragonAsset;
comArmatureDisplay.dragonAtlasAsset = dragonRes.dragonAtlasAsset;
comArmatureDisplay.armatureName = 'armatureName';
if(oldAnimationName){
comArmatureDisplay.playAnimation(oldAnimationName, 0);
}
} else {
if (nodAvatar == null)
return;
cc.loader.loadResDir(`ui/photo/${nResID}`, cc.SpriteFrame, (e, frame) => {
nodAvatar.active = true;
nodAvatar.getComponent(cc.Sprite).spriteFrame = frame[0];
})
}
});
}
//spine骨骼動畫(扩展一个)
SetSpineAvatars(nodSpine, nodAvatar, nResID) {
nodSpine.active = false;
if (nodAvatar) nodAvatar.active = false;
cc.loader.loadResDir(`spineres/${nResID}`, function (err, assets){
if (err != null || nodSpine.isValid == false)
return;
if (assets.length > 0) {
nodSpine.active = true;
let spineRes = {};
for (let i = 0; i < assets.length; i++) {
if (assets[i] instanceof sp.SkeletonData) {
spineRes.spineAsset = assets[i];
}
}
//console.log('dragonRes.dragonAsset9999999', dragonRes.dragonAsset);
//展現
let t = nodSpine.getComponent(sp.Skeleton);
let oldAnimationName = null;
if(t){
oldAnimationName = t.animation;
}
nodSpine.removeComponent(sp.Skeleton);
let comArmatureDisplay = nodSpine.addComponent(sp.Skeleton);
// cc.sys.isNative && comArmatureDisplay._factory.clear(false); //在手機上加載相同的資源會出現閃退
comArmatureDisplay.skeletonData = null;
comArmatureDisplay.skeletonData = spineRes.spineAsset;
//comArmatureDisplay.setSkin = 'default';
if(oldAnimationName){
comArmatureDisplay.setAnimation(0, oldAnimationName, true);
}
} else {
if (nodAvatar == null)
return;
cc.loader.loadResDir(`ui/photo/${nResID}`, cc.SpriteFrame, (e, frame) => {
nodAvatar.active = true;
nodAvatar.getComponent(cc.Sprite).spriteFrame = frame[0];
})
}
});
}
//龍骨動畫(扩展一个)
SetDragonBoneAvatars(nodDragonBone, nodAvatar, nResID) {
nodDragonBone.active = false;
if (nodAvatar) nodAvatar.active = false;
cc.loader.loadResDir(`dragonbone/${nResID}`, function (err, assets){
if (err != null || nodDragonBone.isValid == false)
return;
if (assets.length > 0) {
nodDragonBone.active = true;
let dragonRes = {};
for (let i = 0; i < assets.length; i++) {
if (assets[i] instanceof dragonBones.DragonBonesAsset) {
dragonRes.dragonAsset = assets[i];
}
if (assets[i] instanceof dragonBones.DragonBonesAtlasAsset) {
dragonRes.dragonAtlasAsset = assets[i];
}
}
//展現
let t = nodDragonBone.getComponent(dragonBones.ArmatureDisplay);
let oldAnimationName = null;
if(t){
oldAnimationName = t.animationName;
}
nodDragonBone.removeComponent(dragonBones.ArmatureDisplay);
let comArmatureDisplay = nodDragonBone.addComponent(dragonBones.ArmatureDisplay);
// cc.sys.isNative && comArmatureDisplay._factory.clear(false); //在手機上加載相同的資源會出現閃退
comArmatureDisplay.dragonAsset = null;
comArmatureDisplay.dragonAtlasAsset = null;
comArmatureDisplay.dragonAsset = dragonRes.dragonAsset;
comArmatureDisplay.dragonAtlasAsset = dragonRes.dragonAtlasAsset;
comArmatureDisplay.armatureName = 'armatureName';
if(oldAnimationName){
comArmatureDisplay.playAnimation(oldAnimationName, 0);
}
} else {
if (nodAvatar == null)
return;
cc.loader.loadResDir(`ui/photo/${nResID}`, cc.SpriteFrame, (e, frame) => {
nodAvatar.active = true;
nodAvatar.getComponent(cc.Sprite).spriteFrame = frame[0];
})
}
});
}
GetRaceFileName(nRace) {
if (nRace == 1)
return 'ui_common_icon_race1';
if (nRace == 2)
return 'ui_common_icon_race3';
if (nRace == 3)
return 'ui_common_icon_race2';
if (nRace == 4)
return 'ui_common_icon_race4';
if (nRace == 5)
return 'ui_common_icon_race5';
}
DestroyVecNode(vecNod) {
for (let item of vecNod) {
if (item) {
item.destroy();
}
}
vecNod.length = 0;
}
FindAndDoUIFunction(strUI, strFun, stData) {
let strPath = `Canvas/MainUI/${strUI}`;
let goUI = cc.find(strPath);
if (null == goUI)
return;
let comUI = goUI.getComponent(strUI);
if (null == comUI)
return;
comUI[strFun](stData);
}
CreateRoleBroadCast(goRole, strMsg) {
if (null == strMsg || '' == strMsg)
return;
let goRoleBroadCast = this.CreateSubNode(goRole, {
nX: -120,
nY: 200
}, GameModel.preRoleBrodcast, 'preRoleBrodcast');
cc.find('Label', goRoleBroadCast).getComponent(cc.Label).string = strMsg;
// this.vecRoleBroadCast.push({ goRoleBroadCast: goRoleBroadCast, nCreateTime: this.GetTime(), nLiveTime: 3 });
goRoleBroadCast.runAction(cc.sequence(cc.delayTime(3), cc.removeSelf()));
}
CreateRoleEmojBroadCast(goRole, strMsg, emojiAtlas) {
if (null == strMsg || '' == strMsg)
return;
let goRoleBroadCast = this.CreateSubNode(goRole, {
nX: -120,
nY: 200
}, GameModel.preRoleBrodcast, 'preRoleBrodcast');
//cc.find('Label', goRoleBroadCast).getComponent(cc.Label).string = strMsg;
let chatItem = new cc.Node();
chatItem.parent = goRoleBroadCast;
let richText = chatItem.addComponent('CustomRichText');
richText.maxWidth = 259;
richText.fontSize = 20;
richText.lineHeight = 22;
richText.type = 1;
richText.scale = -1;
richText.emojiAtlas = emojiAtlas;
richText.string = strMsg;
richText.strColor = cc.Color.WHITE;
chatItem.x = 0;
chatItem.color = cc.color(200, 0, 0, 255);
chatItem.parent = goRoleBroadCast;
chatItem.name = 'emojBroadCast';
//chatItem.setPosition(cc.v2(stPos.nX, stPos.nY));
chatItem.y = 0;
// this.vecRoleBroadCast.push({ goRoleBroadCast: goRoleBroadCast, nCreateTime: this.GetTime(), nLiveTime: 3 });
goRoleBroadCast.runAction(cc.sequence(cc.delayTime(3), cc.removeSelf()));
}
GetRole() {
return cc.find('Canvas/MapUI').getComponent('GameMapLogic').myRole;
}
ChangeTeamButtonState(vecButton, strAtlas, strDarkFrame, strLightFrame, nCurBtn) {
for (var it in vecButton) {
if (it != nCurBtn) {
SKUIUtil.setSpriteFrame(vecButton[it], strAtlas, strDarkFrame);
} else {
SKUIUtil.setSpriteFrame(vecButton[it], strAtlas, strLightFrame);
}
}
}
ChangeTeamNodeState(vecNode, nCurNode) {
for (var it in vecNode) {
vecNode[it].active = it == nCurNode ? true : false;
}
}
GetTime() {
let nTime = Math.floor(Date.parse(new Date()) / 1000);
let nLocalTime = nTime + 28800;
return nLocalTime;
}
GetAttributeName(strKey) {
let result = "";
if (SKDataUtil.hasProperty(this.mapAttribute, strKey)) {
result = this.mapAttribute[strKey].Name;
}
return result;
}
GetAttributeType(strKey) {
let result = "";
if (SKDataUtil.hasProperty(this.mapAttribute, strKey)) {
result = this.mapAttribute[strKey].Kind;
}
return result;
}
ChangeNumToRange(fData, fMin, fMax) {
fData = Math.max(fData, fMin);
fData = Math.min(fData, fMax);
return fData;
}
GetDistance(stPosA, stPosB) {
let nXDis = Math.abs(stPosA.x - stPosB.x);
let nYDis = Math.abs(stPosA.y - stPosB.y);
let nDis = Math.pow(nXDis * nXDis + nYDis * nYDis, 0.5);
return nDis;
}
GetMapDataByIndex(mapData, nIndex) {
if (nIndex < 0 || nIndex >= this.GetMapLen(mapData))
return null;
let nCnt = -1;
for (let it in mapData) {
nCnt++;
if (nCnt == nIndex)
return mapData[it];
}
return null;
}
IsDataInVecter(stData, vecData) {
for (let it in vecData) {
if (stData == vecData[it])
return true;
}
return false;
}
GetDefault(stData, stDefault) {
if (typeof stData == "undefined")
return stDefault;
return stData;
}
GetTaskTalkList(nTaskID, nStep) {
let vecTmp = [];
let CSpeak = require('./Speak');
let pNpcMgr = require('./NpcMgr');
let pTaskConfigMgr = require('./task_config').g_pTaskConfigMgr;
let stStep = pTaskConfigMgr.GetTaskStepInfo(nTaskID, nStep);
if (!stStep) {
return vecTmp;
}
for (let stData of stStep.vecSpeak) {
if (!stData.nValue) {
cc.warn("$警告:對話內容不能為空");
stData.nValue = "...";
}
let nSpeakerResID = 0;
let strSpeaderName = '';
let nPosType = 1;
if (stData.nKey > 0) { //Npc說話
let stConfigInfo = pNpcMgr.GetNpcConfigInfo(stData.nKey);
console.log(stData)
console.log(stConfigInfo)
nSpeakerResID = stConfigInfo.nResID;
strSpeaderName = stConfigInfo.strName;
nPosType = 2;
} else { //主角說話
nSpeakerResID = GameModel.player.resid;
strSpeaderName = GameModel.player.name;
nPosType = 1;
}
let stSpead = new CSpeak(nSpeakerResID, stData.nValue, strSpeaderName, nPosType);
// console.log(nSpeakerResID, stData.nValue, strSpeaderName, nPosType)
vecTmp.push(stSpead);
}
return vecTmp;
}
SetPrizeIcon(goPrizeIcon, strItem) {
if (strItem == 'exp') {
SKUIUtil.setSpriteFrame(goPrizeIcon, 'Common/ui_common', 'ui_common_icon_exp');
} else if (strItem == 'petexp') {
SKUIUtil.setSpriteFrame(goPrizeIcon, 'Common/ui_common', 'ui_common_icon_exppet');
} else if (strItem == 'money') {
if (goPrizeIcon) {
let sprite = goPrizeIcon.getComponent(cc.Sprite);
if (sprite) {
sprite.spriteFrame = ItemUtil.getItemIcon(9001);
} else {
cc.warn(`$警告:價值圖標異常${strItem}`);
}
} else {
cc.warn(`$警告:價值圖標異常${strItem}`);
}
} else {
let stConfigInfo = ItemUtil.getItemData(strItem);
if (goPrizeIcon) {
let sprite = goPrizeIcon.getComponent(cc.Sprite);
if (sprite) {
sprite.spriteFrame = ItemUtil.getItemIconBy(stConfigInfo);
} else {
cc.warn(`$警告:價值圖標異常${strItem}`);
}
} else {
cc.warn(`$警告:價值圖標異常${strItem}`);
}
}
}
SetMaskAnimation(goAnim, nResID, strClipName) {
goAnim.active = false;
let url = `shape_mask/${nResID}/${strClipName}`;
cc.loader.loadRes(url, cc.SpriteAtlas, function (error, atlas) {
if (error) {
cc.warn(`$警告:加載資源${url}失敗!`);
return;
}
if (!SKUIUtil.isValid(goAnim)) {
return;
}
goAnim.active = true;
let curFrames = atlas.getSpriteFrames();
let fn = 10;
if(nResID <= 4038){
fn = 15;
}
let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, fn);
curClip.name = strClipName;
curClip.wrapMode = cc.WrapMode.Loop;
let nodeAni = goAnim.getComponent(cc.Animation);
if (nodeAni) {
nodeAni.addClip(curClip);
nodeAni.play(curClip.name);
}
let anchorY = 0.4;
let anchorX = 0.5;
if (SKDataUtil.hasProperty(GameModel.conf_res_anchor, nResID)) {
anchorY = GameModel.conf_res_anchor[nResID].anchorY;
anchorX = GameModel.conf_res_anchor[nResID].anchorX;
}
goAnim.anchorY = anchorY;
goAnim.anchorX = anchorX;
});
}
SetAnimation(goAnim, nResID, strClipName) {
goAnim.active = false;
let url = `shap/${nResID}/${strClipName}`;
cc.loader.loadRes(url, cc.SpriteAtlas, function (error, atlas) {
if (error) {
cc.warn(`$警告:加載資源${url}失敗!`);
return;
}
if (!SKUIUtil.isValid(goAnim)) {
return;
}
goAnim.active = true;
let curFrames = atlas.getSpriteFrames();
let fn = 10;
if(nResID <= 4038){
fn = 15;
}
let curClip = cc.AnimationClip.createWithSpriteFrames(curFrames, fn);
curClip.name = strClipName;
curClip.wrapMode = cc.WrapMode.Loop;
let nodeAni = goAnim.getComponent(cc.Animation);
if (nodeAni) {
nodeAni.addClip(curClip);
nodeAni.play(curClip.name);
}
let anchorY = 0.4;
let anchorX = 0.5;
if (SKDataUtil.hasProperty(GameModel.conf_res_anchor, nResID)) {
anchorY = GameModel.conf_res_anchor[nResID].anchorY;
anchorX = GameModel.conf_res_anchor[nResID].anchorX;
}
goAnim.anchorY = anchorY;
goAnim.anchorX = anchorX;
});
}
initLongTouchBtn(btn, callback, param) {
btn.on(cc.Node.EventType.TOUCH_START, () => {
if (this.btntimer.timer != null) {
return;
}
this.btntimer.timer = setInterval(() => {
this.btntimer.times++;
if (this.btntimer.times >= this.btntimer.step) {
this.btntimer.times = 0;
this.btntimer.step = this.btntimer.step / 2;
if (this.btntimer.step < 1) {
this.btntimer.step = 1;
}
callback(param);
}
}, 50);
callback(param);
});
let cancelfunc = () => {
clearInterval(this.btntimer.timer);
this.btntimer.timer = null;
this.btntimer.times = 0;
this.btntimer.step = 20;
};
btn.on(cc.Node.EventType.TOUCH_CANCEL, cancelfunc);
btn.on(cc.Node.EventType.TOUCH_END, cancelfunc);
}
}
let g_ctFunctionInstance = null;
module.exports = (() => {
if (g_ctFunctionInstance == null) {
g_ctFunctionInstance = new CPubFunction();
}
return g_ctFunctionInstance;
})();