|
|
- --[[
- @describtion:特殊飘字视图层
- @author:huangjingpei
- ]]
-
- SysInfoSpecialView = SysInfoSpecialView or BaseClass()
- local SysInfoSpecialView = SysInfoSpecialView
-
- SysInfoSpecialView.MAX_MSG_COUNT = 20
- SysInfoSpecialView.WIDTH = 749
- SysInfoSpecialView.HEIGHT = 62
- SysInfoSpecialView.SHOW_MAX_COUNT = 3
-
- function SysInfoSpecialView:__init()
- self.font_name = "sysinfo2"
- self.records = Array.New()
- self.msg_list = Array.New()
-
- self.total_time = 1
- self.play_step = 0.3
- self.last_time = 0
-
- self.state_time1 = 1
- self.state_time2 = 3
- self.fout_out_time = 0.8
- self.speed = 90.0 / self.state_time1
-
- self.message_wnd_list = {}
- self.index = 0
-
- local ui_load_finish = function()
- self:CreateMessageContainer()
- end
- GlobalEventSystem:Bind(CommonUIEventType.DEFAULT_UI_RES_LOADED, ui_load_finish)
- end
-
- function SysInfoSpecialView:__delete()
- if self.root_wnd then
- self.root_wnd:DeleteMe()
- self.root_wnd = nil
- end
- end
-
- --创建消息容器
- function SysInfoSpecialView:CreateMessageContainer()
- local screen_width = HandleRenderUnit:getTargetWidth()
- local screen_height = HandleRenderUnit:getTargetHeight()
-
- self.root_wnd = Game.UI:CreateWindowByTypeNoName(UIType.Box, "", "ControlLayer")
- self.root_wnd:SetVector2(WidgetProperty.Size, Game.Vector2(SysInfoSpecialView.WIDTH/1280*screen_width, SysInfoSpecialView.HEIGHT/720*screen_height))
- self.root_wnd:SetBool(WidgetProperty.NeedMouse, false)
- self.root_wnd:SetInt(WidgetProperty.Align, Align.Center)
-
- self.root_wnd:SetVectorValue(WidgetProperty.Position, (screen_width - SysInfoSpecialView.WIDTH/1280*screen_width)/2, (screen_height - SysInfoSpecialView.HEIGHT/720*screen_height)/2 - 35/720*screen_height)
-
- for index = 0, SysInfoSpecialView.MAX_MSG_COUNT do
- local wnd = self:CreateLabel()
- self.message_wnd_list[index] = wnd
- end
- end
-
- --创建消息组件
- function SysInfoSpecialView:CreateLabel()
- local box = {}
- box.bg = self.root_wnd:CreateChildNoName(UIType.ImageBox, "")
- box.bg:SetString(ImageBoxProperty.Source, "comp:xx_special_msg_bg")
- box.bg:SetFloat(WidgetProperty.Alpha, 0.0)
- box.bg:SetBool(WidgetProperty.NeedMouse, false)
-
- box.wnd = box.bg:CreateChildNoName(UIType.Label, "Label3")
- box.wnd:SetVector2(WidgetProperty.Size, Game.Vector2(SysInfoSpecialView.WIDTH, 32))
- box.wnd:SetVectorValue(WidgetProperty.Position, 0, 14)
- box.wnd:SetInt(TextBoxProperty.TextAlign, bit.bor(Align.Center, Align.VCenter))
- box.wnd:SetInt(TextBoxProperty.FontSize, 24)
- box.wnd:SetBool(WidgetProperty.NeedMouse, false)
- return box
- end
-
- function SysInfoSpecialView:CreateNewItem(content)
- if self.index >= SysInfoSpecialView.MAX_MSG_COUNT then
- self.index = 0
- end
-
- local box = self.message_wnd_list[self.index]
- if box ~= nil then
- box.wnd:SetString(WindowProperty.Label, content)
- box.bg:SetFloat(WidgetProperty.Alpha, 0.0)
- end
-
- self.index = self.index + 1
- return box
- end
-
- function SysInfoSpecialView:CreateFoutAnim(wnd)
- local orign_pos_y = wnd:GetVector2(WidgetProperty.Position).y
- local wnd_alpha_frames = Game.KeyFrameSet()
- wnd_alpha_frames:AddTimeValue(0, 0)
- wnd_alpha_frames:AddTimeValue(self.fout_out_time, 1)
-
- local function WindowScreenCenterEnd()
- if wnd then
- wnd:SetFloat(WidgetProperty.Alpha, 0)
- end
- end
-
- local function WindowAlphaSetterCreator(anmi_val)
- if not wnd or wnd:IsNull() then
- return true
- end
-
- local anmi_num = anmi_val:GetAsNumeric()
- local value = 1 - anmi_num
- local pos = wnd:GetVector2(WidgetProperty.Position)
- local pos_y = 70 * anmi_num
- wnd:SetVectorValue(WidgetProperty.Position, pos.x, orign_pos_y - pos_y)
- wnd:SetFloat(WidgetProperty.Alpha, value)
- return false
- end
-
- Game.Animation:CreateKeyAnim(WindowAlphaSetterCreator, wnd_alpha_frames, false, true,
- WindowScreenCenterEnd)
- end
-
- function SysInfoSpecialView:Update(elapse_time)
- self.total_time = self.total_time + elapse_time
- local count = self.msg_list:GetSize()
-
- if count > 0 then
- if self.total_time > self.play_step then
- local content = self.msg_list:PopFront()
- if content ~= nil then
- self.total_time = 0.0
- local node = {}
- node.wnd = self:CreateNewItem(content)
- node.time = 0
- self.records:PushBack(node)
- end
- end
- end
-
- local record_length = self.records:GetSize()
- if record_length == 0 then
- return
- end
-
- for i = 0, record_length - 1 do
- local node = self.records:Get(i)
- local wnd = node.wnd.bg
- node.time = node.time + elapse_time
- local pos = wnd:GetVector2(WidgetProperty.Position)
- if node.time < self.state_time1 then
- local percent = node.time / self.state_time1
- pos.y = 90 - self.speed * node.time
- wnd:SetVector2(WidgetProperty.Position, pos)
- wnd:SetFloat(WidgetProperty.Alpha, percent)
- elseif node.time <= self.state_time2 then
- local end_y = -(record_length - 1 - i) * (SysInfoSpecialView.HEIGHT + 3)
- node.up_time = 0.4 + (record_length - 1 - i)*0.3
- local speed = end_y / node.up_time * elapse_time
- pos.y = pos.y + speed
- if pos.y <= end_y then pos.y = end_y end
- wnd:SetVector2(WidgetProperty.Position, pos)
- wnd:SetFloat(WidgetProperty.Alpha, 1)
- end
- end
-
- if record_length > 0 then
- local node = self.records:Get(0)
- if node.time > self.state_time2 then
- self.records:PopFront()
- self:CreateFoutAnim(node.wnd.bg)
- return
- end
- end
-
- if record_length > SysInfoSpecialView.SHOW_MAX_COUNT then
- local node = self.records:Get(0)
- if node.time and node.up_time then
- if node.time > node.up_time + 1 then
- self.records:PopFront()
- self:CreateFoutAnim(node.wnd.bg)
- return
- end
- end
- end
- end
-
- function SysInfoSpecialView:AppendMessage(content)
- if not self.root_wnd then
- return
- end
-
- local cur_time = TimeUtil:getClientTime()
- local count = self.msg_list:GetSize()
-
- if count > 0 then --判断现在显示的是否和要显示的内容一致,确定是否要显示
- local msg = self.msg_list:Get(count - 1)
- if msg ~= nil and msg == content then
- local diff = cur_time - self.last_time
- if diff < self.play_step then
- return
- end
- end
- end
-
- self.last_time = cur_time
- if count > SysInfoSpecialView.MAX_MSG_COUNT then
- self.msg_list:PopFront()
- end
- self.msg_list:PushBack(content)
- end
|