源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

195 lines
4.6 KiB

SysInfoExpView = SysInfoExpView or BaseClass()
local SysInfoExpView = SysInfoExpView
local math_min = math.min
local math_abs = math.abs
function SysInfoExpView:__init()
self.msg_cache_list = Array.New() --消息列表缓存池
self.msg_list = {} --当前消息列表
self.msg_id = 0
self.wnd_cache_list = Array.New() --消息对象缓存池
self.message_wnd_list = {} --当前消息对象
self.last_update_time = 0 --更新频率限制
self.move_dist = 100 --移动距离
self.speed = 180 --移动速度
self.max_msg_count = 5 --最大数量
self.prefab_asset = nil
self:LoadAsset()
Runner:getInstance():AddRunObj(self)
end
function SysInfoExpView:LoadAsset()
local function call_back(objs)
self.prefab_asset = objs[0]
self:CreateMessageContainer()
end
lua_resM:loadPrefab(self,"message","ExpMessageItem", call_back)
end
function SysInfoExpView:__delete()
local size = self.wnd_cache_list:GetSize()
for i=0,size-1 do
local item = self.wnd_cache_list:PopFront()
item:DeleteMe()
item = nil
end
self.wnd_cache_list = nil
for k,v in pairs(self.message_wnd_list) do
v:DeleteMe()
end
self.message_wnd_list = {}
end
--预先创建消息对象
function SysInfoExpView:CreateMessageContainer()
if self.prefab_asset then
local item = nil
for index = 1, self.max_msg_count do
item = ExpMessageItem.New(panelMgr:GetParent("Top"),self.prefab_asset)
self.wnd_cache_list:PushBack(item)
end
end
end
--实时获取消息对象
function SysInfoExpView:CreateMessageItem( id, info )
local item = self.message_wnd_list[id]
if item then
if not item.has_data then
item:SetData(info)
end
else
local item = self.wnd_cache_list:PopFront()
if item then
self.message_wnd_list[id] = item
if not item.has_data then
item:SetData(info)
end
end
end
return item
end
function SysInfoExpView:Update(now_time, elapse_time)
if now_time - self.last_update_time < 0.03 then
return
end
self.last_update_time = now_time
for id, info in pairs(self.msg_list) do
if info and info.start_time < now_time then
local p = 0
if info.dist >= self.move_dist then
info.dead = true
else
local dist = elapse_time * self.speed
info.dist = info.dist + dist
p = info.dist / self.move_dist
if p > 1 then
p = 1
end
info.pos_y = info.pos_y + dist
end
if info.dead then
local item = self.message_wnd_list[id]
if item then
self:CacheItem(item)
self.message_wnd_list[id] = nil
end
self:CacheInfo(info)
self.msg_list[id] = nil
else
-- local item = self:CreateMessageItem(id, info)
local item = self.message_wnd_list[id]
if item then
if not item.has_data then
item:SetData(info)
end
else
local item = self.wnd_cache_list:PopFront()
if item then
self.message_wnd_list[id] = item
if not item.has_data then
item:SetData(info)
end
end
end
if item then
-- item.canvasGroup.alpha = 1 - (p * p * 1)
if SceneManager.Instance:IsBeachScene() or SceneManager.Instance:IsGuildScene() then
SetLocalPosition(item.transform, 0, info.pos_y+ScreenHeight * 0.39, ExpMessageItem.PosZ)
else
SetLocalPosition(item.transform, ExpMessageItem.PosX, info.pos_y, ExpMessageItem.PosZ)
end
end
end
end
end
end
--is_normal标识不需要经验字体,用普通字体样式
function SysInfoExpView:AppendMessage(content, percent, is_normal, is_score)
if not self.prefab_asset then
return
end
--最多缓存消息
if TableSize(self.msg_list) > 6 then
return
end
local info = self.msg_cache_list:PopFront()
if info then
info.content = content
info.percent = percent
info.start_time = Time.time
info.pos_y = ExpMessageItem.PosY
info.dead = false
info.dist = 0
else
info = {
content = content or 0,
percent = percent or 0,
start_time = Time.time,
pos_y = 0,
dead = false,
dist = 0,
}
end
info.is_normal = is_normal or false
info.is_score = is_score or false
self.msg_id = self.msg_id + 1
local diff_time = 0
local last_info = self.msg_list[self.msg_id-1]
if last_info then
diff_time = math_abs(0.35 - (info.start_time - last_info.start_time))
end
info.start_time = info.start_time + diff_time
info.pos_y = ExpMessageItem.PosY
self.msg_list[self.msg_id] = info
end
function SysInfoExpView:CacheItem( item )
item:Reset()
local size = self.wnd_cache_list:GetSize()
if size < self.max_msg_count then
self.wnd_cache_list:PushBack(item)
end
end
function SysInfoExpView:CacheInfo( info )
local size = self.msg_cache_list:GetSize()
if size < self.max_msg_count then
self.msg_cache_list:PushBack(info)
end
end