884 lines
31 KiB
JavaScript
884 lines
31 KiB
JavaScript
|
|
"use strict";
|
|||
|
|
cc._RF.push(module, 'f0aceSvUh9H3pEhpfGg4ahd', 'utils');
|
|||
|
|
// Scripts/util/utils.js
|
|||
|
|
|
|||
|
|
"use strict";
|
|||
|
|
|
|||
|
|
var _require = require("define"),
|
|||
|
|
WinType = _require.WinType,
|
|||
|
|
PlayerAction = _require.PlayerAction;
|
|||
|
|
|
|||
|
|
// 工具类的全局
|
|||
|
|
window.Utils = {
|
|||
|
|
_effect_once_playing: false,
|
|||
|
|
_effect_once_last: null,
|
|||
|
|
_effect_once_list: null,
|
|||
|
|
keyfind: function keyfind(key, val, arr) {
|
|||
|
|
for (var i = 0, n = arr.length; i < n; i++) {
|
|||
|
|
if (arr[i][key] == val) {
|
|||
|
|
return arr[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
},
|
|||
|
|
randomNum: function randomNum(min, max) {
|
|||
|
|
if (max > min) {
|
|||
|
|
return Math.round(Math.random() * (max - min)) + min;
|
|||
|
|
} else {
|
|||
|
|
return min;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
randomStr: function randomStr(min, max, strRange) {
|
|||
|
|
var n = this.randomNum(min, max);
|
|||
|
|
strRange = strRange || '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|||
|
|
var str = "";
|
|||
|
|
var len = strRange.length;
|
|||
|
|
for (var i = 0; i < n; i++) {
|
|||
|
|
var pos = this.randomNum(1, len) - 1;
|
|||
|
|
str += strRange.charAt(pos);
|
|||
|
|
}
|
|||
|
|
return str;
|
|||
|
|
},
|
|||
|
|
TI18N: function TI18N(str) {
|
|||
|
|
return str;
|
|||
|
|
},
|
|||
|
|
// 获取单位配置
|
|||
|
|
getUnitConfig: function getUnitConfig(id) {
|
|||
|
|
return gunitdata("data_unit", id) || gunitdata("data_unit1", id) || gunitdata("data_unit2", id) || gunitdata("data_unit3", id); //gdata( "unit_data", id, false) || gdata( "unit_data1", id, false) || gdata("unit_data2", id)|| gdata("unit_data3", id)
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 获取物品配置数据
|
|||
|
|
getItemConfig: function getItemConfig(id) {
|
|||
|
|
return gitemdata(id); //gdata( "item_data", "data_unit1", id, false ) || gdata( "item_data", "data_unit2", id, false ) || gdata( "item_data", "data_unit3", id, false ) || gdata( "item_data", "data_unit4", id, false ) || gdata( "item_data", "data_unit5", id, false )
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 拼key
|
|||
|
|
getNorKey: function getNorKey() {
|
|||
|
|
var key = "";
|
|||
|
|
for (var index = 0; index < arguments.length; index++) {
|
|||
|
|
var element = index < 0 || arguments.length <= index ? undefined : arguments[index];
|
|||
|
|
if (key != "") {
|
|||
|
|
key = key + "_";
|
|||
|
|
}
|
|||
|
|
key = key + element;
|
|||
|
|
}
|
|||
|
|
return key;
|
|||
|
|
},
|
|||
|
|
isEmpty: function isEmpty(obj) {
|
|||
|
|
for (var objIndex in obj) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
},
|
|||
|
|
//返回数组或对象的下一个索引值
|
|||
|
|
//(实际只能用来判断是否为空,不能用来循环获取索引值)
|
|||
|
|
next: function next(arr) {
|
|||
|
|
for (var k in arr) {
|
|||
|
|
if (arr[k] != null) {
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
},
|
|||
|
|
// 多元素小到大
|
|||
|
|
tableLowerSorter: function tableLowerSorter(array) {
|
|||
|
|
return function (a, b) {
|
|||
|
|
if (a == null || b == null) {
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
for (var index = 0; index < array.length; index++) {
|
|||
|
|
var element = array[index];
|
|||
|
|
if (a[element] == null || b[element] == null) {
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
if (a[element] != b[element]) {
|
|||
|
|
return a[element] - b[element];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return 1;
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
// 多元素从大到小
|
|||
|
|
tableUpperSorter: function tableUpperSorter(array) {
|
|||
|
|
return function (a, b) {
|
|||
|
|
if (a == null || b == null) {
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
for (var index = 0; index < array.length; index++) {
|
|||
|
|
var element = array[index];
|
|||
|
|
if (a[element] == null || b[element] == null) {
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
if (a[element] != b[element]) {
|
|||
|
|
return b[element] - a[element];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return -1;
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
/*按需排序
|
|||
|
|
temp_tab 需要比较的表项中的多个key值,用于多参数的比较
|
|||
|
|
temp_tab = {{"参数名字", true}, {"参数名字", false}...}
|
|||
|
|
--true 表示 大到小 false 表示 小到大 */
|
|||
|
|
tableCommonSorter: function tableCommonSorter(temp_tab) {
|
|||
|
|
return function (a, b) {
|
|||
|
|
if (a == null || b == null) {
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
for (var i = 0; i < temp_tab.length; i++) {
|
|||
|
|
var element = temp_tab[i];
|
|||
|
|
if (a[element[0]] == null || b[element[0]] == null) {
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
var is_sort = element[1] || false;
|
|||
|
|
if (is_sort) {
|
|||
|
|
if (a[element[0]] != b[element[0]]) {
|
|||
|
|
return b[element[0]] - a[element[0]];
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
if (a[element[0]] != b[element[0]]) {
|
|||
|
|
return a[element[0]] - b[element[0]];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return -1;
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
// 创建一个需要require的类
|
|||
|
|
createClass: function createClass(window_name, any) {
|
|||
|
|
if (window_name == null || window_name == "") {
|
|||
|
|
cc.error("创建窗体失败,没有给具体名字 ========>>");
|
|||
|
|
}
|
|||
|
|
var WindowClass = require(window_name);
|
|||
|
|
return new WindowClass(any);
|
|||
|
|
},
|
|||
|
|
/**
|
|||
|
|
* 播放一次特效,临时创建一个节点数据,播放完特效之后移除
|
|||
|
|
* @param {*} effect_name 特效资源名
|
|||
|
|
* @param {*} x 坐标X
|
|||
|
|
* @param {*} y 坐标Y
|
|||
|
|
* @param {*} parent 父节点
|
|||
|
|
* @param {*} finish_call 播放完的回调
|
|||
|
|
* @param {*} action_name 播放动作,默认为action
|
|||
|
|
* @param {*} scale 缩放比,理论上不需要设置
|
|||
|
|
*/
|
|||
|
|
playEffectOnce: function playEffectOnce(effect_id, effect_name, x, y, parent, finish_call, action, sc) {
|
|||
|
|
if (parent == null) return;
|
|||
|
|
var action_name = action || PlayerAction.action;
|
|||
|
|
var scale = sc || 1;
|
|||
|
|
// 创建临时的节点
|
|||
|
|
var node = new cc.Node("once_effect");
|
|||
|
|
node.setAnchorPoint(0.5, 0.5);
|
|||
|
|
if (scale != 1) {
|
|||
|
|
node.scale = scale;
|
|||
|
|
}
|
|||
|
|
node.setPosition(x, y);
|
|||
|
|
parent.addChild(node);
|
|||
|
|
var effect_spine = node.addComponent(sp.Skeleton);
|
|||
|
|
var res_path = PathTool.getSpinePath(effect_id, effect_name, false);
|
|||
|
|
|
|||
|
|
// 监听事件
|
|||
|
|
effect_spine.setCompleteListener(function (trackEntry, loopCount) {
|
|||
|
|
var animationName = trackEntry.animation ? trackEntry.animation.name : "";
|
|||
|
|
if (animationName == action_name) {
|
|||
|
|
node.removeFromParent();
|
|||
|
|
nx.dt.fnInvoke(finish_call, true);
|
|||
|
|
}
|
|||
|
|
}.bind(this));
|
|||
|
|
|
|||
|
|
// 加载资源
|
|||
|
|
cc.loader.loadRes(res_path, sp.SkeletonData, function (err, obj) {
|
|||
|
|
if (err) {
|
|||
|
|
nx.dt.fnInvoke(finish_call, true);
|
|||
|
|
node.removeFromParent();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
effect_spine.skeletonData = obj;
|
|||
|
|
effect_spine.setAnimation(0, action_name, false);
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
//计算字符串长度,汉字算两个长度
|
|||
|
|
//(如果汉字算一个长度,直接string.length可以获得)
|
|||
|
|
getByteLen: function getByteLen(val) {
|
|||
|
|
var len = 0;
|
|||
|
|
for (var i = 0; i < val.length; i++) {
|
|||
|
|
var a = val.charAt(i);
|
|||
|
|
if (a.match(/[^\x00-\xff]/ig) != null) {
|
|||
|
|
len += 2;
|
|||
|
|
} else {
|
|||
|
|
len += 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return len;
|
|||
|
|
},
|
|||
|
|
//按钮置灰,并关闭事件,btn:cc.Button, bool:true是变灰
|
|||
|
|
setGreyButton: function setGreyButton(btn, bool) {
|
|||
|
|
if (bool == null) bool = true;
|
|||
|
|
if (btn) {
|
|||
|
|
btn.interactable = !bool;
|
|||
|
|
btn.enableAutoGrayEffect = bool;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
getTimeInterval: function getTimeInterval(time_stamp) {
|
|||
|
|
if (!(time_stamp >= 0)) return;
|
|||
|
|
var srver_time = client.socket.getTime();
|
|||
|
|
return time_stamp - srver_time;
|
|||
|
|
},
|
|||
|
|
// 将秒转为标准时间, 参数:秒数, 是否加0
|
|||
|
|
changeIntevalToDate: function changeIntevalToDate(secondNum, n_addo) {
|
|||
|
|
if (!(secondNum >= 0)) return;
|
|||
|
|
var daySecond = 24 * 60 * 60;
|
|||
|
|
var hourSecond = 60 * 60;
|
|||
|
|
var day = Math.floor(secondNum / daySecond);
|
|||
|
|
var remainSecondM = secondNum % daySecond;
|
|||
|
|
var hour = Math.floor(remainSecondM / hourSecond);
|
|||
|
|
var remainSecondS = remainSecondM % hourSecond;
|
|||
|
|
var minute = Math.floor(remainSecondS / 60);
|
|||
|
|
var second = Math.ceil(remainSecondS % 60);
|
|||
|
|
if (n_addo) {
|
|||
|
|
return {
|
|||
|
|
D: day,
|
|||
|
|
H: hour,
|
|||
|
|
M: minute,
|
|||
|
|
S: second
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
var add0 = function add0(m) {
|
|||
|
|
return m < 10 ? '0' + m : m;
|
|||
|
|
};
|
|||
|
|
return {
|
|||
|
|
D: day,
|
|||
|
|
H: add0(hour),
|
|||
|
|
M: add0(minute),
|
|||
|
|
S: add0(second)
|
|||
|
|
};
|
|||
|
|
},
|
|||
|
|
//-----------------------moneytool---start-------------//
|
|||
|
|
//转换金钱格式
|
|||
|
|
getMoneyString: function getMoneyString(value, is_symbol, isFixed) {
|
|||
|
|
if (is_symbol == null) is_symbol = true;
|
|||
|
|
if (value == null) return 0;
|
|||
|
|
|
|||
|
|
// if(value < 1000){
|
|||
|
|
if (value < 100000) {
|
|||
|
|
if (is_symbol) return this.moneyFormat(value);else return value;
|
|||
|
|
} else if (value < 1000000 && value >= 1000) {
|
|||
|
|
value = Utils.moneyFormat2(value, isFixed); // Math.floor( value * 0.001 );
|
|||
|
|
if (is_symbol) return cc.js.formatStr(this.moneyFormat(value), "K");else return cc.js.formatStr(value, "K");
|
|||
|
|
} else if (value < 1000000000 && value >= 1000000) {
|
|||
|
|
var fix2 = 1;
|
|||
|
|
if (!isFixed) {
|
|||
|
|
fix2 = 1;
|
|||
|
|
}
|
|||
|
|
value = Utils.moneyFormat2(value, fix2); // value = Math.floor( value * 0.0001 );
|
|||
|
|
if (is_symbol) return cc.js.formatStr(this.moneyFormat(value), "M");else return cc.js.formatStr(value, "M");
|
|||
|
|
} else {
|
|||
|
|
value = Utils.moneyFormat2(value, 1); //value = Math.floor( value * 0.000001 );//00000001
|
|||
|
|
if (is_symbol) return cc.js.formatStr(this.moneyFormat(value), "B");else return cc.js.formatStr(value, "B");
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
moneyFormat2: function moneyFormat2(value, index) {
|
|||
|
|
if (index === void 0) {
|
|||
|
|
index = 1;
|
|||
|
|
}
|
|||
|
|
var base = 1000;
|
|||
|
|
var truevalue = value;
|
|||
|
|
while (truevalue >= base) {
|
|||
|
|
truevalue = truevalue / base;
|
|||
|
|
}
|
|||
|
|
if (index != 3) {
|
|||
|
|
truevalue = truevalue.toFixed(2);
|
|||
|
|
}
|
|||
|
|
return truevalue;
|
|||
|
|
},
|
|||
|
|
//价钱里面加上逗号
|
|||
|
|
moneyFormat: function moneyFormat(value) {
|
|||
|
|
var sign = "";
|
|||
|
|
if (value < 0) {
|
|||
|
|
sign = "-";
|
|||
|
|
value = value * -1;
|
|||
|
|
}
|
|||
|
|
if (value < 1000) return String(value);
|
|||
|
|
var arr = this.moneySplit(String(value), "");
|
|||
|
|
var n = arr.length;
|
|||
|
|
var i = n % 3;
|
|||
|
|
if (i == 0) {
|
|||
|
|
i = 4;
|
|||
|
|
}
|
|||
|
|
while (i < n) {
|
|||
|
|
arr.splice(i, 0, ",");
|
|||
|
|
i = i + 4;
|
|||
|
|
n = n + 1;
|
|||
|
|
}
|
|||
|
|
return sign + this.Join(arr, "");
|
|||
|
|
},
|
|||
|
|
moneySplit: function moneySplit(source_str, split_str) {
|
|||
|
|
if (split_str.length == 0) {
|
|||
|
|
var arr = [];
|
|||
|
|
for (var i = 0; i < source_str.length; i++) {
|
|||
|
|
arr.push(source_str.substring(i, i + 1));
|
|||
|
|
}
|
|||
|
|
return arr;
|
|||
|
|
} else {
|
|||
|
|
return this.Split(source_str, split_str);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
//-----------------------moneytool---end-------------//
|
|||
|
|
|
|||
|
|
// 以某个分隔符为标准,分割字符串
|
|||
|
|
// @param split_string 需要分割的字符串
|
|||
|
|
// @param splitter 分隔符
|
|||
|
|
// @return 用分隔符分隔好的table
|
|||
|
|
Split: function Split(split_string, splitter) {
|
|||
|
|
var split_result = {};
|
|||
|
|
var search_pos_begin = 0;
|
|||
|
|
while (true) {
|
|||
|
|
var find_pos_begin = split_string.indexOf(splitter, search_pos_begin);
|
|||
|
|
var find_pos_end = splitter.length + find_pos_begin;
|
|||
|
|
if (find_pos_begin == -1) break;
|
|||
|
|
split_result[Object.keys(split_result).length + 1] = split_string.substring(search_pos_begin, find_pos_begin - 1);
|
|||
|
|
search_pos_begin = find_pos_end + 1;
|
|||
|
|
}
|
|||
|
|
if (search_pos_begin <= split_string.length) {
|
|||
|
|
split_result[Object.keys(split_result).length + 1] = split_string.substr(search_pos_begin);
|
|||
|
|
}
|
|||
|
|
return split_result;
|
|||
|
|
},
|
|||
|
|
// 以某个连接符为标准,返回一个table所有字段连接结果
|
|||
|
|
// @param join_table 连接table:array
|
|||
|
|
// @param joiner 连接符
|
|||
|
|
// @param return 用连接符连接后的字符串
|
|||
|
|
Join: function Join(join_table, joiner) {
|
|||
|
|
if (joiner == null) {
|
|||
|
|
return join_table.join("");
|
|||
|
|
} else {
|
|||
|
|
return join_table.join(joiner);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
//区分服务器名称
|
|||
|
|
transformNameByServ: function transformNameByServ(name, srv_id) {
|
|||
|
|
var tmpName = name;
|
|||
|
|
if (srv_id == null || name == null) return tmpName;
|
|||
|
|
if (name) {
|
|||
|
|
if (tmpName.indexOf("【") != -1) {
|
|||
|
|
return tmpName;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (!require("role_controller").getInstance().isTheSameSvr(srv_id)) {
|
|||
|
|
var vo = require("role_controller").getInstance().getRoleVo();
|
|||
|
|
if (vo) {
|
|||
|
|
var listOr = this.Split(srv_id, "_");
|
|||
|
|
var listMe = this.Split(vo.srv_id, "_");
|
|||
|
|
if (listOr[2] && listMe[1] && listOr[1] != listMe[1]) {
|
|||
|
|
tmpName = cc.js.formatStr(nx.text.getKey("msg_utils"), tmpName);
|
|||
|
|
} else if (Object.keys(listOr).length > 1) {
|
|||
|
|
tmpName = cc.js.formatStr(nx.text.getKey("msg_utils_server"), listOr[Object.keys(listOr).length], tmpName);
|
|||
|
|
}
|
|||
|
|
if (srv_id == "robot_1") tmpName = name;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return tmpName;
|
|||
|
|
},
|
|||
|
|
// 配置格式装换
|
|||
|
|
splitDataStr: function splitDataStr(content) {
|
|||
|
|
var result = content;
|
|||
|
|
while (result.indexOf("{") != -1) {
|
|||
|
|
var i = result.indexOf("{");
|
|||
|
|
var n = result.indexOf("}");
|
|||
|
|
var temp = result.substring(i, n + 1);
|
|||
|
|
var target = temp.substring(1, temp.length - 1);
|
|||
|
|
var list = this.Split(target, ":");
|
|||
|
|
var str = cc.js.formatStr("<color=%s>%s</color>", gdata("color_data", "data_color3", parseInt(list[1])), list[2]);
|
|||
|
|
result = result.replace(temp, str);
|
|||
|
|
}
|
|||
|
|
var RoleController = require("role_controller");
|
|||
|
|
var role_vo = RoleController.getInstance().getRoleVo();
|
|||
|
|
if (role_vo) {
|
|||
|
|
result = result.replace(/~n/g, role_vo.name);
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
},
|
|||
|
|
//desc:创建一个普通文本
|
|||
|
|
createLabel: function createLabel(font_size, text_color, line_color, x, y, text_content, parent_wnd, line_num, anchorpoint, font) {
|
|||
|
|
font_size = font_size || 20;
|
|||
|
|
var node = new cc.Node();
|
|||
|
|
node.setAnchorPoint(anchorpoint || cc.v2(0, 0));
|
|||
|
|
var label = node.addComponent(cc.Label);
|
|||
|
|
label.fontSize = font_size;
|
|||
|
|
label.horizontalAlign = cc.macro.TextAlignment.CENTER;
|
|||
|
|
label.verticalAlign = cc.macro.TextAlignment.CENTER;
|
|||
|
|
if (text_color == null) text_color = new cc.Color(0xff, 0xff, 0xff, 0xff);
|
|||
|
|
node.color = text_color;
|
|||
|
|
if (line_color) {
|
|||
|
|
var line = node.addComponent(cc.LabelOutline);
|
|||
|
|
line.color = line_color;
|
|||
|
|
line.width = line_num || 1;
|
|||
|
|
}
|
|||
|
|
x = x || 0;
|
|||
|
|
y = y || 0;
|
|||
|
|
node.setPosition(x, y);
|
|||
|
|
if (text_content != null) label.string = text_content;
|
|||
|
|
if (parent_wnd) parent_wnd.addChild(node);
|
|||
|
|
return label;
|
|||
|
|
},
|
|||
|
|
//desc:创建富文本
|
|||
|
|
createRichLabel: function createRichLabel(fontsize, textcolor, ap, pos, lineHeight, max_width, parent_wnd, align) {
|
|||
|
|
var node = new cc.Node();
|
|||
|
|
node.setAnchorPoint(ap || cc.v2(0, 0));
|
|||
|
|
node.setPosition(pos || cc.v2(0, 0));
|
|||
|
|
var label = node.addComponent(cc.RichText);
|
|||
|
|
if (textcolor == null) textcolor = new cc.Color(0xff, 0xff, 0xff, 0xff);
|
|||
|
|
label.fontSize = fontsize;
|
|||
|
|
label.horizontalAlign = cc.macro.TextAlignment.CENTER;
|
|||
|
|
label.verticalAlign = cc.macro.TextAlignment.CENTER;
|
|||
|
|
if (align == "left") {
|
|||
|
|
label.horizontalAlign = cc.macro.TextAlignment.LEFT;
|
|||
|
|
} else if (align == "right") {
|
|||
|
|
label.horizontalAlign = cc.macro.TextAlignment.RIGHT;
|
|||
|
|
}
|
|||
|
|
label.lineHeight = lineHeight || fontsize + 4;
|
|||
|
|
node.color = textcolor;
|
|||
|
|
label.maxWidth = max_width || 300;
|
|||
|
|
if (parent_wnd) parent_wnd.addChild(node);
|
|||
|
|
return label;
|
|||
|
|
},
|
|||
|
|
//desc:创建image
|
|||
|
|
createAtlasImage: function createAtlasImage(parent, res, x, y, anchorPoint, usePlist, zorder, is_Scale9) {
|
|||
|
|
var node = new cc.Node();
|
|||
|
|
var image = node.addComponent(cc.Sprite);
|
|||
|
|
if (res != null) {
|
|||
|
|
nx.gui.setAtlasFrame(image, "", res);
|
|||
|
|
}
|
|||
|
|
if (anchorPoint == null) {
|
|||
|
|
node.setAnchorPoint(cc.v2(0.5, 0.5));
|
|||
|
|
} else {
|
|||
|
|
node.setAnchorPoint(anchorPoint);
|
|||
|
|
}
|
|||
|
|
if (is_Scale9 == true) {
|
|||
|
|
image.type = cc.Sprite.Type.SLICED;
|
|||
|
|
image.sizeMode = cc.Sprite.SizeMode.CUSTOM;
|
|||
|
|
}
|
|||
|
|
if (x != null && y != null) {
|
|||
|
|
node.setPosition(cc.v2(x, y));
|
|||
|
|
}
|
|||
|
|
if (parent) {
|
|||
|
|
parent.addChild(node, zorder || 0);
|
|||
|
|
}
|
|||
|
|
return image;
|
|||
|
|
},
|
|||
|
|
getPixelFormat: function getPixelFormat(spine_name) {
|
|||
|
|
if (spine_name == null) {
|
|||
|
|
return cc.Texture2D.PixelFormat.RGBA4444;
|
|||
|
|
}
|
|||
|
|
var pf = cc.Texture2D.PixelFormat.RGBA4444;
|
|||
|
|
var frist_letter = spine_name.substr(0, 1);
|
|||
|
|
if (frist_letter == "E" && game.configs.special_spine_data) {
|
|||
|
|
var pf_value = game.configs.special_spine_data.data_effect[spine_name];
|
|||
|
|
if (pf_value == 1) {
|
|||
|
|
pf = cc.Texture2D.PixelFormat.RGBA8888;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return pf;
|
|||
|
|
},
|
|||
|
|
//获取数组或对象具有真实子类的长度
|
|||
|
|
getArrTrueLen: function getArrTrueLen(obj) {
|
|||
|
|
var index = 0;
|
|||
|
|
for (var i in obj) {
|
|||
|
|
var v = obj[i];
|
|||
|
|
if (v != null) {
|
|||
|
|
index = index + 1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return index;
|
|||
|
|
},
|
|||
|
|
//获取数组或对象的长度
|
|||
|
|
getArrLen: function getArrLen(obj) {
|
|||
|
|
if (obj instanceof Array) {
|
|||
|
|
return obj.length;
|
|||
|
|
} else {
|
|||
|
|
return Object.keys(obj).length;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
// 延迟动作
|
|||
|
|
delayRun: function delayRun(obj, delay_time, fun) {
|
|||
|
|
nx.error("delayRun该方法已弃用,遇到及时修改");
|
|||
|
|
if (!fun) return;
|
|||
|
|
if (obj == null) {
|
|||
|
|
fun();
|
|||
|
|
}
|
|||
|
|
var delay_fun = cc.delayTime(delay_time);
|
|||
|
|
var call_fun = cc.callFunc(function () {
|
|||
|
|
if (obj != null) {
|
|||
|
|
fun();
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
obj.runAction(cc.sequence(delay_fun, call_fun));
|
|||
|
|
},
|
|||
|
|
/**
|
|||
|
|
* 统一处理点击事件,为了后面统一音效做处理
|
|||
|
|
* @param {*} object 节点对象
|
|||
|
|
* @param {*} clickback 点击回调
|
|||
|
|
* @param {*} soundType 声音类型 1:普通音效 2:关闭音效 3....
|
|||
|
|
*/
|
|||
|
|
onTouchEnd: function onTouchEnd(object, clickback, soundType) {
|
|||
|
|
nx.error("onTouchEnd该方法已弃用,遇到及时修改");
|
|||
|
|
if (!object) {
|
|||
|
|
if (clickback) {
|
|||
|
|
clickback();
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
object.on(cc.Node.EventType.TOUCH_END, function (event) {
|
|||
|
|
Utils.playButtonSound(soundType);
|
|||
|
|
if (clickback) {
|
|||
|
|
clickback(event);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
/**
|
|||
|
|
* 播放音效接口
|
|||
|
|
* @param {*} type 1:普通按钮音效 2:关闭按钮音效 3:标签页音效 4..自定义音效id
|
|||
|
|
*/
|
|||
|
|
playButtonSound: function playButtonSound(type) {
|
|||
|
|
nx.error("playButtonSound该方法已弃用,遇到及时修改");
|
|||
|
|
// if( !type ) return;
|
|||
|
|
// var res_id = null;
|
|||
|
|
// if( type == ButtonSound.Normal ) {
|
|||
|
|
// res_id = "c_button1";
|
|||
|
|
// } else if( type == ButtonSound.Close ) {
|
|||
|
|
// res_id = "c_close";
|
|||
|
|
// } else if( type == ButtonSound.Tab ) {
|
|||
|
|
// res_id = "c_002";
|
|||
|
|
// } else {
|
|||
|
|
// res_id = type;
|
|||
|
|
// }
|
|||
|
|
// SoundManager.getInstance().playEffect( AUDIO_TYPE.COMMON, res_id );
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
playEffectSound: function playEffectSound(type, res_id) {
|
|||
|
|
nx.error("playEffectSound该方法已弃用,请使用nx.audio.playSFX");
|
|||
|
|
// SoundManager.getInstance().playEffectOnce( type, res_id );
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
playMusic: function playMusic(type, res_id, loop) {
|
|||
|
|
nx.error("playMusic该方法已弃用,不需要这个方法");
|
|||
|
|
// SoundManager.getInstance().playMusic( type, res_id, loop );
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
//获取随机名字
|
|||
|
|
getRandomSaveName: function getRandomSaveName() {
|
|||
|
|
nx.error("getRandomSaveName该方法已弃用.");
|
|||
|
|
var randomName = function (str) {
|
|||
|
|
var result = str;
|
|||
|
|
var a = String.fromCharCode(Math.random(65, 90));
|
|||
|
|
var b = String.fromCharCode(Math.random(97, 122));
|
|||
|
|
var c = String.fromCharCode(Math.random(48, 57));
|
|||
|
|
if (Math.random(3) % 3 == 0) {
|
|||
|
|
result = result + a;
|
|||
|
|
} else if (Math.random(3) % 2 == 0) {
|
|||
|
|
result = result + b;
|
|||
|
|
} else {
|
|||
|
|
result = result + c;
|
|||
|
|
}
|
|||
|
|
if (this.getByteLen(result) < 12) {
|
|||
|
|
result = randomName(result);
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}.bind(this);
|
|||
|
|
var usr = randomName("");
|
|||
|
|
return "sy" + usr;
|
|||
|
|
},
|
|||
|
|
/*==============================--
|
|||
|
|
--desc:获取服务器索引
|
|||
|
|
--time:2018-07-22 10:54:30
|
|||
|
|
--@str:
|
|||
|
|
--@return [index, is_var]
|
|||
|
|
--index == 0 表示 机器 或者 异域(就是无法知道是那个服的)
|
|||
|
|
--is_var : 表示是否本服
|
|||
|
|
--==============================--*/
|
|||
|
|
getServerIndex: function getServerIndex(srv_id) {
|
|||
|
|
nx.error("getServerIndex该方法已弃用.");
|
|||
|
|
// if( srv_id == null ) return [ "" ]
|
|||
|
|
// if( srv_id == "robot_1" || srv_id == "robot" ) { //代表机器人
|
|||
|
|
// return [ 0 ]
|
|||
|
|
// }
|
|||
|
|
// let RoleController = require( "role_controller" );
|
|||
|
|
// let vo = RoleController.getInstance().getRoleVo();
|
|||
|
|
// if( vo ) {
|
|||
|
|
// let listOr = srv_id.split( "_" );
|
|||
|
|
// let listMe = vo.srv_id.split( "_" );
|
|||
|
|
// if( listOr[ 1 ] && listMe[ 0 ] && listOr[ 0 ] != listMe[ 0 ] ) {
|
|||
|
|
// return [ 0 ]
|
|||
|
|
// } else if( listOr.length > 1 ) {
|
|||
|
|
// if( srv_id == vo.srv_id ) {
|
|||
|
|
// return [ listOr[ listOr.length - 1 ], true ]
|
|||
|
|
// } else {
|
|||
|
|
// return [ listOr[ listOr.length - 1 ] ]
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// return [ 0 ]
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 通用显示单行道具列表
|
|||
|
|
// @ item_scrollview scrollview 对象
|
|||
|
|
// @ item_list BackPackItem的对象列表 (注意: 需要在那边手动移除)
|
|||
|
|
// @ data_list 数据列表 结构{{道具id, 数量},...} 就是策划填表的奖励道具结构
|
|||
|
|
// @setting
|
|||
|
|
// @content
|
|||
|
|
// @isActionCallBack 是否调用ActionCallBack
|
|||
|
|
// @setting.scale 缩小参数 默认 1
|
|||
|
|
// @setting.start_x 两边对应道具的间隔
|
|||
|
|
// @setting.space_x 道具之间的间隔
|
|||
|
|
// @setting.max_count item_scrollview最大能显示item数量..用于判断是否可以左右滑动 不填则可以移动
|
|||
|
|
// @setting.is_center 是否不满就居中 max_count必须有值
|
|||
|
|
// @setting.show_effect_id =特效id 显示对应特效 默认无
|
|||
|
|
// @setting.is_tip 是否弹通用tips 默认nil
|
|||
|
|
commonShowSingleRowItemList: function commonShowSingleRowItemList(item_scrollview, item_list, data_list, setting, content, isActionCallBack) {
|
|||
|
|
nx.error("commonShowSingleRowItemList该方法已弃用.");
|
|||
|
|
if (!item_scrollview || !data_list) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var item_list = item_list;
|
|||
|
|
if (item_list) {
|
|||
|
|
// 隐藏物品
|
|||
|
|
for (var i in item_list) {
|
|||
|
|
item_list[i].setVisible(false);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (item_list == null) {
|
|||
|
|
item_list = [];
|
|||
|
|
}
|
|||
|
|
if (data_list.length == 0) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 道具列表
|
|||
|
|
var setting = setting || {};
|
|||
|
|
var scale = setting.scale || 1;
|
|||
|
|
var start_x = setting.start_x || 5;
|
|||
|
|
var space_x = setting.space_x || 5;
|
|||
|
|
var max_count = setting.max_count;
|
|||
|
|
var item_width = setting.item_width || 120;
|
|||
|
|
var lock = setting.lock || false;
|
|||
|
|
// 点击返回回调函数
|
|||
|
|
var is_tip = setting.is_tip;
|
|||
|
|
var callback = setting.callback || false;
|
|||
|
|
var item_count = data_list.length;
|
|||
|
|
item_width = item_width * scale;
|
|||
|
|
var total_width = start_x * 2 + item_width * item_count + space_x * (item_count - 1);
|
|||
|
|
var item_scrollview_size = content.getContentSize();
|
|||
|
|
var max_width = Math.max(item_scrollview_size.width, total_width);
|
|||
|
|
content.setContentSize(cc.size(max_width, item_scrollview_size.height));
|
|||
|
|
if (max_count && item_count <= max_count) {
|
|||
|
|
item_scrollview.off(cc.Node.EventType.TOUCH_START, item_scrollview._onTouchBegan, item_scrollview, true);
|
|||
|
|
item_scrollview.off(cc.Node.EventType.TOUCH_MOVE, item_scrollview._onTouchMoved, item_scrollview, true);
|
|||
|
|
item_scrollview.off(cc.Node.EventType.TOUCH_END, item_scrollview._onTouchEnded, item_scrollview, true);
|
|||
|
|
item_scrollview.off(cc.Node.EventType.TOUCH_CANCEL, item_scrollview._onTouchCancelled, item_scrollview, true);
|
|||
|
|
if (setting.is_center) {
|
|||
|
|
start_x = (item_scrollview_size.width - total_width) * 0.5;
|
|||
|
|
if (start_x < 0) {
|
|||
|
|
start_x = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
// item_scrollview.on(cc.Node.EventType.TOUCH_START, item_scrollview._onTouchBegan, item_scrollview, true);
|
|||
|
|
// item_scrollview.on(cc.Node.EventType.TOUCH_MOVE, item_scrollview._onTouchMoved, item_scrollview, true);
|
|||
|
|
// item_scrollview.on(cc.Node.EventType.TOUCH_END, item_scrollview._onTouchEnded, item_scrollview, true);
|
|||
|
|
// item_scrollview.on(cc.Node.EventType.TOUCH_CANCEL, item_scrollview._onTouchCancelled, item_scrollview, true);
|
|||
|
|
}
|
|||
|
|
content.stopAllActions();
|
|||
|
|
var _setItemData = function (item, v, i, is_tip) {
|
|||
|
|
item.setVisible(true);
|
|||
|
|
var _x = start_x + item_width / 2 + i * (item_width + space_x);
|
|||
|
|
item.setPosition(_x, item_scrollview_size.height * 0.5);
|
|||
|
|
item.setData({
|
|||
|
|
bid: v[0],
|
|||
|
|
num: v[1]
|
|||
|
|
});
|
|||
|
|
item.showOrderWarLock(lock);
|
|||
|
|
if (callback) {
|
|||
|
|
if (isActionCallBack) {
|
|||
|
|
item.addActionCallBack(function () {
|
|||
|
|
callback();
|
|||
|
|
}.bind(this));
|
|||
|
|
} else {
|
|||
|
|
item.addCallBack(function () {
|
|||
|
|
callback();
|
|||
|
|
}.bind(this));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (v[2]) {
|
|||
|
|
item.setExtendLabel(v[2], null, 24);
|
|||
|
|
}
|
|||
|
|
item.setDefaultTip(is_tip);
|
|||
|
|
if (setting.show_effect_id) {
|
|||
|
|
item.showItemEffect(true, setting.show_effect_id, PlayerAction.action_1, true, 1.1);
|
|||
|
|
} else {
|
|||
|
|
item.showItemEffect(false);
|
|||
|
|
}
|
|||
|
|
}.bind(this);
|
|||
|
|
var item = null;
|
|||
|
|
var size = item_list.length;
|
|||
|
|
for (var i in data_list) {
|
|||
|
|
item = item_list[i];
|
|||
|
|
if (item) {
|
|||
|
|
_setItemData(item, data_list[i], i, is_tip);
|
|||
|
|
} else {
|
|||
|
|
var dealey = i - size;
|
|||
|
|
if (dealey <= 0) {
|
|||
|
|
dealey = 1;
|
|||
|
|
}
|
|||
|
|
Utils.delayRun(content, dealey / 60, function (i, v, item, is_tip) {
|
|||
|
|
if (!item_list[i]) {
|
|||
|
|
item = ItemsPool.getInstance().getItem("backpack_item");
|
|||
|
|
item.initConfig(true, scale);
|
|||
|
|
// item.setAnchorPoint(0, 0.5)
|
|||
|
|
item.setParent(content);
|
|||
|
|
item.show();
|
|||
|
|
item_list[i] = item;
|
|||
|
|
_setItemData(item, v, i, is_tip);
|
|||
|
|
}
|
|||
|
|
}.bind(this, i, data_list[i], item, is_tip));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return item_list;
|
|||
|
|
},
|
|||
|
|
/*--通用显示空白
|
|||
|
|
--@parent 父类
|
|||
|
|
--@bool 显示状态 true 显示 , false 不显示
|
|||
|
|
--@setting 配置信息
|
|||
|
|
--setting.text 文本内容 默认: 暂无数据
|
|||
|
|
--setting.pos icon显示位置 默认 父类的中心点
|
|||
|
|
--setting.scale icon缩放大小 默认 1
|
|||
|
|
--setting.offset_y 因图标缩放导致文本的位置需要调整 偏移量调整 默认是 -10
|
|||
|
|
--setting.font_size 文本大小 默认 26
|
|||
|
|
--setting.label_color 文本颜色 默认 game.configs.color_data.data_color16[175]*/
|
|||
|
|
commonShowEmptyIcon: function commonShowEmptyIcon(parent, bool, setting) {
|
|||
|
|
nx.error("commonShowEmptyIcon该方法已弃用.");
|
|||
|
|
if (!parent) return;
|
|||
|
|
if (bool) {
|
|||
|
|
var setting = setting || {};
|
|||
|
|
var text = setting.text || nx.text.getKey("msg_utils");
|
|||
|
|
if (!parent.empty_con) {
|
|||
|
|
var parent_size = parent.getContentSize();
|
|||
|
|
var pos = setting.pos || cc.v2(parent_size.width * 0.5, parent_size.width * 0.5, parent_size.height * 0.5 + 10);
|
|||
|
|
var scale = setting.scale || 1;
|
|||
|
|
var offset_y = setting.offset_y || -110;
|
|||
|
|
var label_color = setting.label_color || new cc.Color().fromHEX(game.configs.color_data.data_color16[175]);
|
|||
|
|
var font_size = setting.font_size || 26;
|
|||
|
|
var size = cc.size(200, 200);
|
|||
|
|
parent.empty_con = new cc.Node();
|
|||
|
|
parent.empty_con.setContentSize(cc.size(120, 120));
|
|||
|
|
parent.empty_con.setAnchorPoint(0.5, 0.5);
|
|||
|
|
parent.empty_con.setPosition(pos.x, pos.y);
|
|||
|
|
parent.addChild(parent.empty_con, 10);
|
|||
|
|
var bg = Utils.createImage(parent.empty_con, PathTool.getIconPath("bigbg", "bigbg_3"), 0, 0, cc.v2(0.5, 0.5), false);
|
|||
|
|
bg.node.scale = scale;
|
|||
|
|
parent.empty_label = Utils.createLabel(font_size, label_color, null, 0, offset_y, '', parent.empty_con, 0, cc.v2(0.5, 0.5));
|
|||
|
|
} else {
|
|||
|
|
parent.empty_con.active = true;
|
|||
|
|
}
|
|||
|
|
parent.empty_label.string = text;
|
|||
|
|
} else {
|
|||
|
|
if (parent.empty_con) {
|
|||
|
|
parent.empty_con.active = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
//通用设置倒计时 时间格式默认 TimeTool.GetTimeForFunction 此方法返回格式(需要其他的 在callback 自行处理)
|
|||
|
|
//注意: 关闭panel的时候记得 doStopAllActions(label) 否则会报错
|
|||
|
|
//@label 倒计时对象 label
|
|||
|
|
//@less_time 剩余时间
|
|||
|
|
//@setting 配置信息
|
|||
|
|
//setting.label_type 文本类型(参考 CommonAlert.type.rich) ..注意:需要增加标题 和 时间颜色 才设置这个(否则没意义)
|
|||
|
|
//setitng.time_title 时间标题 eg: 剩余时间:
|
|||
|
|
//setitng.time_color 时间颜色 格式: #ffffff 富文本下 需要变的颜色..(在is_rich_label == true下 必填)
|
|||
|
|
//setting.callback 回调函数 如果_setTimeFormatString 不能满足需求 自己用回调函数处理
|
|||
|
|
commonCountDownTime: function commonCountDownTime(label, less_time, setting) {
|
|||
|
|
nx.error("commonCountDownTime该方法已弃用.");
|
|||
|
|
if (!label) return;
|
|||
|
|
var setting = setting || {};
|
|||
|
|
var callback = setting.callback; //回调函数
|
|||
|
|
var label_type = setting.label_type; //文本类型
|
|||
|
|
var time_title = null;
|
|||
|
|
var time_color = null;
|
|||
|
|
var TimeTool = require("timetool");
|
|||
|
|
if (label_type && label_type == "rich") {
|
|||
|
|
time_title = setting.time_title || "";
|
|||
|
|
time_color = setting.time_color;
|
|||
|
|
}
|
|||
|
|
var _setTimeFormatString = function _setTimeFormatString(time) {
|
|||
|
|
if (!label) return;
|
|||
|
|
if (callback) {
|
|||
|
|
callback(time);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (label_type && label_type == "rich" && time_color) {
|
|||
|
|
if (time > 0) {
|
|||
|
|
label.string = cc.js.formatStr("%s <color=%s>%s</c>", time_title, time_color, TimeTool.getTimeForFunction(time));
|
|||
|
|
} else {
|
|||
|
|
label.node.stopAllActions();
|
|||
|
|
label.string = cc.js.formatStr("%s <color=%s>00:00:00</c>", time_title, time_color);
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
if (time > 0) {
|
|||
|
|
label.string = TimeTool.getTimeForFunction(time);
|
|||
|
|
} else {
|
|||
|
|
label.node.stopAllActions();
|
|||
|
|
label.string = "00:00:00";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
label.node.stopAllActions();
|
|||
|
|
if (less_time > 0) {
|
|||
|
|
_setTimeFormatString(less_time);
|
|||
|
|
label.node.runAction(cc.repeatForever(cc.sequence(cc.delayTime(1), cc.callFunc(function () {
|
|||
|
|
less_time = less_time - 1;
|
|||
|
|
_setTimeFormatString(less_time);
|
|||
|
|
}.bind(this)))));
|
|||
|
|
} else {
|
|||
|
|
_setTimeFormatString(less_time);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
//设置精灵变灰,递归下去
|
|||
|
|
setChildUnEnabled: function setChildUnEnabled(node, status) {
|
|||
|
|
var sp_status;
|
|||
|
|
if (status) {
|
|||
|
|
sp_status = new cc.Material.createWithBuiltin("2d-gray-sprite"); // cc.Sprite.State.GRAY;
|
|||
|
|
} else {
|
|||
|
|
sp_status = new cc.Material.createWithBuiltin("2d-sprite"); // cc.Sprite.State.NORMAL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var sprites = node.getComponentsInChildren(cc.Sprite);
|
|||
|
|
for (var i = 0; i < sprites.length; ++i) {
|
|||
|
|
sprites[i].setMaterial(sp_status);
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
//--获取属性对应信息
|
|||
|
|
// @attr_key 策划定义属性key 参考表attr_data.xml
|
|||
|
|
// @attr_val 对应值..如果是百分比 传过来的是千分比
|
|||
|
|
//return 属性icon路径, 属性名字, 属性值
|
|||
|
|
commonGetAttrInfoByKeyValue: function commonGetAttrInfoByKeyValue(attr_key, attr_val) {
|
|||
|
|
if (!attr_key || !attr_val) return;
|
|||
|
|
var attr_name = game.configs.attr_data.data_key_to_name[attr_key];
|
|||
|
|
if (attr_name) {
|
|||
|
|
var PartnerCalculate = require("partner_calculate");
|
|||
|
|
var is_per = PartnerCalculate.isShowPerByStr(attr_key);
|
|||
|
|
if (is_per == true) {
|
|||
|
|
attr_val = attr_val / 10 + "%";
|
|||
|
|
}
|
|||
|
|
var res = PathTool.getAttrIconRes(attr_key);
|
|||
|
|
return {
|
|||
|
|
res: res,
|
|||
|
|
attr_name: attr_name,
|
|||
|
|
attr_val: attr_val,
|
|||
|
|
icon: attr_key
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
tableInsert: function tableInsert(arr, val) {
|
|||
|
|
arr.push(val);
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
cc._RF.pop();
|