|
|
- PetEvolvePanel = PetEvolvePanel or BaseClass(BaseItem)
- local PetEvolvePanel = PetEvolvePanel
-
- function PetEvolvePanel:__init()
- self.base_file = "pet"
- self.layout_file = "PetEvolvePanel"
- self.model = PetModel:getInstance()
-
- self:Load()
- end
-
- function PetEvolvePanel:Load_callback()
- self.nodes = {
- "evolveBtn:obj:img",--进化按钮
- "nextArrow:obj",--箭头
- "con_star_next:obj",--下一级星星容器,满星时隐藏
- "attr_ScrollView","attr_ScrollView/Viewport/Content",--属性容器
- "con_cost",--消耗道具容器
- "costName:tmp",--消耗道具
- "evolveBtn/Text:tmp",
- "evolveBtn/evolveRed:obj",
- }
- self:GetChildren(self.nodes)
-
- self.now_star = {}--当前星级
- self.next_star = {}--下一星级
- for i=1,5 do
- self.now_star[i] = self:GetChild("con_star_now/star"..i):GetComponent("Image")
- self.next_star[i] = self:GetChild("con_star_next/star"..i):GetComponent("Image")
- end
-
- --创建消耗道具
- self.cost_item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.con_cost)
- self.cost_item:SetItemSize(78,78)
- self.cost_item:SetAnchoredPosition(0,0)
-
- self:AddEvents()
- if self.need_refreshData then
- self:UpdateView()
- end
- end
-
- function PetEvolvePanel:AddEvents( )
- local on_click = function ( click_obj )
- if self.evolveBtn_obj == click_obj then--进化按钮
- -- if self.can_evolve then
- self.model:RecordDataBeforeEvolve(DeepCopy(self.data))
- self.model:Fire(PetConst.REQUEST_CCMD_EVENT,16303,self.data.pet_id,2)--进化
- -- else
- -- Message.show("进化所需灵魂碎片不足哦!","fault")
- -- end
- end
- end
- AddClickEvent(self.evolveBtn_obj, on_click,LuaSoundManager.SOUND_UI.NONE)
-
- --宠物碎片刷新时
- local update_progress = function(goods_sub_type)
- if goods_sub_type == 1 then--宠物碎片
- local data = self.model:GetPetListById(self.data.pet_id)
- self:UpdateCostItems(data)
- end
- end
- self:BindEvent(self.model, PetConst.UPDATE_PET_GOODS_NUM, update_progress)
-
- --宠物进化成功之后的刷新
- local pet_evolve = function(pet_id)
- if not self.is_loaded then return end
- if pet_id == self.data.pet_id then
- self.data = self.model:GetPetListById(self.data.pet_id)
- self.cfg_data = self.model:GetPetCfg(self.data.pet_id,self.data.pet_star)
- -- self:SetData(data,cfg_data)
- self:UpdateView(need_play_attr_effect)
- end
- end
- self:BindEvent(self.model, PetConst.PET_EVOLVE, pet_evolve)
-
- --宠物升级时,属性框也要发生变化
- local pet_upgrade = function(data,cfg_data)
- -- if data.pet_lv ~= self.data.pet_lv then--需要刷新属性框
- self.data = data
- self.cfg_data = cfg_data
- self:UpdateAttr(self.data,self.cfg_data)--刷新属性栏
- -- end
- end
- self:BindEvent(self.model, PetConst.UPDATE_FEED_PANEL,pet_upgrade)
-
- --装上宝石后,宠物属性列表也要刷新
- local update_attr = function(pet_id)
- if self.data.pet_id == pet_id then
- self:UpdateAttr(self.data,self.cfg_data)
- end
- end
- self:BindEvent(self.model, PetConst.UPDATE_PET_DIAMOND_CON, update_attr)
-
- end
-
- function PetEvolvePanel:UpdateView(need_play_attr_effect )
- self:UpdateStageAndStar(self.data,self.cfg_data)
- self:UpdateAttr(self.data,self.cfg_data,need_play_attr_effect)
- self:UpdateCostItems(self.data)
- end
-
- --刷新阶段、星数的显示
- function PetEvolvePanel:UpdateStageAndStar(data,cfg_data)
- local max_show_star = self.model:GetMaxStarInStage(data.pet_id,data.pet_star)
- local now_show_star = self.model:GetNowShowPetStar(data.pet_star)
-
- for i=1,now_show_star do
- lua_resM:setImageSprite(self, self.now_star[i], "pet_asset", PetConst.stage_message[data.pet_stage].star_res,true)
- self.now_star[i].gameObject:SetActive(true)
- end
- for i=now_show_star+1,5 do
- lua_resM:setImageSprite(self, self.now_star[i], "pet_asset", "pet_star_0",true)
- self.now_star[i].gameObject:SetActive(false)
- end
-
- --判断是不是满星了
- local final_star = self.model:GetPetMaxStar(data.pet_id)
- if data.pet_star == final_star then
- --隐藏箭头和星级阶段
- self.nextArrow_obj:SetActive(false)
- self.con_star_next_obj:SetActive(false)
- else
- self.nextArrow_obj:SetActive(true)
- self.con_star_next_obj:SetActive(true)
- --判断进化后是否会升阶段
- local next_max_star = self.model:GetMaxStarInStage(data.pet_id,data.pet_star+5)
- if self.model:CanPetGradeToNextStage(data.pet_star) then
- lua_resM:setImageSprite(self, self.next_star[1], "pet_asset", PetConst.stage_message[data.pet_stage+1].star_res,true)
- self.next_star[1].gameObject:SetActive(true)
- for i=2,next_max_star do
- lua_resM:setImageSprite(self, self.next_star[i], "pet_asset", "pet_star_0",true)
- self.next_star[i].gameObject:SetActive(false)
- end
- else
- for i=1,now_show_star+1 do
- lua_resM:setImageSprite(self, self.next_star[i], "pet_asset", PetConst.stage_message[data.pet_stage].star_res,true)
- self.next_star[i].gameObject:SetActive(true)
- end
- for i=now_show_star+1+1,next_max_star do
- lua_resM:setImageSprite(self, self.next_star[i], "pet_asset", "pet_star_0",true)
- self.next_star[i].gameObject:SetActive(false)
- end
- end
- end
- end
-
- --刷新属性值
- function PetEvolvePanel:UpdateAttr(data,cfg_data,need_play_attr_effect)
- --获取计算好的属性值
- local diamond_data = self.model:GetPetDiamondDataById(data.pet_id)--取出宝石所加的属性一并计算
- local awake_cfg = nil
- if data.is_awaken == 1 then
- awake_cfg = self.model:GetPetAwakeCfg(data.pet_id)
- end
- local now_attr_list = self.model:GetPetAttrList(data.pet_lv,stringtotable(cfg_data.attr_list),diamond_data,awake_cfg,data.pet_star,data.pet_id)
- if data.pet_star == self.model:GetPetMaxStar(data.pet_id) then--已经达到满星
- self:UpdateAttrScrollView(now_attr_list,true)
- else
- local next_star = self.model:GetNextStageAndStar(data.pet_id, data.pet_star)--获取下一星级的阶段和星数
- local next_cfg = self.model:GetPetCfg(data.pet_id,next_star)--获取下一阶段的配置
-
- if not next_cfg then--防止没有配置的情况
- self:UpdateAttrScrollView(now_attr_list,true)
- return
- end
-
- local next_attr_list = self.model:GetPetAttrList(data.pet_lv,stringtotable(next_cfg.attr_list),diamond_data,awake_cfg,next_star,data.pet_id)
- --将两个算好的不同等级的属性table合并成一个,格式为{{属性id,当前属性值,下一级增长值},{}}
- local final_attr_list = self.model:MergeAttrList(now_attr_list,next_attr_list)
- self:UpdateAttrScrollView(final_attr_list,false,need_play_attr_effect)
- end
- end
-
- --刷新属性栏scrollview
- function PetEvolvePanel:UpdateAttrScrollView(attr_list,is_max_lv,need_play_attr_effect)
- if not self.attr_list_com then
- self.attr_list_com = self:AddUIComponent(UI.ItemListCreator)
- end
-
- -- --解决高级属性名字过长导致文字重叠的问题:普通属性一行摆两个,高级属性一行摆一个
- -- --思路:ItemListCreator不能自由控制一行摆几个,因此在高级属性后面插入一个空属性隐藏显示,模拟出一行只摆一个属性的效果
- -- --step1:排序属性列表,把高级属性排后面
- -- local _sort = function( a,b )
- -- if a[1] < b[1] then
- -- return true
- -- end
- -- end
- -- table.sort( attr_list, _sort )
- -- --step2:找到普通属性和高级属性的分界点
- -- local divide_index = 0--分界点下标
- -- local max_index = #attr_list--属性个数
- -- for i,v in ipairs(attr_list) do
- -- --找到高级属性,标记分界点
- -- if WordManager:GetAttrIsSpecial(v[1]) then
- -- divide_index = i-1
- -- break
- -- end
- -- end
- -- --step3:分情况操作
- -- --偶数个普通属性时,直接对后面的高级属性依次插入空属性即可
- -- --奇数个普通属性时,先在最后一个普通属性后插入空属性,让高级属性掉到下一行位置去
- -- if divide_index ~= 0 then
- -- if divide_index %2 == 0 then
- -- for i=1,max_index-divide_index do
- -- table.insert(attr_list,divide_index+2*i,{0})
- -- end
- -- else
- -- table.insert(attr_list,divide_index+1,{0})
- -- for i=1,max_index-divide_index do
- -- table.insert(attr_list,divide_index+2*i+1,{0})
- -- end
- -- end
- -- end
- -- ------------------
-
- local info = {
- data_list = attr_list,
- item_con = self.Content,
- item_class = PetAttrItem,
- -- item_width = 193,
- item_height = 47,
- space_x = 0,
- space_y = -2,
- start_x = 0,
- start_y = 5,
- scroll_view = self.attr_ScrollView,
- -- create_frequency = 0.01,
- on_update_item = function(item, i, v)
- item:SetData(i,v,is_max_lv,need_play_attr_effect)
- end,
- }
- self.attr_list_com:UpdateItems(info)
- end
-
- --刷新升级道具的显示
- function PetEvolvePanel:UpdateCostItems(data)
- local next_star = self.model:GetNextStageAndStar(data.pet_id, data.pet_star)
- local cfg_data = self.model:GetPetCfg(data.pet_id,next_star)
- local is_max_stage = false
-
- if not cfg_data then
- is_max_stage = true
- local cost_data = stringtotable(self.cfg_data.cost)
- local goods_type_id = cost_data[1][2]
- self.cost_item:SetData(goods_type_id)
-
- local color = GoodsModel:getInstance():GetGoodsColor(goods_type_id)
- local goods_name = HtmlColorTxt(GoodsModel:getInstance():getGoodsName(goods_type_id)..":",color)
- self.costName_tmp.text = string.format("%s已满星",goods_name)
-
- self.can_evolve = false
- else
- local cost_data = stringtotable(cfg_data.cost)
- local goods_type_id = cost_data[1][2]
- local goods_num = GoodsModel:getInstance():GetTypeGoodsNum(goods_type_id)
- self.cost_item:SetData(goods_type_id)
-
- local color = GoodsModel:getInstance():GetGoodsColor(goods_type_id)
- local goods_name = HtmlColorTxt(GoodsModel:getInstance():getGoodsName(goods_type_id)..":",color)
-
- if goods_num < cost_data[1][3] then
- self.costName_tmp.text = string.format("%s<#ff203a>%s</color><#fdffc2>/%s</color>", goods_name, goods_num, cost_data[1][3])
- else
- self.costName_tmp.text = string.format("%s<#2CF86F>%s</color><#fdffc2>/%s</color>", goods_name, goods_num, cost_data[1][3])
- end
-
- self.can_evolve = goods_num >= cost_data[1][3]--记录一个判断能否进化的标识用于进化按钮
- end
-
-
-
- --控制进化按钮的灰化表现状态
- if self.can_evolve and not is_max_stage then
- self.evolveBtn_img.gray = false
- SetTMPSharedMaterial(self.Text_tmp, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn)
- self.evolveRed_obj:SetActive(true)
- else
- self.evolveBtn_img.gray = true
- SetTMPSharedMaterial(self.Text_tmp, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn)
- self.evolveRed_obj:SetActive(false)
- end
- end
-
- --data追溯至16301协议
- function PetEvolvePanel:SetData(data,cfg_data)
- self.data = data
- self.cfg_data = cfg_data
- if self.is_loaded then
- self.need_refreshData = false
- self:UpdateView()
- else
- self.need_refreshData = true
- end
- end
-
- function PetEvolvePanel:__delete( )
- if self.cost_item then
- UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem,self.cost_item)
- self.cost_item = nil
- end
- end
|