源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

302 lines
11 KiB

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