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