c1_lua/lua/app/ui/bounty/bounty_main_ui.lua
2023-05-16 22:04:17 +08:00

416 lines
14 KiB
Lua

local BountyMainUI = class("BountyMainUI", BaseUI)
function BountyMainUI:getPrefabPath()
return "assets/prefabs/ui/bounty/bounty_main_ui.prefab"
end
function BountyMainUI:ctor()
self.rewardCellIdx = 0
self.rewardCellNum = 0
self.endTime = DataManager.BountyData:getEndTime()
self.previewRewardIndex = 1
local maxLevel = DataManager.BountyData:getMaxLevel()
local info = nil
for i = 2, maxLevel do
info = DataManager.BountyData:getSeasonInfoByLevel(i)
if info == nil then
break
end
if info.reward_type and info.reward_type == 1 then
self.previewRewardIndex = i
break
end
end
end
function BountyMainUI:onClose()
self:clearAdaptScrollrect()
if self.autoRotateTween then
self.autoRotateTween:Kill()
end
self:clearPreviewRewardAnimation()
end
function BountyMainUI:onLoadRootComplete()
local uiMap = self.root:genAllChildren()
self.uiMap = uiMap
local closeBtn = uiMap["bounty_main_ui.bottom_node.close_btn"]
closeBtn:addClickListener(function()
self:closeUI()
end)
self:initTime()
self:initLevel()
self:initPayBtn()
self:initPreviewReward()
self:initRewards()
self:bindData()
self:scheduleGlobal(function()
self:updateTime()
end, 1)
self:updateTime()
end
function BountyMainUI:initTime()
self.timeIcon = self.uiMap["bounty_main_ui.top_node.time_icon"]
self.timeTx = self.uiMap["bounty_main_ui.top_node.time_tx"]
self.timeTx:setText(GConst.EMPTY_STRING)
self.adjustTimeUI = false
end
function BountyMainUI:initLevel()
self.levelSlider = self.uiMap["bounty_main_ui.top_node.progress_bg.slider"]
self.levelItemImg = self.uiMap["bounty_main_ui.top_node.progress_bg.item_img"]
self.levelSliderTx = self.uiMap["bounty_main_ui.top_node.progress_bg.slider_tx"]
self.lvTx = self.uiMap["bounty_main_ui.top_node.progress_bg.lv_img.lv_tx"]
end
function BountyMainUI:initPayBtn()
self.payBtn = self.uiMap["bounty_main_ui.top_node.buy_btn"]
self.payBtnTx = self.uiMap["bounty_main_ui.top_node.buy_btn.tx"]
self.payBtn:addClickListener(function()
ModuleManager.BountyManager:showBountyBuyUI()
end)
end
function BountyMainUI:initPreviewReward()
self.previewReward = self.uiMap["bounty_main_ui.mid_node.preview"]
self.previewRewardCellComp = self.uiMap["bounty_main_ui.mid_node.preview.bg.reward_cell"]:addLuaComponent(GConst.TYPEOF_LUA_CLASS.REWARD_CELL)
self.previewRewardLvTx = self.uiMap["bounty_main_ui.mid_node.preview.bg.lv_tx"]
self.previewRewardNumTx = self.uiMap["bounty_main_ui.mid_node.preview.bg.num_tx"]
local previewRewardLight = self.uiMap["bounty_main_ui.mid_node.preview.bg.light"]
self.autoRotateTween = previewRewardLight:getTransform():DOLocalRotate(BF.Vector3(0, 0, -360), 3, CS.DG.Tweening.RotateMode.FastBeyond360):SetEase(CS.DG.Tweening.Ease.Linear)
self.autoRotateTween:SetLoops(-1)
self.uiMap["bounty_main_ui.mid_node.preview.bg.desc_tx"]:setText(I18N:getGlobalText(I18N.GlobalConst.REWARD_DESC))
end
function BountyMainUI:initRewards()
self:initRepeatReward()
self.adjustRewardsTitleUI = false
local rewardsLeftTitle = self.uiMap["bounty_main_ui.top_node.left"]
rewardsLeftTitle:setAnchoredPositionX(-GConst.UI_SCREEN_WIDTH/4)
self.rewardsLeftTitleIcon = self.uiMap["bounty_main_ui.top_node.left.icon"]
self.rewardsLeftTitleTx = self.uiMap["bounty_main_ui.top_node.left.text"]
local rewardsRightTitle = self.uiMap["bounty_main_ui.top_node.right"]
rewardsRightTitle:setAnchoredPositionX(GConst.UI_SCREEN_WIDTH/4)
self.rewardsRightTitleIcon = self.uiMap["bounty_main_ui.top_node.right.icon"]
self.rewardsRightTitleTx = self.uiMap["bounty_main_ui.top_node.right.text"]
self.line = self.uiMap["bounty_main_ui.mid_node.scrollrect.viewport.content.line"]
local buyLevelItemIcon = self.uiMap["bounty_main_ui.mid_node.scrollrect.viewport.content.line.btn.item"]
local buyLevelItemTx = self.uiMap["bounty_main_ui.mid_node.scrollrect.viewport.content.line.btn.tx"]
local cost = DataManager.BountyData:getBuyBountyLevelCost()
local costId = GFunc.getRewardId(cost)
local info = ConfigManager:getConfig("item")[costId]
if info then
buyLevelItemIcon:setSprite(GConst.ATLAS_PATH.ICON_ITEM, info.icon)
end
local costNum = GFunc.getRewardNum(cost)
buyLevelItemTx:setText(tostring(costNum))
GFunc.centerImgAndTx(buyLevelItemIcon, buyLevelItemTx)
self.buyLevelBtn = self.uiMap["bounty_main_ui.mid_node.scrollrect.viewport.content.line.btn"]
self.buyLevelBtn:addClickListener(function()
ModuleManager.BountyManager:buyBountyLevel()
end)
self.scrollrect = self.uiMap["bounty_main_ui.mid_node.scrollrect"]
self.scrollrectViewport = self.uiMap["bounty_main_ui.mid_node.scrollrect.viewport"]
self.rewardsContent = self.uiMap["bounty_main_ui.mid_node.scrollrect.viewport.content"]
self.scrollrectComp = self.scrollrect:addLuaComponent(GConst.TYPEOF_LUA_CLASS.SCROLL_RECT_BASE)
self.scrollrectComp:clearCells()
self.scrollrectComp:setTotalCount(0)
self.scrollrectComp:setFadeArgs(0, 0.3)
self.scrollrectComp:addInitCallback(function()
return "app/ui/bounty/cell/bounty_cell"
end)
self.scrollrectComp:addRefreshCallback(function(index, cell)
-- TODO 有时候顺序还是不对
if self.refreshIndex then
if index > self.refreshIndex then
cell:getBaseObject():getTransform():SetAsLastSibling()
elseif index < self.refreshIndex then
cell:getBaseObject():getTransform():SetAsFirstSibling()
end
end
self.refreshIndex = index
local totalCount = self.scrollrectComp:getTotalCount()
local isFinalCell = index == totalCount
if isFinalCell then
self.rewardCellIdx = index
self:hidePreviewReward()
else
if index > self.rewardCellIdx then
self.rewardCellIdx = index
self:showNextPreviewReward()
elseif index < self.rewardCellIdx - self.rewardCellNum then
self.rewardCellIdx = index + self.rewardCellNum
self:showNextPreviewReward()
end
end
cell:refresh(index, isFinalCell)
local lv = DataManager.BountyData:getLevel()
if index > lv - 1 or index < lv + 1 then
self.line:getTransform():SetAsLastSibling()
end
if not self.adjustRepeatRewardRoot then
self.adjustRepeatRewardRoot = true
local posY = -totalCount*self.cellHeight
self.repeatRewardRoot:setAnchoredPositionY(posY)
end
self.repeatRewardRoot:getTransform():SetAsLastSibling()
end)
self.cellHeight = 200
local scrollBottom = 106
local scrollTop = 464
local height = self.root:getRectHeight()
height = height - scrollTop - scrollBottom
self.rewardCellNum = math.ceil(height/self.cellHeight)
self:adaptScrollrect()
end
function BountyMainUI:initRepeatReward()
self.adjustRepeatRewardRoot = false
self.repeatRewardRoot = self.uiMap["bounty_main_ui.mid_node.scrollrect.viewport.content.repeat"]
self.uiMap["bounty_main_ui.mid_node.scrollrect.viewport.content.repeat.title_tx"]:setText("临时文本:奖励宝箱")
self.uiMap["bounty_main_ui.mid_node.scrollrect.viewport.content.repeat.desc_tx"]:setText("临时文本:当你完成通行证的所有内容,每1000个积分可以获取一个奖励宝箱")
self.repeatBox = self.uiMap["bounty_main_ui.mid_node.scrollrect.viewport.content.repeat.box"]
self.repeatBox:addClickListener(function()
if DataManager.BountyData:getIfCanClaimRepeatReward() then
local level = DataManager.BountyData:getLevel()
ModuleManager.BountyManager:claimReward(level, false)
else
GFunc.showToast("显示宝箱tips")
end
end)
end
function BountyMainUI:adaptScrollrect()
if not self.rectDefaultSize then
self.rectDefaultSize = self.scrollrect:getSizeDelta()
end
if not self.viewDefaultSize then
self.viewDefaultSize = self.scrollrectViewport:getSizeDelta()
end
local addH = GFunc.calculateFitSizeY()
self.scrollrect:setSizeDelta(self.rectDefaultSize.x, self.rectDefaultSize.y + addH)
self.scrollrectViewport:setSizeDelta(self.viewDefaultSize.x, self.viewDefaultSize.y + addH)
end
function BountyMainUI:clearAdaptScrollrect()
if not self.rectDefaultSize then
return
end
self.scrollrect:setSizeDelta(self.rectDefaultSize.x, self.rectDefaultSize.y)
self.scrollrectViewport:setSizeDelta(self.viewDefaultSize.x, self.viewDefaultSize.y)
end
function BountyMainUI:bindData()
self:bind(DataManager.BountyData, "dirty", function()
self:onRefresh()
end)
end
function BountyMainUI:onRefresh()
self:refreshLv()
self:refreshPayBtn()
self:refreshPreviewReward(self.previewRewardIndex)
self:refreshRewards()
end
function BountyMainUI:refreshLv()
local exp = DataManager.BountyData:getExp()
local lvUpExp = DataManager.BountyData:getLvUpExp()
local level = DataManager.BountyData:getLevel()
local maxLevel = DataManager.BountyData:getMaxLevel()
self.levelSliderTx:setText(exp .. "/" .. lvUpExp)
self.levelSlider:getComponent(GConst.TYPEOF_UNITY_CLASS.BF_SLIDER).value = exp / lvUpExp
if level >= maxLevel then
self.lvTx:setText("临时文本:MAX")
else
self.lvTx:setText(tostring(level))
end
local expItemIcon = DataManager.BountyData:getExpItemIcon()
self.levelItemImg:setSprite(GConst.ATLAS_PATH.ICON_ITEM, expItemIcon)
end
function BountyMainUI:refreshPayBtn()
if DataManager.BountyData:getBought() then
self.payBtn:setTouchEnable(false)
self.payBtnTx:setText("临时文本:已激活")
else
self.payBtn:setTouchEnable(true)
self.payBtnTx:setText("临时文本:激活黄金通行证")
end
end
function BountyMainUI:refreshPreviewReward(idx)
local info = DataManager.BountyData:getSeasonInfoByLevel(idx)
if info == nil then
return
end
self.previewRewardCellComp:refreshByConfig(info.reward_pro)
self.previewRewardNumTx:setText("临时文本:X" .. GFunc.getRewardNum(info.reward_pro))
self.previewRewardLvTx:setText("临时文本:等级" .. idx)
end
function BountyMainUI:refreshRewards()
self.rewardsLeftTitleTx:setText("临时文本:免费通行证")
self.rewardsRightTitleTx:setText("临时文本:黄金通行证")
if not self.adjustRewardsTitleUI then
self.adjustRewardsTitleUI = true
GFunc.centerImgAndTx(self.rewardsLeftTitleIcon, self.rewardsLeftTitleTx)
GFunc.centerImgAndTx(self.rewardsRightTitleIcon, self.rewardsRightTitleTx)
end
local maxLv = DataManager.BountyData:getMaxLevel()
local lv = DataManager.BountyData:getLevel()
if self.scrollrectComp:getTotalCount() <= 0 then
self.scrollrectComp:refillCells(maxLv)
else
self.scrollrectComp:updateAllCell()
end
if lv >= maxLv then
self.line:setVisible(false)
else
self.line:setVisible(true)
local posY = -lv*self.cellHeight
self.line:setAnchoredPositionY(posY)
end
if DataManager.BountyData:getIfCanClaimRepeatReward() then
self.repeatRewardRoot:addRedPoint(74, 15)
else
self.repeatRewardRoot:removeRedPoint()
end
end
function BountyMainUI:showNextPreviewReward()
local nextRewardIndex = -1
local maxLevel = DataManager.BountyData:getMaxLevel()
for i = self.rewardCellIdx, maxLevel do
local info = DataManager.BountyData:getSeasonInfoByLevel(i)
if info and info.reward_type and info.reward_type == 1 then
nextRewardIndex = i
break
end
end
if self.previewRewardIndex == nextRewardIndex then
return
end
self.previewRewardIndex = nextRewardIndex
if nextRewardIndex <= 0 then
self:hidePreviewReward()
else
self.previewReward:setVisible(true)
self:showPreviewRewardAnimation()
end
end
function BountyMainUI:showPreviewRewardAnimation()
local time = 0.3
local maxY = 106
local moveOutTime = 0
local posY = self.previewReward:getAnchoredPositionY()
if posY > 0.1 then
moveOutTime = time/maxY*posY
if self.previewRewardMoveOutTween == nil then
self.previewRewardMoveOutTween = self.previewReward:getTransform():DOAnchorPosY(0, moveOutTime):SetEase(CS.DG.Tweening.Ease.InCubic)
self.previewRewardMoveOutTween:SetAutoKill(false)
else
local CacheVector2 = BF.CacheVector2
CacheVector2.x = 0
CacheVector2.y = 0
self.previewRewardMoveOutTween:ChangeEndValue(CacheVector2, moveOutTime, true)
self.previewRewardMoveOutTween:Restart()
end
end
if self.showPreviewRewardSid then
self:unscheduleGlobal(self.showPreviewRewardSid)
end
self.showPreviewRewardSid = self:performWithDelayGlobal(function()
self.showPreviewRewardSid = nil
if self.previewRewardIndex > 0 then
self:refreshPreviewReward(self.previewRewardIndex)
end
if self.previewRewardMoveInTween == nil then
self.previewRewardMoveInTween = self.previewReward:getTransform():DOAnchorPosY(maxY, time):SetEase(CS.DG.Tweening.Ease.InCubic)
self.previewRewardMoveInTween:SetAutoKill(false)
else
local CacheVector2 = BF.CacheVector2
CacheVector2.x = 0
CacheVector2.y = maxY
self.previewRewardMoveInTween:ChangeEndValue(CacheVector2, time, true)
self.previewRewardMoveInTween:Restart()
end
end, moveOutTime)
end
function BountyMainUI:hidePreviewReward()
self.previewReward:setVisible(false)
if self.previewRewardMoveOutTween then
self.previewRewardMoveOutTween:Pause()
end
if self.previewRewardMoveInTween then
self.previewRewardMoveInTween:Pause()
end
self.previewReward:setAnchoredPositionY(0)
end
function BountyMainUI:clearPreviewRewardAnimation()
if self.previewRewardMoveInTween then
self.previewRewardMoveInTween:Kill()
self.previewRewardMoveInTween = nil
end
if self.previewRewardMoveOutTween then
self.previewRewardMoveOutTween:Kill()
self.previewRewardMoveOutTween = nil
end
if self.showPreviewRewardSid then
self:unscheduleGlobal(self.showPreviewRewardSid)
self.showPreviewRewardSid = nil
end
end
function BountyMainUI:scrollToIndex(targetIndex)
local maxLv = DataManager.BountyData:getMaxLevel()
local cellHeight = self.cellHeight
local cellListHeight = self.scrollView:getTransform().rect.height
local posY = cellHeight*(targetIndex - 6)
local targetPosY = cellHeight*(targetIndex - 1)
targetPosY = math.min(targetPosY, maxLv*cellHeight - cellListHeight)
if self.scrollSid then
self:unscheduleGlobal(self.scrollSid)
self.scrollSid = nil
end
if targetIndex <= 6 then
self.scrollrectComp:moveToIndex(targetIndex)
else
self.scrollrectComp:moveToIndex(targetIndex - 6)
self.scrollSid = self:scheduleGlobal(function(inter)
posY = posY + 40*inter/0.015
if posY >= targetPosY then
posY = targetPosY
end
self.rewardsContent:setAnchoredPositionY(posY)
if posY >= targetPosY then
self:unscheduleGlobal(self.scrollSid)
self.scrollSid = nil
end
end, 0)
end
end
function BountyMainUI:updateTime()
local remainTime = self.endTime - Time:getServerTime()
if remainTime < 0 then
UIManager:closeUnderUI(self)
return self:closeUI()
end
self.timeTx:setText(GFunc.getTimeStr(remainTime))
if not self.adjustTimeUI then
self.adjustTimeUI = true
GFunc.centerImgAndTx(self.timeIcon, self.timeTx)
end
end
return BountyMainUI