c1_lua/lua/app/ui/bounty/bounty_main_ui.lua
2023-05-17 11:14:07 +08:00

440 lines
15 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()
if self.rewardsContentMoveTween then
self.rewardsContentMoveTween:Kill()
end
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: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 not self.disablePreviewReward then
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
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 = self.uiMap["bounty_main_ui.mid_node.scrollrect.viewport.content.cell"]:getRectHeight()
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)
local level = DataManager.BountyData:getMinUnclaimedRewardIndex()
if level > 1 then
self:scrollToIndex(level)
end
else
self.disablePreviewReward = true
self.scrollrectComp:updateAllCell()
self.disablePreviewReward = false
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)
-- 未避免scrollrect没填充完毕延迟一帧执行
if self.rewardsContentSid then
self:unscheduleGlobal(self.rewardsContentSid)
end
self.rewardsContentSid = self:performWithDelayGlobal(function()
self.rewardsContentSid = nil
if self.rewardsContentMaxY == nil then
local maxLv = DataManager.BountyData:getMaxLevel()
self.rewardsContentMaxY = maxLv*self.cellHeight - self.scrollrectViewport:getRectHeight()
end
-- 最多移动6格,超过6格就先整体移动后再移动6格
local moveTimePerCell = 0.05
local moveCount = 6
local moveTime = moveCount * moveTimePerCell
if targetIndex > 7 then
local tartgetY = (targetIndex - 7)*self.cellHeight
if tartgetY > self.rewardsContentMaxY then
self.rewardsContent:setAnchoredPositionY(self.rewardsContentMaxY)
return
else
self.rewardsContent:setAnchoredPositionY(tartgetY)
end
else
moveTime = (targetIndex - 1) * moveTimePerCell
end
local y = (targetIndex - 1) * self.cellHeight
if y > self.rewardsContentMaxY then
y = self.rewardsContentMaxY
end
if self.rewardsContentMoveTween == nil then
self.rewardsContentMoveTween = self.rewardsContent:getTransform():DOAnchorPosY(y, moveTime)
self.rewardsContentMoveTween:SetAutoKill(false)
else
local CacheVector2 = BF.CacheVector2
CacheVector2.x = 0
CacheVector2.y = y
self.rewardsContentMoveTween:ChangeEndValue(CacheVector2, moveTime, true)
self.rewardsContentMoveTween:Restart()
end
end, 0)
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