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

239 lines
9.8 KiB

TweenLite = TweenLite or BaseClass()
local TweenLite = TweenLite
local math_min = math.min
local Status = Status
local table_insert = table.insert
local IsTableEmpty = IsTableEmpty
local GetLocalPositionX = GetLocalPositionX
local GetLocalPositionY = GetLocalPositionY
local SetLocalPositionX = SetLocalPositionX
local SetLocalPositionY = SetLocalPositionY
TweenLite.UiAnimationType = {
POS = "POS",
POSX = "POSX",
POSY = "POSY",
ALPHA = "ALPHA", --新版的alpha 不要用旧版的
ALPHA_OLD = "ALPHA_OLD",--旧版的alpha变化 后续不要再调用
WIDTH = "WIDTH",
HEIGHT = "HEIGHT",
ROTATION = "ROTATION", --rotateion.z
CANVAS_POSX="CANVAS_POSX",
CANVAS_POSY="CANVAS_POSY",
SCALE = "SCALE",
ROTATION_Y = "ROTATION_Y",
SRECT_HORIZONTAL = "SRECT_HORIZONTAL",
SRECT_VERTICAL = "SRECT_VERTICAL",
ANCHORED_POS = "ANCHORED_POS",
ANCHORED_POSX = "ANCHORED_POSX",
ANCHORED_POSY = "ANCHORED_POSY",
ALPHA_ALL = "ALPHA_ALL", --动态添加CanvasGroup设置透明度,也可以自己在prefab里添加然后调用TweenLite.UiAnimationType.ALPHA
FILLAMOUNT = "FILLAMOUNT",
DELAY = "DALAY", --延迟
}
TweenLite.moving_info_list = {} --当前正在缓动的列表
TweenLite.moving_info_list_delay = {} -- 保存正在更新的过程中添加进来的对象 本次更新完以后才会添加到moving_info_list里 避免更新过程中触发rehash产生影响
TweenLite.curr_info_index = 0
TweenLite.is_updating = false --是否正在更新
--[[
参数
parent_wnd:父容器 继承baseclass的父容器 用来判断是否已经被删除
anim_wnd:缓动对象
tweentype:缓动类型
endValue:结束值
AnimaTime:缓动时间(s)
anim_end_func:结束调用方法
tween_type:缓动类型 默认线性
]]
function TweenLite.to(parent_wnd, anim_wnd, tweentype, endValue, AnimaTime, anim_end_func, tween_type, loop)
if not anim_wnd then
return
end
local startvalue=0
if tweentype == TweenLite.UiAnimationType.POS then
startvalue = anim_wnd.localPosition
elseif tweentype == TweenLite.UiAnimationType.POSX then
startvalue = GetLocalPositionX(anim_wnd)
elseif tweentype == TweenLite.UiAnimationType.POSY then
startvalue = GetLocalPositionY(anim_wnd)
elseif tweentype == TweenLite.UiAnimationType.ALPHA then
startvalue = anim_wnd.alpha
elseif tweentype == TweenLite.UiAnimationType.ALPHA_OLD then
startvalue = GetAlpha(anim_wnd)
elseif tweentype == TweenLite.UiAnimationType.WIDTH then
startvalue = GetSizeDeltaX(anim_wnd)
elseif tweentype == TweenLite.UiAnimationType.HEIGHT then
startvalue = GetSizeDeltaY(anim_wnd)
elseif tweentype == TweenLite.UiAnimationType.ROTATION then
startvalue = anim_wnd.eulerAngles.z
elseif tweentype == TweenLite.UiAnimationType.ROTATION_Y then
startvalue = anim_wnd.eulerAngles.y
-- elseif tweentype == TweenLite.UiAnimationType.CANVAS_POSY then
-- startvalue=anim_wnd:GetVector2(ScrollViewProperty.CanvasPosition).y
-- elseif tweentype == TweenLite.UiAnimationType.CANVAS_POSX then
-- startvalue=anim_wnd:GetVector2(ScrollViewProperty.CanvasPosition).x
elseif tweentype == TweenLite.UiAnimationType.SCALE then
startvalue = anim_wnd.localScale
elseif tweentype == TweenLite.UiAnimationType.SRECT_HORIZONTAL then
startvalue = anim_wnd.horizontalNormalizedPosition
elseif tweentype == TweenLite.UiAnimationType.SRECT_VERTICAL then
startvalue = anim_wnd.verticalNormalizePosition
elseif tweentype == TweenLite.UiAnimationType.ANCHORED_POS then
startvalue = anim_wnd.anchoredPosition
elseif tweentype == TweenLite.UiAnimationType.ANCHORED_POSX then
startvalue = anim_wnd.anchoredPosition.x
elseif tweentype == TweenLite.UiAnimationType.ANCHORED_POSY then
startvalue = anim_wnd.anchoredPosition.y
elseif tweentype == TweenLite.UiAnimationType.FILLAMOUNT then
startvalue = anim_wnd:GetComponent("Image").fillAmount
elseif tweentype == TweenLite.UiAnimationType.ALPHA_ALL then
--添加一个CanvasGroup组件
local component = anim_wnd:GetComponent("CanvasGroup")
if not component then
component = anim_wnd:AddComponent(typeof(UnityEngine.CanvasGroup))
end
startvalue = component.alpha
elseif tweentype == TweenLite.UiAnimationType.DELAY then
end
local tid = TweenLite.AddMovingItem(parent_wnd, anim_wnd, tweentype, startvalue, endValue, AnimaTime, anim_end_func, tween_type, loop)
if TweenLite.delayfun_timer == nil then
local function delayfun()
TweenLite.Update()
end
TweenLite.delayfun_timer = GlobalTimerQuest:AddPeriodQuest(delayfun, 0.02, -1)
end
return tid
end
function TweenLite.setMovingInfo(v,progress)
if not v or v.parent_wnd._use_delete_method or IsNull(v.anim_wnd) then
return true
end
local curr_value = v.startvalue + (v.endValue - v.startvalue) * progress
if v.tweentype==TweenLite.UiAnimationType.POS then
-- v.anim_wnd.localPosition = curr_value
SetLocalPosition(v.anim_wnd, curr_value.x, curr_value.y , curr_value.z)
elseif v.tweentype==TweenLite.UiAnimationType.POSX then
-- local vect = Vector3(curr_value,v.anim_wnd.localPosition.y, v.anim_wnd.localPosition.z)
-- v.anim_wnd.localPosition = vect
SetLocalPositionX(v.anim_wnd, curr_value)
elseif v.tweentype==TweenLite.UiAnimationType.POSY then
-- local vect = Vector3(v.anim_wnd.localPosition.x,curr_value, v.anim_wnd.localPosition.z)
-- v.anim_wnd.localPosition = vect
SetLocalPositionY(v.anim_wnd, curr_value)
elseif v.tweentype==TweenLite.UiAnimationType.ALPHA then
v.anim_wnd.alpha = curr_value
elseif v.tweentype==TweenLite.UiAnimationType.ALPHA_OLD then
SetAlpha(v.anim_wnd,curr_value)
elseif v.tweentype==TweenLite.UiAnimationType.WIDTH then
SetSizeDeltaX(v.anim_wnd, curr_value)
-- v.anim_wnd.sizeDelta = Vector2(curr_value,v.anim_wnd.sizeDelta.y)
elseif v.tweentype==TweenLite.UiAnimationType.HEIGHT then
SetSizeDeltaY(v.anim_wnd, curr_value)
-- v.anim_wnd.sizeDelta = Vector2(v.anim_wnd.sizeDelta.x,curr_value)
elseif v.tweentype == TweenLite.UiAnimationType.ROTATION then
v.anim_wnd.localRotation = Quaternion.Euler(0,0,curr_value)
elseif v.tweentype == TweenLite.UiAnimationType.ROTATION_Y then
v.anim_wnd.localRotation = Quaternion.Euler(0,curr_value,0)
elseif v.tweentype == TweenLite.UiAnimationType.FILLAMOUNT then
v.anim_wnd:GetComponent("Image").fillAmount = curr_value
-- elseif v.tweentype==TweenLite.UiAnimationType.CANVAS_POSY then
-- anim_wnd:SetVectorR(ScrollViewProperty.CanvasPosition, pass_time)
-- elseif v.tweentype==TweenLite.UiAnimationType.CANVAS_POSX then
-- anim_wnd:SetVectorL(ScrollViewProperty.CanvasPosition, pass_time)
elseif v.tweentype == TweenLite.UiAnimationType.SCALE then
-- v.anim_wnd.localScale = curr_value
SetLocalScale(v.anim_wnd, curr_value.x, curr_value.y)
elseif v.tweentype == TweenLite.UiAnimationType.SRECT_HORIZONTAL then
v.anim_wnd.horizontalNormalizedPosition = curr_value
elseif v.tweentype == TweenLite.UiAnimationType.SRECT_VERTICAL then
v.anim_wnd.verticalNormalizePosition = curr_value
elseif v.tweentype==TweenLite.UiAnimationType.ANCHORED_POS and v.anim_wnd.anchoredPosition then
v.anim_wnd.anchoredPosition = curr_value
elseif v.tweentype==TweenLite.UiAnimationType.ANCHORED_POSX and v.anim_wnd.anchoredPosition then
local vect = Vector2(curr_value,v.anim_wnd.anchoredPosition.y)
v.anim_wnd.anchoredPosition = vect
elseif v.tweentype==TweenLite.UiAnimationType.ANCHORED_POSY and v.anim_wnd.anchoredPosition then
local vect = Vector2(v.anim_wnd.anchoredPosition.x, curr_value)
v.anim_wnd.anchoredPosition = vect
elseif v.tweentype==TweenLite.UiAnimationType.ALPHA_ALL then
local component = v.anim_wnd:GetComponent("CanvasGroup")
component.alpha = curr_value
elseif v.tweentype==TweenLite.UiAnimationType.DELAY then
end
return false
end
function TweenLite.AddMovingItem(parent_wnd, anim_wnd, tweentype, startvalue, endValue, AnimaTime, anim_end_func, tween_type, loop)
local info = {parent_wnd = parent_wnd, anim_wnd = anim_wnd, tweentype = tweentype, startvalue = startvalue, endValue = endValue, AnimaTime = AnimaTime,
anim_end_func = anim_end_func, tween_func = tween_type and TweenFunc[tween_type] or TweenFunc[TweenFunc.LINEAR], startTime = Status.NowTime, loop = loop or false}
TweenLite.curr_info_index = TweenLite.curr_info_index + 1
if TweenLite.is_updating == false then
TweenLite.moving_info_list[TweenLite.curr_info_index] = info
else
TweenLite.moving_info_list_delay[TweenLite.curr_info_index] = info
end
return TweenLite.curr_info_index
end
function TweenLite.Update()
-- if G_DEBUG_STOP_ACTION then
-- return
-- end
TweenLite.is_updating = true
local delete_list = {} --更新完后再删除列表 避免更新过程中触发rehash产生影响
for k, v in pairs(TweenLite.moving_info_list) do
local usetime = Status.NowTime - v.startTime
local need_delete = false
if v.tween_func then
--经过时间
local ratio = math_min(usetime / v.AnimaTime,1)
local progress = v.tween_func(ratio)
need_delete = TweenLite.setMovingInfo(v,progress)
end
local timeout = false
if usetime >= v.AnimaTime then
if v.loop then
v.startTime = Status.NowTime
else
timeout = true
end
end
if need_delete or timeout then
--结束回调
if not need_delete and v.anim_end_func ~= nil then
v.anim_end_func()
end
table_insert(delete_list,k)
end
end
TweenLite.is_updating = false
for i = 1,#delete_list do
TweenLite.moving_info_list[delete_list[i]] = nil
end
for k, v in pairs(TweenLite.moving_info_list_delay) do
v.startTime = Status.NowTime
TweenLite.moving_info_list[k] = v
end
TweenLite.moving_info_list_delay = {}
if IsTableEmpty(TweenLite.moving_info_list) then
if TweenLite.delayfun_timer then
GlobalTimerQuest:CancelQuest(TweenLite.delayfun_timer)
TweenLite.delayfun_timer = nil
-- print("GlobalTimerQuest:CancelQuest TweenLite.delayfun_timer")
end
end
end
function TweenLite.Stop(id)
if not id then return end
TweenLite.moving_info_list[id] = nil
TweenLite.moving_info_list_delay[id] = nil
end