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"]:setAnchoredPositionX(-GConst.UI_SCREEN_WIDTH/2 + 8) 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