From f4724ca43483c98bcb0edd3b961e20a7e8ace0bd Mon Sep 17 00:00:00 2001 From: chenxi Date: Tue, 16 May 2023 22:02:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=98=E4=BB=A4=E9=87=8D=E5=A4=8D=E5=A5=96?= =?UTF-8?q?=E5=8A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/app/bf/unity/unity.lua | 3 + lua/app/ui/bounty/bounty_main_ui.lua | 221 +++++++++++++----- lua/app/ui/bounty/cell/bounty_reward_cell.lua | 4 +- lua/app/userdata/bounty/bounty_data.lua | 26 ++- 4 files changed, 182 insertions(+), 72 deletions(-) diff --git a/lua/app/bf/unity/unity.lua b/lua/app/bf/unity/unity.lua index ed7c0677..26bdaa04 100644 --- a/lua/app/bf/unity/unity.lua +++ b/lua/app/bf/unity/unity.lua @@ -17,6 +17,9 @@ BF.Vector3Zero = CS.UnityEngine.Vector3(0, 0, 0) BF.Vector3Right = CS.UnityEngine.Vector3(1, 0, 0) BF.Vector3Up = CS.UnityEngine.Vector3(0, 1, 0) BF.Vector3Forward = CS.UnityEngine.Vector3(0, 0, 1) +BF.CacheVector2 = CS.UnityEngine.Vector2(0, 0) +BF.CacheVector3 = CS.UnityEngine.Vector3(0, 0, 0) + BF.Color = function(r, g, b, a) return {r = r, g = g, b = b, a = a} diff --git a/lua/app/ui/bounty/bounty_main_ui.lua b/lua/app/ui/bounty/bounty_main_ui.lua index c24ffb9d..59debea7 100644 --- a/lua/app/ui/bounty/bounty_main_ui.lua +++ b/lua/app/ui/bounty/bounty_main_ui.lua @@ -5,15 +5,30 @@ function BountyMainUI:getPrefabPath() end function BountyMainUI:ctor() - self.maxCellIdx = 0 - self.maxCellNum = 0 + self.rewardCellIdx = 0 + self.rewardCellNum = 0 self.endTime = DataManager.BountyData:getEndTime() - -- 默认预览第10档奖励 - self.previewRewardIndex = 10 + 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() @@ -62,14 +77,16 @@ 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.uiMap["bounty_main_ui.mid_node.preview.bg"]:addClickListener(function() - if not self.inPreviewRewardAction then - self:scrollToIndex(self.previewRewardIndex) - end - end) + 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) @@ -117,29 +134,58 @@ function BountyMainUI:initRewards() end end self.refreshIndex = index - - if index > self.maxCellIdx then - self.maxCellIdx = index - self:showLevelNextCell() - elseif index < self.maxCellIdx - self.maxCellNum then - self.maxCellIdx = index + self.maxCellNum - self:showLevelNextCell() + 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 - cell:refresh(index, index == self.scrollrectComp:getTotalCount()) + 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.maxCellNum = math.ceil(height/self.cellHeight) + 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() @@ -177,9 +223,14 @@ 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 - self.lvTx:setText(tostring(level)) + 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 @@ -200,6 +251,8 @@ function BountyMainUI:refreshPreviewReward(idx) 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() @@ -224,55 +277,99 @@ function BountyMainUI:refreshRewards() 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:showLevelNextCell() - -- local minIdx = self.maxCellIdx - -- local showMyCell = -1 - -- for i = minIdx, minIdx + 10 do - -- local cfg = DataManager.BountyData:getSeasonCfgByLevel(i) - -- if cfg and cfg.reward_type and cfg.reward_type == 1 then - -- showMyCell = i - -- break - -- end - -- end - -- if self.previewRewardIndex == showMyCell then - -- return - -- end - -- self.previewRewardIndex = showMyCell - -- if showMyCell <= 0 then - -- self.rewardMyCellComp3:setVisible(false) - -- self.rewardMyCell3:setAnchoredPositionY(0) - -- else - -- self.rewardMyCellComp3:setVisible(true) - -- self:showMyCellAction() - -- 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:showMyCellAction() - -- self.inPreviewRewardAction = true - -- if self.rewardMyCell3.aniSeq then - -- self.rewardMyCell3.aniSeq:Kill() - -- end - -- local time = 0.3 - -- local maxY = 134 - -- local posY = self.rewardMyCell3:getAnchoredPositionY() +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 - -- local aniSeq = self.rewardMyCell3:createBindTweenSequence() - -- if posY > 0 then - -- aniSeq:Append(self.rewardMyCell3:getTransform():DOAnchorPosY(0, time/maxY*posY):SetEase(CS.DG.Tweening.Ease.InCubic)) - -- end - -- aniSeq:AppendCallback(function() - -- if self.previewRewardIndex > 0 then - -- self.rewardMyCellComp3:refresh(self.previewRewardIndex) - -- end - -- end) - -- aniSeq:Append(self.rewardMyCell3:getTransform():DOAnchorPosY(maxY, time):SetEase(CS.DG.Tweening.Ease.InCubic)) - -- aniSeq:AppendCallback(function() - -- self.inPreviewRewardAction = false - -- 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 - -- self.rewardMyCell3.aniSeq = aniSeq +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) diff --git a/lua/app/ui/bounty/cell/bounty_reward_cell.lua b/lua/app/ui/bounty/cell/bounty_reward_cell.lua index fe4b5cb9..73b7638f 100644 --- a/lua/app/ui/bounty/cell/bounty_reward_cell.lua +++ b/lua/app/ui/bounty/cell/bounty_reward_cell.lua @@ -24,9 +24,9 @@ end function BountyRewardCell:refresh(reward, isPro, isLock, showCheck) self:showCheck(showCheck) if isPro then - self.bg:setSprite(GConst.ATLAS_PATH.BOUNTY, "bounty_board_1") - else self.bg:setSprite(GConst.ATLAS_PATH.BOUNTY, "bounty_board_2") + else + self.bg:setSprite(GConst.ATLAS_PATH.BOUNTY, "bounty_board_1") end if isLock then self.lock:setVisible(true) diff --git a/lua/app/userdata/bounty/bounty_data.lua b/lua/app/userdata/bounty/bounty_data.lua index c2bc9e2e..541d8323 100644 --- a/lua/app/userdata/bounty/bounty_data.lua +++ b/lua/app/userdata/bounty/bounty_data.lua @@ -101,13 +101,12 @@ end function BountyData:addExp(num) self.exp = self.exp + num - local lvUpExp = self:getLvUpExp() - local maxLv = self:getMaxLevel() - while self.exp >= lvUpExp do - self.exp = self.exp - lvUpExp - self.level = self.level + 1 - if self.level >= maxLv then - self.level = maxLv + while true do + local lvUpExp = self:getLvUpExp() + if self.exp >= lvUpExp then + self.exp = self.exp - lvUpExp + self.level = self.level + 1 + else break end end @@ -117,7 +116,7 @@ end function BountyData:getLvUpExp() local info = self:getSeasonInfoByLevel(self.level) if info == nil then - return 1 + return self.repeatLevelInfo and self.repeatLevelInfo.exp or 1 end return info.exp end @@ -161,6 +160,17 @@ function BountyData:getIfCanBuyLevel() return false end +function BountyData:getIfCanClaimRepeatReward() + local maxLevel = self:getMaxLevel() + if maxLevel <= 0 then + return false + end + if self.level <= maxLevel then + return false + end + return not self:getLevelState(self.level) +end + function BountyData:onClaimReward(level) self.claimed[level] = true self:markDirty()