107 lines
3.1 KiB
Lua
107 lines
3.1 KiB
Lua
|
|
local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
|
|
local PANEL_ID = PanelId.MissionTracker
|
|
MissionTrackerCtrl = HL.Class('MissionTrackerCtrl', uiCtrl.UICtrl)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MissionTrackerCtrl.s_messages = HL.StaticField(HL.Table) << {
|
|
|
|
}
|
|
|
|
MissionTrackerCtrl.m_trackerData = HL.Field(HL.Table)
|
|
MissionTrackerCtrl.m_trackers = HL.Field(HL.Table)
|
|
MissionTrackerCtrl.m_trackersCache = HL.Field(HL.Table)
|
|
|
|
|
|
MissionTrackerCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
|
|
if self.m_trackers == nil then
|
|
self.m_trackers = {}
|
|
end
|
|
if self.m_trackersCache == nil then
|
|
self.m_trackersCache = {}
|
|
end
|
|
self.view.tracker.gameObject:SetActive(false)
|
|
self:_StartCoroutine(self:_Tick())
|
|
end
|
|
|
|
MissionTrackerCtrl._Tick = HL.Method().Return(HL.Function) << function(self)
|
|
return function()
|
|
while true do
|
|
self:_UpdateMissionTrackers()
|
|
coroutine.step()
|
|
end
|
|
end
|
|
end
|
|
|
|
MissionTrackerCtrl.UpdateEntityHeadPointDict = HL.Method(HL.Table) << function(self, arg)
|
|
self.m_trackerData = arg
|
|
end
|
|
|
|
MissionTrackerCtrl._UpdateMissionTrackers = HL.Method() << function(self)
|
|
local targetScrPosDict = {}
|
|
local targetDistanceDict = {}
|
|
local targetRadiusDict = {}
|
|
local logicIdList = {}
|
|
|
|
self:Notify(MessageConst.UPDATE_MISSION_TRACKER)
|
|
|
|
for _, data in pairs(self.m_trackerData) do
|
|
local screenPos, isInside = UIUtils.objectPosToUI(data.worldPos, self.uiCamera)
|
|
table.insert(targetScrPosDict, screenPos)
|
|
table.insert(targetDistanceDict, data.distance)
|
|
table.insert(targetRadiusDict, data.radius)
|
|
end
|
|
|
|
if #self.m_trackers > #targetScrPosDict then
|
|
for i = #self.m_trackers, #targetScrPosDict+1, -1 do
|
|
self.m_trackers[i].obj:SetActive(false)
|
|
table.insert(self.m_trackersCache, self.m_trackers[i])
|
|
table.remove(self.m_trackers, i)
|
|
end
|
|
end
|
|
|
|
if #self.m_trackers < #targetScrPosDict then
|
|
for i = #self.m_trackers + 1, #targetScrPosDict do
|
|
table.insert(self.m_trackers, self:_CreateNewTracker())
|
|
end
|
|
end
|
|
|
|
for i = 1, #targetScrPosDict do
|
|
local item = self.m_trackers[i]
|
|
if item then
|
|
local uiPos, uiAngle, isOutBound = UIUtils.mapScreenPosToEllipseEdge(targetScrPosDict[i], self.view.config.ELLIPSE_X_RADIUS, self.view.config.ELLIPSE_Y_RADIUS)
|
|
item.tracker:UpdatePosition(uiPos, uiAngle, isOutBound, targetDistanceDict[i], targetRadiusDict[i])
|
|
end
|
|
end
|
|
end
|
|
|
|
MissionTrackerCtrl._CreateNewTracker = HL.Method().Return(HL.Table) << function(self)
|
|
local cacheCount = #self.m_trackersCache
|
|
if cacheCount > 0 then
|
|
local cacheObj = self.m_trackersCache[cacheCount]
|
|
cacheObj.obj:SetActive(true)
|
|
table.remove(self.m_trackersCache, cacheCount)
|
|
return cacheObj
|
|
end
|
|
local obj = CSUtils.CreateObject(self.view.tracker.gameObject, self.view.main.transform)
|
|
obj:SetActive(true)
|
|
local item = {}
|
|
item.obj = obj
|
|
item.tracker = obj:GetComponent(typeof(CS.Beyond.UI.UIMissionTracker))
|
|
return item
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HL.Commit(MissionTrackerCtrl)
|