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
|
|
|