源战役客户端
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

195 Zeilen
4.6 KiB

  1. SysInfoExpView = SysInfoExpView or BaseClass()
  2. local SysInfoExpView = SysInfoExpView
  3. local math_min = math.min
  4. local math_abs = math.abs
  5. function SysInfoExpView:__init()
  6. self.msg_cache_list = Array.New() --消息列表缓存池
  7. self.msg_list = {} --当前消息列表
  8. self.msg_id = 0
  9. self.wnd_cache_list = Array.New() --消息对象缓存池
  10. self.message_wnd_list = {} --当前消息对象
  11. self.last_update_time = 0 --更新频率限制
  12. self.move_dist = 100 --移动距离
  13. self.speed = 180 --移动速度
  14. self.max_msg_count = 5 --最大数量
  15. self.prefab_asset = nil
  16. self:LoadAsset()
  17. Runner:getInstance():AddRunObj(self)
  18. end
  19. function SysInfoExpView:LoadAsset()
  20. local function call_back(objs)
  21. self.prefab_asset = objs[0]
  22. self:CreateMessageContainer()
  23. end
  24. lua_resM:loadPrefab(self,"message","ExpMessageItem", call_back)
  25. end
  26. function SysInfoExpView:__delete()
  27. local size = self.wnd_cache_list:GetSize()
  28. for i=0,size-1 do
  29. local item = self.wnd_cache_list:PopFront()
  30. item:DeleteMe()
  31. item = nil
  32. end
  33. self.wnd_cache_list = nil
  34. for k,v in pairs(self.message_wnd_list) do
  35. v:DeleteMe()
  36. end
  37. self.message_wnd_list = {}
  38. end
  39. --预先创建消息对象
  40. function SysInfoExpView:CreateMessageContainer()
  41. if self.prefab_asset then
  42. local item = nil
  43. for index = 1, self.max_msg_count do
  44. item = ExpMessageItem.New(panelMgr:GetParent("Top"),self.prefab_asset)
  45. self.wnd_cache_list:PushBack(item)
  46. end
  47. end
  48. end
  49. --实时获取消息对象
  50. function SysInfoExpView:CreateMessageItem( id, info )
  51. local item = self.message_wnd_list[id]
  52. if item then
  53. if not item.has_data then
  54. item:SetData(info)
  55. end
  56. else
  57. local item = self.wnd_cache_list:PopFront()
  58. if item then
  59. self.message_wnd_list[id] = item
  60. if not item.has_data then
  61. item:SetData(info)
  62. end
  63. end
  64. end
  65. return item
  66. end
  67. function SysInfoExpView:Update(now_time, elapse_time)
  68. if now_time - self.last_update_time < 0.03 then
  69. return
  70. end
  71. self.last_update_time = now_time
  72. for id, info in pairs(self.msg_list) do
  73. if info and info.start_time < now_time then
  74. local p = 0
  75. if info.dist >= self.move_dist then
  76. info.dead = true
  77. else
  78. local dist = elapse_time * self.speed
  79. info.dist = info.dist + dist
  80. p = info.dist / self.move_dist
  81. if p > 1 then
  82. p = 1
  83. end
  84. info.pos_y = info.pos_y + dist
  85. end
  86. if info.dead then
  87. local item = self.message_wnd_list[id]
  88. if item then
  89. self:CacheItem(item)
  90. self.message_wnd_list[id] = nil
  91. end
  92. self:CacheInfo(info)
  93. self.msg_list[id] = nil
  94. else
  95. -- local item = self:CreateMessageItem(id, info)
  96. local item = self.message_wnd_list[id]
  97. if item then
  98. if not item.has_data then
  99. item:SetData(info)
  100. end
  101. else
  102. local item = self.wnd_cache_list:PopFront()
  103. if item then
  104. self.message_wnd_list[id] = item
  105. if not item.has_data then
  106. item:SetData(info)
  107. end
  108. end
  109. end
  110. if item then
  111. -- item.canvasGroup.alpha = 1 - (p * p * 1)
  112. if SceneManager.Instance:IsBeachScene() or SceneManager.Instance:IsGuildScene() then
  113. SetLocalPosition(item.transform, 0, info.pos_y+ScreenHeight * 0.39, ExpMessageItem.PosZ)
  114. else
  115. SetLocalPosition(item.transform, ExpMessageItem.PosX, info.pos_y, ExpMessageItem.PosZ)
  116. end
  117. end
  118. end
  119. end
  120. end
  121. end
  122. --is_normal标识不需要经验字体,用普通字体样式
  123. function SysInfoExpView:AppendMessage(content, percent, is_normal, is_score)
  124. if not self.prefab_asset then
  125. return
  126. end
  127. --最多缓存消息
  128. if TableSize(self.msg_list) > 6 then
  129. return
  130. end
  131. local info = self.msg_cache_list:PopFront()
  132. if info then
  133. info.content = content
  134. info.percent = percent
  135. info.start_time = Time.time
  136. info.pos_y = ExpMessageItem.PosY
  137. info.dead = false
  138. info.dist = 0
  139. else
  140. info = {
  141. content = content or 0,
  142. percent = percent or 0,
  143. start_time = Time.time,
  144. pos_y = 0,
  145. dead = false,
  146. dist = 0,
  147. }
  148. end
  149. info.is_normal = is_normal or false
  150. info.is_score = is_score or false
  151. self.msg_id = self.msg_id + 1
  152. local diff_time = 0
  153. local last_info = self.msg_list[self.msg_id-1]
  154. if last_info then
  155. diff_time = math_abs(0.35 - (info.start_time - last_info.start_time))
  156. end
  157. info.start_time = info.start_time + diff_time
  158. info.pos_y = ExpMessageItem.PosY
  159. self.msg_list[self.msg_id] = info
  160. end
  161. function SysInfoExpView:CacheItem( item )
  162. item:Reset()
  163. local size = self.wnd_cache_list:GetSize()
  164. if size < self.max_msg_count then
  165. self.wnd_cache_list:PushBack(item)
  166. end
  167. end
  168. function SysInfoExpView:CacheInfo( info )
  169. local size = self.msg_cache_list:GetSize()
  170. if size < self.max_msg_count then
  171. self.msg_cache_list:PushBack(info)
  172. end
  173. end