源战役客户端
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.
 
 
 
 
 

211 lines
6.8 KiB

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