"use strict"; cc._RF.push(module, '2ca6c1AqP5AU4gvZAEw+2Jo', 'hero_library_main_window'); // Scripts/mod/hero/view/hero_library_main_window.js "use strict"; // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 英雄图书馆 //
Create: 2019-03-16 10:40:01 // -------------------------------------------------------------------- var PathTool = require("pathtool"); var HeroController = require("hero_controller"); var HeroConst = require("hero_const"); var HeroLibraryMainItem = require("hero_library_main_item"); var Hero_library_mainWindow = cc.Class({ "extends": BaseView, ctor: function ctor() { this.prefabPath = PathTool.getPrefabPath("hero", "hero_library_main_window"); this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意 this.win_type = WinType.Full; //是否是全屏窗体 WinType.Full, WinType.Big, WinType.Mini, WinType.Tips }, // 初始化一些配置数据,可以用于声明一些变量之类的 initConfig: function initConfig() { this.ctrl = HeroController.getInstance(); this.model = this.ctrl.getModel(); //图书馆列表 this.hero_library_list = {}; //阵营 this.select_camp = 0; //scrollview列表参数 this.col = 3; //列数 this.item_width = 220; //item的宽高 this.item_height = 325 + 10; this.cacheList = {}; //对象池 this.cacheMaxSize = 0; //最大池数 // 到时间显示的索引 this.time_show_index = 0; this.first_title_height = 50; //第一个的高度 this.title_height = 80; //职业名字的高 //列表职业对应信息 this.career_info_list = {}; //创建存储 this.node_list = []; }, // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件 openCallBack: function openCallBack() { this.main_container = this.seekChild("main_container"); this.lay_scrollview_nd = this.seekChild(this.main_container, "lay_scrollview"); this.centre_box_1_nd = this.seekChild(this.main_container, "centre_box_1"); this.border_left_box_2_nd = this.seekChild(this.main_container, "border_left_box_2"); this.border_right_box_2_nd = this.seekChild(this.main_container, "border_right_box_2"); this.top_box_4_nd = this.seekChild(this.main_container, "top_box_4"); this.bottom_box_5_nd = this.seekChild(this.main_container, "bottom_box_5"); var camp_nd = this.seekChild(this.bottom_box_5_nd, "camp_node"); this.camp_btn_list = {}; for (var i = 0; i < 6; i++) { this.camp_btn_list[i] = this.seekChild(camp_nd, "camp_btn" + i); } this.img_select_nd = this.seekChild(camp_nd, "img_select"); var pos = this.camp_btn_list[0].getPosition(); this.img_select_nd.setPosition(pos.x, pos.y); this.close_btn = this.seekChild(this.bottom_box_5_nd, "close_btn"); this.background_nd = this.seekChild("background"); this.background_nd.scale = FIT_SCALE; this.loadRes(PathTool.getBigBg("hero/hero_bag_bg"), function (res) { this.background_nd.getComponent(cc.Sprite).spriteFrame = res; }.bind(this)); this.adaptationScreen(); }, // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent registerEvent: function registerEvent() { Utils.onTouchEnd(this.close_btn, function () { this.ctrl.openHeroLibraryMainWindow(false); }.bind(this), 2); var fun = function (btn, i) { Utils.onTouchEnd(btn, function () { this.onClickBtnShowByIndex(i); }.bind(this), 2); }.bind(this); for (var i in this.camp_btn_list) { var v = this.camp_btn_list[i]; fun(v, i); } }, //设置适配屏幕 adaptationScreen: function adaptationScreen() {}, //显示根据类型 0表示全部 onClickBtnShowByIndex: function onClickBtnShowByIndex(index, is_must_reset) { if (this.img_select_nd && this.camp_btn_list[index]) { var pos = this.camp_btn_list[index].getPosition(); this.img_select_nd.setPosition(pos.x - 0.5, pos.y + 1); } this.updateHeroList(index, is_must_reset); }, // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了 openRootWnd: function openRootWnd(bid) { this.onClickBtnShowByIndex(0, true); }, //更新职业的ui //title_pos_list 结构: title_pos_list[n] = {career_type = career_type, pos_y = xx} updateCareerUI: function updateCareerUI(title_pos_list, container_height, start_x) { for (var i in this.career_info_list) { var career_info = this.career_info_list[i]; if (career_info) { if (career_info.desk) { career_info.desk.node.active = false; } career_info.bg.node.active = false; } } start_x = start_x || 0; var fun = function (i) { var info = title_pos_list[i]; var career_type = info.career_type || HeroConst.CareerName.eMagician; var pos_y = info.pos_y || 0; var name = HeroConst.CareerName[career_type]; var desk_y = -pos_y; var bg_y = -pos_y - 25; if (i == 1) { bg_y = -pos_y; } if (this.career_info_list[i] == null) { //第一个位置不需要台子 var career_info = {}; if (i != 1) { var res = PathTool.getUIIconPath("herolibrary", "hero_library_box_5"); career_info.desk = Utils.createImage(this.scrollview_container_nd, null, 0, desk_y, cc.v2(0.5, 0.5), true, 0, true); this.loadRes(res, function (bg_sf) { career_info.desk.spriteFrame = bg_sf; }.bind(this)); career_info.desk.node.setContentSize(cc.size(this.scrollview_size.width, 103)); career_info.desk.type = cc.Sprite.Type.SLICED; career_info.desk.sizeMode = cc.Sprite.SizeMode.CUSTOM; this.node_list.push(career_info.desk); } var res = PathTool.getUIIconPath("herolibrary", "hero_library_18"); var bg_hegit = 48; career_info.bg = Utils.createImage(this.scrollview_container_nd, null, start_x, bg_y, cc.v2(0, 1), true, 0, true); this.loadRes(res, function (bg_sf) { career_info.bg.spriteFrame = bg_sf; }.bind(this)); career_info.bg.node.setContentSize(cc.size(232, bg_hegit)); career_info.bg.type = cc.Sprite.Type.SLICED; career_info.bg.sizeMode = cc.Sprite.SizeMode.CUSTOM; this.node_list.push(career_info.bg); var res = PathTool.getPartnerTypeIcon(career_type); career_info.career_icon = Utils.createImage(career_info.bg.node, null, 50, -bg_hegit * 0.5 - 3, cc.v2(0, 0.5)); this.loadRes(res, function (bg_sf) { career_info.career_icon.spriteFrame = bg_sf; }.bind(this)); this.node_list.push(career_info.career_icon); career_info.label = Utils.createLabel(24, new cc.Color(0x64, 0x32, 0x23, 0xff), null, 88, -bg_hegit * 0.5 - 3, name, career_info.bg.node, null, cc.v2(0, 0.5)); this.career_info_list[i] = career_info; this.node_list.push(career_info.label); } else { var career_info = this.career_info_list[i]; if (career_info.desk) { career_info.desk.node.active = true; career_info.desk.node.y = desk_y; } career_info.bg.node.active = true; career_info.bg.node.y = bg_y; var res = PathTool.getPartnerTypeIcon(career_type); this.loadRes(res, function (bg_sf) { career_info.career_icon.spriteFrame = bg_sf; }.bind(this)); career_info.label.string = name; } }.bind(this); for (var i in title_pos_list) { if (i != 0) { fun(i); } } }, //创建英雄列表 updateHeroList: function updateHeroList(select_camp, is_must_reset) { select_camp = select_camp || 0; if (!is_must_reset && select_camp == this.select_camp) return; if (!this.list_view_sv) { var size = this.lay_scrollview_nd.getContentSize(); this.createLibraryScrollView(size, size.width * 0.5, size.height * 0.5); } this.list_view_sv.stopAutoScroll(); this.list_view_sv.scrollToTop(0); this.select_camp = select_camp; var config_list = Config.partner_data.data_partner_base || {}; var list = []; for (var k in config_list) { var v = config_list[k]; if (select_camp == 0 || select_camp == v.camp_type) { list.push(v); } } list.sort(Utils.tableCommonSorter([["type", false], ["init_star", true], ["camp_type", false], ["sort_order", false]])); var content_y = 0; var start_x = -this.scrollview_size.width / 2; //获取下一个位置根据当前数量 var _getNextPositionBySize = function (size) { var count = size % this.col; if (count == 0) { //换行 content_y = content_y + this.item_height; } var x = start_x + this.item_width * count + this.item_width * 0.5; var y = content_y - this.item_height * 0.5; return { x: x, y: y }; }.bind(this); var title_pos_list = []; title_pos_list[0] = {}; var career_type = null; this.hero_library_list = []; this.hero_library_list[0] = {}; for (var i in list) { var v = list[i]; if (career_type == null) { career_type = v.type; content_y = this.first_title_height; title_pos_list.push({ career_type: career_type, pos_y: 0 }); } if (career_type != v.type) { // 算出多出的空位置 用{}去填补 var count = this.col - (this.hero_library_list.length - 1) % this.col; if (count < this.col && count != 0) { for (var i = 1; i <= count; i++) { var pos = _getNextPositionBySize(this.hero_library_list.length - 1); this.hero_library_list.push({ x: pos.x, y: pos.y }); } } career_type = v.type; title_pos_list.push({ career_type: career_type, pos_y: content_y }); //遇到新职业..加title高度 content_y = content_y + this.title_height; } var pos = _getNextPositionBySize(this.hero_library_list.length - 1); this.hero_library_list.push({ config: v, x: pos.x, y: pos.y }); } //内容的高度 var container_height = null; if (this.hero_library_list.length - 1 > 0) { container_height = content_y; } else { container_height = 0; } this.updateCareerUI(title_pos_list, container_height, start_x); this.reloadData(container_height); }, //获取数据数量 numberOfCells: function numberOfCells() { return this.hero_library_list.length - 1; }, //更新cell(拖动的时候.刷新数据时候会执行方法) updateCellByIndex: function updateCellByIndex(cell, index) { cell.index = index; var cell_data = this.hero_library_list[index]; if (cell_data.config) { cell.setActive(true); cell.setData(cell_data.config); } else { cell.setActive(false); } }, //点击cell .需要在 createNewCell 设置点击事件 onCellTouched: function onCellTouched(cell) { var index = cell.index; var cell_data = this.hero_library_list[index]; if (cell_data && cell_data.config) { var draw_res = cell_data.config.draw_res; var library_config = gdata("partner_data", "data_partner_library", [cell_data.config.bid]); if (draw_res && library_config && draw_res != "") { this.ctrl.openHeroLibraryInfoWindow(true, cell_data.config.bid); } else { message(Utils.TI18N("画师正快马加鞭地制作该立绘中哟")); var pokedex_config = gdata("partner_data", "data_partner_pokedex", [cell_data.config.bid]); if (pokedex_config && pokedex_config[0]) { var star = pokedex_config[0].star || 1; this.ctrl.openHeroInfoWindowByBidStar(cell_data.config.bid, star); } } } }, //--------------------------------开始------------------------- //内内部写一个无限的scrollview createLibraryScrollView: function createLibraryScrollView(size, x, y) { this.scrollview_size = size; this.list_view_sv = this.seekChild(this.lay_scrollview_nd, "list_view", cc.ScrollView); this.scrollview_container_nd = this.seekChild(this.list_view_sv.node, "content"); this.cacheMaxSize = (Math.ceil(size.height / this.item_height) + 1) * this.col; this.list_view_sv.node.on("scrolling", function () { this.checkOverShowByVertical(); }, this); }, //竖直方向的监测判断 checkOverShowByVertical: function checkOverShowByVertical() { if (!this.cellList) return; var container_y = this.scrollview_container_nd.y; //计算 视图的上部分和下部分在self.container 的位置 var top = -container_y; var bot = -this.scrollview_size.height + top; var col_count = Math.ceil((this.cellList.length - 1) / this.col); //下面因为 self.cellList 是一维数组 所以要换成二维来算 //活跃cell开始行数 var activeCellStarRow = 1; for (var i = 1; i <= col_count; i++) { var index = 1 + (i - 1) * this.col; var cell = this.cellList[index]; activeCellStarRow = i; if (cell && cell.y - this.item_height * 0.5 <= top) { break; } } //活跃cell结束行数 var activeCellEndRow = col_count; if (bot < 0) { for (var i = activeCellStarRow; i <= col_count; i++) { var index = 1 + (i - 1) * this.col; var cell = this.cellList[index]; if (cell && cell.y + this.item_height * 0.5 < bot) { activeCellEndRow = i - 1; break; } } } var max_count = this.numberOfCells(); for (var i = 1; i <= col_count; i++) { if (i >= activeCellStarRow && i <= activeCellEndRow) { for (var k = 1; k <= this.col; k++) { var index = (i - 1) * this.col + k; if (!this.activeCellIdx[index]) { if (index <= max_count) { this.updateCellAtIndex(index); this.activeCellIdx[index] = true; } } } } else { for (var k = 1; k <= this.col; k++) { var index = (i - 1) * this.col + k; if (index <= max_count) { this.activeCellIdx[index] = false; } } } } }, reloadData: function reloadData(container_height) { this.cellList = []; this.cellList[0] = {}; this.activeCellIdx = {}; for (var k in this.cacheList) { //相当于隐藏 this.cacheList[k].setPosition(-1000, 0); } var container_height = Math.max(container_height, this.scrollview_size.height); this.container_size = cc.size(this.scrollview_size.width, container_height); this.scrollview_container_nd.setContentSize(this.container_size); this.list_view_sv.scrollToTop(0); var number = this.numberOfCells(); if (number == 0) { return; } for (var i = 1; i <= number; i++) { var data = this.hero_library_list[i]; if (data != null) { var cell = null; if (i <= this.time_show_index) { cell = this.getCacheCellByIndex(i); } var x = data.x; var y = -data.y; var cellData = { cell: cell, x: x, y: y }; this.cellList.push(cellData); } } var maxRefreshNum = this.cacheMaxSize - this.col; var refreshNum = number < maxRefreshNum && number || maxRefreshNum; var fun = function (index) { gcore.Timer.set(function () { if (this.time_show_index < index) { this.time_show_index = index; } this.updateCellAtIndex(index); if (this.time_show_index == refreshNum) { this.time_show_index = 9999; } }.bind(this), index / 60, 1); this.activeCellIdx[i] = true; }.bind(this); for (var i = 1; i <= refreshNum; i++) { fun(i); } }, //获得格子下标对应的缓存itemCell getCacheCellByIndex: function getCacheCellByIndex(index) { var cacheIndex = (index - 1) % this.cacheMaxSize + 1; if (!this.cacheList[cacheIndex]) { var newCell = new HeroLibraryMainItem(); newCell.show(); newCell.addCallBack(function () { this.onCellTouched(newCell); }.bind(this)); newCell.setPosition(-1000, 0); newCell.setAnchorPoint(cc.v2(0.5, 0.5)); this.cacheList[cacheIndex] = newCell; newCell.setParent(this.scrollview_container_nd); return newCell; } else { return this.cacheList[cacheIndex]; } }, //更新格子,并记为活跃 updateCellAtIndex: function updateCellAtIndex(index) { if (index > this.time_show_index) { return; } if (!this.cellList[index]) return; var cellData = this.cellList[index]; if (cellData.cell == null) { cellData.cell = this.getCacheCellByIndex(index); } cellData.cell.setPosition(cellData.x, cellData.y); this.updateCellByIndex(cellData.cell, index); }, //--------------------------scrollview结束------------------------- // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象 closeCallBack: function closeCallBack() { for (var k in this.cacheList) { var item = this.cacheList[k]; if (item.deleteMe) { item.deleteMe(); item = null; } } this.cacheList = null; for (var i in this.node_list) { var v = this.node_list[i]; if (v) { if (v instanceof cc.Node) { v.destroy(); v = null; } else { v.node.destroy(); v = null; } } } this.node_list = null; this.career_info_list = null; this.ctrl.openHeroLibraryMainWindow(false); } }); cc._RF.pop();