|
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
|