PGRData/Script/matrix/xui/xuifightinfestorexplore/XUiFightInfestorExplore.lua

240 lines
8.3 KiB
Lua
Raw Normal View History

local XUiFightInfestorExplore = XLuaUiManager.Register(XLuaUi, "UiFightInfestorExplore")
local XUiGridFightInfestorRuler = require("XUi/XUiFightInfestorExplore/XUiGridFightInfestorRuler")
local XUiGridFightInfestorPlayer = require("XUi/XUiFightInfestorExplore/XUiGridFightInfestorPlayer")
local DYNAMIC_DELEGATE_EVENT = DYNAMIC_DELEGATE_EVENT
local table = table
local math = math
local Vector3 = CS.UnityEngine.Vector3
function XUiFightInfestorExplore:OnAwake()
self:InitComponent()
end
function XUiFightInfestorExplore:InitComponent()
self.BrokePlayerIndexList = {}
self.PlayerItemList = {}
self.RemoveItemList = {}
self.PlayerItem.gameObject:SetActiveEx(false)
self.ScrollViewHeight = self.ScrollViewList.rect.height
self.RulerHeight = self.Ruler.sizeDelta.y
self.DynamicTable = XDynamicTableNormal.New(self.ScrollViewList.gameObject)
self.DynamicTable:SetProxy(XUiGridFightInfestorRuler)
self.DynamicTable:SetDelegate(self)
local playerLayerPos = self.PlayerLayer.transform.localPosition
self.PlayerLayer.transform.localPosition = Vector3(playerLayerPos.x, 0, playerLayerPos.z)
self.PanelEffect.gameObject:SetActive(false)
self.PanelEffectLoader:SetLoadedCallback(function() self:OnEffectLoaded() end)
end
function XUiFightInfestorExplore:OnEnable()
self:RefreshView()
end
function XUiFightInfestorExplore:OnDisable()
self:RemoveTimer()
end
function XUiFightInfestorExplore:OnDestroy()
self:RemoveTimer()
end
function XUiFightInfestorExplore:OnGetEvents()
return { XEventId.EVENT_FIGHT_INFESTOR_SCORE_CHANGE}
end
function XUiFightInfestorExplore:OnNotify(evt)
if evt == XEventId.EVENT_FIGHT_INFESTOR_SCORE_CHANGE then
self:UpdateScrollViewOffset()
end
end
function XUiFightInfestorExplore:AddTimer()
self:RemoveTimer()
self.scheduleId = XScheduleManager.ScheduleForever(function()
self:CheckRemoveItemList()
local lastScore = self.Score
self.Score = XDataCenter.FightInfestorExploreManager.CalcScore(self.Score)
if lastScore ~= self.Score then
XDataCenter.FightInfestorExploreManager.SetScore(self.Score)
self:UpdateScrollViewOffset(self.Score)
self:RefreshScoreText()
end
end, XDataCenter.FightInfestorExploreManager.COLLECT_SCORE_TIME)
end
function XUiFightInfestorExplore:RemoveTimer()
if self.scheduleId then
XScheduleManager.UnSchedule(self.scheduleId)
self.scheduleId = nil
end
end
--动态列表事件
function XUiFightInfestorExplore:OnDynamicTableEvent(event, index, grid)
if event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_INIT or event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_ATINDEX then
local topNum = self.ListDataRuler[index]
grid:Refresh(topNum)
elseif event == DYNAMIC_DELEGATE_EVENT.DYNAMIC_GRID_RELOAD_COMPLETED then
self:OnListLoaded()
end
end
function XUiFightInfestorExplore:RefreshView()
self.Score = XDataCenter.FightInfestorExploreManager.GetScore()
self.ScoreFloor = XDataCenter.FightInfestorExploreManager.GetScoreFloor(self.Score)
self.ScoreGap = XDataCenter.FightInfestorExploreManager.GetScoreGap()
self:RefreshScoreText()
self.ListDataPlayer = XDataCenter.FightInfestorExploreManager.GetPlayerList()
self.ListDataRuler = XDataCenter.FightInfestorExploreManager.GetRulerList(self.ListDataPlayer)
self.TotalRulerHeight = self.RulerHeight * #self.ListDataRuler
self.DynamicTable:SetDataSource(self.ListDataRuler)
self.DynamicTable:ReloadDataASync()
self:AddTimer()
end
function XUiFightInfestorExplore:OnListLoaded()
self.DynamicTable:Freeze()
self.PlayerLayerSize = self.PanelContent.sizeDelta
self.PlayerLayer.sizeDelta = self.PlayerLayerSize
self:RefreshPlayerList()
self:UpdateScrollViewOffset(self.Score)
end
function XUiFightInfestorExplore:RefreshScoreText()
self.TextSelfNum.text = XDataCenter.FightInfestorExploreManager.GetScoreStr(self.Score)
end
-- 设置列表偏移
function XUiFightInfestorExplore:UpdateScrollViewOffset(score)
self.PosRate = (score - self.ScoreFloor) / self.ScoreGap
local offsetY = self.PosRate * self.RulerHeight
local normalizedPosition = offsetY / self.TotalRulerHeight
if normalizedPosition > 1 or normalizedPosition < 0 then
XLog.Error("列表位置超出范围 normalizedPosition:" .. tostring(normalizedPosition))
end
-- XLog.Debug(" normalizedPosition " .. tostring(normalizedPosition) .. ", olde =" .. tostring(self.ScrollRect.verticalNormalizedPosition))
self.ScrollRect.verticalNormalizedPosition = math.max(0, math.min(1, normalizedPosition))
self:CheckPlayerBroken()
end
-- 设置列表偏移
function XUiFightInfestorExplore:GetPosYByScore(score)
local offsetY = (score - self.ScoreFloor) / self.ScoreGap * self.RulerHeight
local originY = self.TotalRulerHeight - self.ScrollViewHeight
if originY < 0 then
originY = 0
XLog.Error("刻度数量过少,不足一页: " .. tostring(#self.ListDataRuler) .. "/" .. tostring(math.ceil(self.ScrollViewHeight / self.RulerHeight)))
end
local posY = originY - offsetY
return posY
end
function XUiFightInfestorExplore:GetPlayerItem(index)
local item = self.PlayerItemList[index]
if not item then
local go = CS.UnityEngine.Object.Instantiate(self.PlayerItem)
go.transform:SetParent(self.PlayerLayer, false)
item = XUiGridFightInfestorPlayer.New(self, go)
self.PlayerItemList[index] = item
end
return item
end
function XUiFightInfestorExplore:ResetPlayerItemAll(len)
if #self.PlayerItemList > len then
for i = len + 1, #self.PlayerItemList do
self.PlayerItemList[i].gameObject:SetActiveEx(false)
end
end
end
-- 创建玩家头像
function XUiFightInfestorExplore:RefreshPlayerList()
local list = self.ListDataPlayer
self:ResetPlayerItemAll(#list)
for i, data in ipairs(list) do
local item = self:GetPlayerItem(i)
local posY = data:GetPosRate() * self.RulerHeight - self.PlayerLayerSize.y
item.Transform.localPosition = Vector3(item.Transform.localPosition.x, posY)
item.GameObject:SetActiveEx(true)
item:Refresh(data)
end
return (#list > 0)
end
function XUiFightInfestorExplore:CheckPlayerBroken()
local list = self.ListDataPlayer
local posY
for index = #list, 1, -1 do
local data = list[index]
if data:GetScore() <= self.Score then
table.remove(list, index)
local item = self.PlayerItemList[index]
if item then
if not posY then
posY = self:GetPosYByScore(self.Score)
end
item.Transform.localPosition = Vector3(item.Transform.localPosition.x, -self.RulerHeight)
table.insert(self.BrokePlayerIndexList, index)
else
XLog.Error("消失的同组玩家不存在 i:" .. tostring(index))
end
end
end
self:DoPlayerBroken()
end
function XUiFightInfestorExplore:DoPlayerBroken()
if #self.BrokePlayerIndexList == 0 then
return
end
self.PanelEffect.gameObject:SetActive(false)
self.PanelEffect.gameObject:SetActive(true)
local index = self.BrokePlayerIndexList[1]
local item = self.PlayerItemList[index]
local rawImage = item:GetRawImage()
if self:PlayEffect(rawImage) then
table.remove(self.PlayerItemList, index)
table.remove(self.BrokePlayerIndexList, 1)
table.insert(self.RemoveItemList, item)
end
end
function XUiFightInfestorExplore:OnEffectLoaded()
local go = self.PanelEffect.gameObject:FindGameObject("01")
self.EffectRenderer = go:GetComponent("Renderer")
self:DoPlayerBroken()
end
function XUiFightInfestorExplore:PlayEffect(rawImage)
if XTool.UObjIsNil(rawImage) or XTool.UObjIsNil(rawImage.texture) then
return true
end
if not self.EffectRenderer then
return false
end
self.EffectRenderer.sharedMaterial:SetTexture("_MainTex", rawImage.texture)
return true
end
function XUiFightInfestorExplore:CheckRemoveItemList()
if #self.RemoveItemList > 0 then
local item = table.remove(self.RemoveItemList, 1)
if item and not XTool.UObjIsNil(item.GameObject) then
CS.UnityEngine.Object.Destroy(item.GameObject)
end
end
end