源战役客户端
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 

644 wiersze
18 KiB

BaseItem = BaseItem or BaseClass(UIPartical)
local BaseItem = BaseItem
local LuaViewManager = LuaViewManager
local lua_viewM = lua_viewM
local GetChildTransforms = GetChildTransforms
local GetChildGameObjects = GetChildGameObjects
local GetChildImages = GetChildImages
local GetChildTexts = GetChildTexts
local newObject = newObject
BaseItem.Class_Type = "BaseItem"
function BaseItem:__init(parent_wnd,prefab_asset,layer_name)
self.parent_wnd = parent_wnd or false -- 父容器
self.prefab_asset = prefab_asset or false --预制体 如果有传进来就直接通过预制体创建对象 免去加载预制体的过程
self.layer_name = layer_name or false --需要挂接特效的时候 必须设置
end
--属性用途基本和baseview一致
function BaseItem:__defineVar()
return {
_class_type = self,
_iid = _in_obj_ins_id,
_use_delete_method = false,
base_file = nil,
layout_file = nil,
parent_wnd = nil,
is_delay_callback = false,
Load_callback = nil , -- 加载的回调函数,必须由子类重写
is_loaded = nil,
visible = -1, --等待加载完回调的visible状态
use_local_view = false,
position = false,
anchoredPosition = false,
cache_findChild = nil,
prefab_asset = nil,
need_refreshData = nil,
gameObject = nil,
transform = nil,
is_guide_module = false,--是否是新手引导模块
ReOpen_callback = nil, --重新打开界面,刷新事件
is_hide_delete_effect = true, --隐藏时删除特效
hide_clear_role_model = true, --隐藏时删除模型
is_imm_show = true, --立即显示;有问题的界面需要设为false,就会等到加载完再显示
full_screen = false, --全屏模式
ani_right = false, --右侧动画
ani_left = false, --左侧动画
adjust_mid = false, --中间布局调整
ani_list = false,
move_node_list = false, --移动到背景节点列表
cache_move_node_list = false,--缓存移动到背景节点列表
parent_view_target = false, --item所在界面
}
end
function BaseItem:__delete()
self:RemoveUIFromBack()
self:Destroy()
self:AfterDestroy()
end
function BaseItem:Destroy()
if self.gameObject == nil then return end
if self.transform and not IsNull(self.transform) and self.transform.name then
GlobalEventSystem:Fire(EventName.BASE_ITEM_DELETE, self.transform.name,self.layout_file)
end
if self._base_delay_load_id then
LuaViewManager:getInstance():RemoveDelayQueue(self._base_delay_load_id)
self._base_delay_load_id = nil
end
if self.trigger_guide_id then
EventSystem.UnBind(GlobalEventSystem, self.trigger_guide_id)
self.trigger_guide_id = false
end
UI.BindEventComp.UnBindAll(self)
if self.action_nodes then
for k,v in pairs(self.action_nodes) do
cc.ActionManager:getInstance():removeAllActionsFromTarget(v)
end
self.action_nodes = nil
end
if self.effect_nodes then
for k,v in pairs(self.effect_nodes) do
self:ClearUIEffect(v)
end
end
if self.autoDeleteList then
for i,v in ipairs(self.autoDeleteList) do
if v ~= nil then
v:DeleteMe()
end
end
self.autoDeleteList = nil
end
if self.orientation_change_id then
EventSystem.UnBind(GlobalEventSystem,self.orientation_change_id)
self.orientation_change_id = nil
end
LuaViewManager.ClearItem(lua_viewM, self.gameObject)
self.parent_wnd = nil
self.gameObject = nil
self.transform = nil
self.cache_findChild = nil
self.prefab_asset = nil
self.is_loaded = false
self.need_refreshData = false
self.parent_view_target = false
self.cache_move_node_list = false
self:AfterDestroy()
end
--[[
获取子对象的transform
特别注意此方法是从根节点开始搜寻子对象 所以要写全路径 比如:"input/Text"
]]
function BaseItem:GetChild(name)
if self.cache_findChild and self.transform then
return self.cache_findChild(self.transform,name)
end
end
function BaseItem:GetChildComponent(name,com)
return self:GetChild(name):GetComponent(com)
end
--获取多个孩子transform
function BaseItem:GetChildTransforms(names)
return GetChildTransforms(self.transform, names)
end
--获取多个孩子go
function BaseItem:GetChildGameObjects(names)
return GetChildGameObjects(self.transform, names)
end
--获取多个孩子image
function BaseItem:GetChildImages(names)
return GetChildImages(self.transform, names)
end
--获取多个孩子text
function BaseItem:GetChildTexts(names)
return GetChildTexts(self.transform, names)
end
function BaseItem:Load()
if not self.parent_wnd then
print ("error parent_wnd is Null")
return
end
if self.gameObject then
return
end
if self.prefab_asset and tostring(self.prefab_asset) ~= "null" then
local go = newObject(self.prefab_asset)
go.name = self.layout_file
self:DoCreateItemIndeed(go)
else
local res_load_finish = function(obj)
assert(obj~=nil, "BaseItem:Load failed:cannot find basefile : "..self.base_file.." layout:"..self.layout_file)
self:DoCreateItemIndeed(obj)
end
self.is_loaded = false
LuaViewManager.LoadItem(lua_viewM, self,self.base_file, self.layout_file, res_load_finish)
end
end
function BaseItem:DoCreateItemIndeed(obj)
self.gameObject = obj
if self._use_delete_method then
self:Destroy()
return
end
if self.is_imm_show == false then
self.gameObject:SetActive(false) --先调一次隐藏 避免显示有问题
end
self.transform = obj.transform
self.cache_findChild = self.transform.Find
self.transform:SetParent(self.parent_wnd)
SetLocalScale(self.transform)
SetLocalPosition(self.transform)
self:InitViewAnimation()
local function onLoad()
if not IsNull(self.gameObject) and not self._use_delete_method then
self.gameObject:SetActive(true)
self.is_loaded = true
self:SetRotation(0,0,0)--配合SetVisible优化用的,防止加载慢引起的显示错误
self:BeforeLoad()
if self.Load_callback then
self:Load_callback()
else
LogError(self.layout_file ..":Load_callback must be override!")
end
if self.visible ~= -1 then
self:SetVisible(self.visible, self.cache_force_hide)
end
if self.position then
self:SetPosition(self.position.x,self.position.y)
self.position = false
end
if self.anchoredPosition then
self:SetAnchoredPosition(self.anchoredPosition.x,self.anchoredPosition.y)
self.anchoredPosition = false
end
if self.scale then
self:SetScale(self.scale)
self.scale = false
end
if self.full_screen then
local function onOrientationChange( )
self:SetIpxMode()
end
if not self.orientation_change_id then
self.orientation_change_id = GlobalEventSystem:Bind(EventName.ORIENTATION_DID_CHANGE, onOrientationChange)
end
end
if self.gameObject_name then
self:SetGameObjectName(self.gameObject_name)
end
self:DoOpenAni()
end
end
if self.is_delay_callback then
if self._base_delay_load_id then
LuaViewManager.RemoveDelayQueue(lua_viewM, self._base_delay_load_id)
self._base_delay_load_id = false
end
self._base_delay_load_id = LuaViewManager.AddDelayQueue(lua_viewM, onLoad)
else
onLoad()
end
end
function BaseItem:SetVisible(state, force_hide)
if self.is_loaded then
self:SetBackUIVisible(state)
if force_hide then
--部分确实需要使用SetActive的
if type(state) == "boolean" and force_hide and self.gameObject.activeSelf ~= state then
if state and rawget(self, "cache_change_rotation") then
self:SetRotation(0,0,0)
end
self.gameObject:SetActive(state)
end
else
--旋转角度代替显示隐藏减少批次
-------------------------
if type(state) == "boolean" and state == true then
self:SetRotation(0,0,0)
if self.gameObject.activeSelf ~= true then
self.gameObject:SetActive(true)
end
else
self.cache_change_rotation = true
self:SetRotation(90,90,0)
end
end
if state == false then
--隐藏的时候自动删掉挂接的模型和特效,需要在对应ITEM的ReOpen_callback后再创建
if self.hide_clear_role_model then
lua_resM:clearRoleMode(self)
end
if self.is_hide_delete_effect then
self:ClearAllEffect()
self:ResetUIZDepth()
end
elseif state == true and self.visible == false then
if self.ReOpen_callback then
self:ReOpen_callback()
end
end
self.visible = state
self.cache_force_hide = force_hide
else
self.visible = state
self.cache_force_hide = force_hide
end
end
function BaseItem:GetVisible()
if self.is_loaded then
return self.gameObject.activeSelf
else
return false
end
end
function BaseItem:SetPosition(x, y)
if self.is_loaded then
SetLocalPosition(self.transform, x, y, 0)
else
self.position = Vector3(x,y,0)
end
end
function BaseItem:GetPosition()
if self.is_loaded then
return self.transform.localPosition
else
return self.position or Vector3.zero
end
end
function BaseItem:SetAnchoredPosition(x, y)
if self.is_loaded then
SetAnchoredPosition(self.transform,x,y)
else
self.anchoredPosition = Vector2(x,y)
end
end
function BaseItem:GetAnchoredPosition()
if self.is_loaded then
return self.transform.anchoredPosition
else
return self.anchoredPosition or Vector2.zero
end
end
function BaseItem:SetScale(scale)
if self.is_loaded then
SetLocalScale(self.transform, scale)
else
self.scale = scale
end
end
function BaseItem:SetRotation(x,y,z)
if self.is_loaded then
self.transform.localRotation = Quaternion.Euler(x, y, z)
end
end
function BaseItem:SetGameObjectName(name)
if self.is_loaded then
self.transform.name = name
else
self.gameObject_name = name
end
end
function BaseItem:GetGameObjectName()
if self.is_loaded then
return self.transform.name
else
return self.gameObject_name or ""
end
end
function BaseItem:GetChildren( names )
GetChildren(self, names)
end
function BaseItem:GetSiblingIndex( )
if self.is_loaded then
self.transform:GetSiblingIndex()
end
end
function BaseItem:SetSiblingIndex( value )
if self.is_loaded then
self.sibling_index = value or 0
if self.sibling_index == 0 then
self.transform:SetAsFirstSibling()
else
self.transform:SetSiblingIndex(self.sibling_index)
end
else
self.sibling_index = value
end
end
-- 显示子窗口
function BaseItem:PopUpChild(win)
if win then
if self.popChild ~= nil and self.popChild ~= win then
self.popChild:SetVisible(false, true)
end
self.popChild = win
self.popChild:SetVisible(true, true)
end
end
--移出屏幕(隐藏,用于频繁调用显示隐藏的对象,减少setActive的调用次数)
function BaseItem:MoveOutOfScreen( transform )
transform = transform or self.transform
if transform then
self.base_move_from_pos_y = self.base_move_from_pos_y or GetLocalPositionY(transform)
SetLocalPositionY(transform, -99999)
end
end
--移回屏幕(显示,用于频繁调用显示隐藏的对象,减少setActive的调用次数)
function BaseItem:MoveInToScreen( transform )
transform = transform or self.transform
if transform and self.base_move_from_pos_y then
SetLocalPositionY(transform, self.base_move_from_pos_y)
self.base_move_from_pos_y = false
end
end
--关闭界面时销毁该节点
function BaseItem:AutoDelete( deleteNode )
self.autoDeleteList = self.autoDeleteList or {}
table.insert(self.autoDeleteList, deleteNode)
end
--自销毁事件
function BaseItem:BindEvent( bindDispather, eventName, handleFunc )
return UI.BindEventComp.BindEvent(self, bindDispather, eventName, handleFunc)
end
--自销毁节点
function BaseItem:CreateItem( class_name, parent, layer_name, ... )
if class_name and parent then
local item = class_name.New(parent, nil, layer_name, ... )
self:AutoDelete( item )
return item
end
end
--自销毁动作
function BaseItem:AddAction( action, node )
self.action_nodes = self.action_nodes or {}
self.action_nodes[node] = node
--table.insert(self.action_nodes, node)
cc.ActionManager:getInstance():addAction(action, node)
end
--自销毁特效
function BaseItem:CreateUIEffect( config )
if not config or not config.uiTranform then return end
self.effect_nodes = self.effect_nodes or {}
self:AddUIEffectConfig( config )
table.insert(self.effect_nodes, config.uiTranform)
end
--播放界面入场动画
function BaseItem:DoOpenAni(tab_id)
tab_id = tab_id or 1
self.ani_list = self.ani_list or {}
if not self.is_loaded or self.ani_list[tab_id] then return end
self.ani_list[tab_id] = true
self:DoOpenViewAnimation()
end
function BaseItem:InitViewAnimation()
if self.full_screen or self.ani_left or self.ani_right then
--处理刘海屏的位移偏移
local width, offset = self:GetIpxOffset()
--右侧
self.ani_right_trans = self:GetChild("right")
if self.ani_right_trans then
self.ani_right_obj = self:GetChild("right").gameObject
self.old_ani_right_pos = self.ani_right_trans.anchoredPosition
if self.ani_right and ClientConfig.view_ani_mode == true then
SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + 600, self.old_ani_right_pos.y)
else
SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + offset, self.old_ani_right_pos.y)
end
end
--左侧
self.ani_left_trans = self:GetChild("left")
if self.ani_left_trans then
self.ani_left_obj = self:GetChild("left").gameObject
self.old_ani_left_pos = self.ani_left_trans.anchoredPosition
if self.ani_left and ClientConfig.view_ani_mode == true then
SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x - 600 , self.old_ani_left_pos.y)
else
SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + offset , self.old_ani_left_pos.y)
end
end
--中间
self:ResetMidNode()
--设置界面大小
local MaxScreenWidth = math.min(SrcScreenWidth - width, 1560 - width)
local rt = self.gameObject:GetComponent("RectTransform")
rt.sizeDelta = Vector2(MaxScreenWidth, ScreenHeight)
end
end
--处理界面动画
function BaseItem:DoOpenViewAnimation()
local width, offset = self:GetIpxOffset()
if self.ani_right and self.ani_right_trans and ClientConfig.view_ani_mode == true then
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_right_trans)
SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + self.ani_right - offset, self.old_ani_right_pos.y)
local moveActionRight = cc.MoveTo.createAnchoredType(1, self.old_ani_right_pos.x - offset, self.ani_right_trans.anchoredPosition.y)
moveActionRight = cc.EaseExponentialOut.New(moveActionRight)
self:AddAction(moveActionRight, self.ani_right_trans)
end
if self.ani_left and self.ani_left_trans and ClientConfig.view_ani_mode == true then
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_left_trans)
SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + self.ani_left + offset, self.old_ani_left_pos.y)
local moveActionLeft = cc.MoveTo.createAnchoredType(1, self.old_ani_left_pos.x + offset, self.ani_left_trans.anchoredPosition.y)
moveActionLeft = cc.EaseExponentialOut.New(moveActionLeft)
self:AddAction(moveActionLeft, self.ani_left_trans)
end
end
--获取刘海屏位移
function BaseItem:GetIpxOffset()
local width, offset = 0, 0
if ClientConfig.iphone_x_offset_left ~= 0 then
offset = ClientConfig.iphone_x_offset_left/2
width = ClientConfig.iphone_x_offset_left
elseif ClientConfig.iphone_x_offset_right then
offset = -ClientConfig.iphone_x_offset_right/2
width = ClientConfig.iphone_x_offset_right
end
return width, offset
end
--处理中间节点
function BaseItem:ResetMidNode()
if self.adjust_mid then
local width, offset = self:GetIpxOffset()
local MaxScreenWidth = math.min(SrcScreenWidth - width, 1560 - width)
self.mid_trans = self:GetChild("mid")
if self.mid_trans then
self.adjust_mid.left = self.adjust_mid.left or 0
self.adjust_mid.right = self.adjust_mid.right or 0
local x = MaxScreenWidth - self.adjust_mid.left - self.adjust_mid.right
x = x / 2
SetAnchoredPosition(self.mid_trans, - (MaxScreenWidth / 2) + self.adjust_mid.left + x + offset, self.mid_trans.anchoredPosition.y)
end
end
end
--处理刘海屏,旋转屏幕
function BaseItem:SetIpxMode()
self:ResetMidNode()
local width, offset = self:GetIpxOffset()
if self.ani_right_trans then
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_right_trans)
SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + offset, self.old_ani_right_pos.y)
end
if self.ani_left_trans then
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_left_trans)
SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + offset, self.old_ani_left_pos.y)
end
end
--把界面的UI节点移动到背景层
function BaseItem:MoveUIToBack(...)
self.move_node_list = self.move_node_list or {}
local parms = {...}
if not self.parent_view_target then
self.cache_move_node_list = self.cache_move_node_list or {}
table.insert(self.cache_move_node_list, parms)
return
end
local node = parms[1]
local args = parms[2]
local camera_args = parms[3]
local activity_args = parms[4]
local targt_view = self.parent_view_target
if node then
local t = {node = node, args = args, parent = node.transform.parent, sibling_idx = node.transform:GetSiblingIndex()}
table.insert(self.move_node_list, t)
LuaViewManager:getInstance():ShowBackData({
target = targt_view,
node_list ={[1] = t},
camera_args = camera_args,
activity = activity_args,
})
end
end
--把界面的UI节点从背景层中移除
function BaseItem:RemoveUIFromBack()
self.move_node_list = self.move_node_list or {}
if #self.move_node_list > 0 then
LuaViewManager:getInstance():HideBackData(self)
end
end
--根据界面状态显示隐藏在背景层中的UI
function BaseItem:SetBackUIVisible(state, from_view)
if self.move_node_list then
for k,v in pairs(self.move_node_list) do
if from_view then
if state then
if v.is_hide_form_view then
v.is_hide_form_view = nil
v.node.gameObject:SetActive(state)
end
else
if v.node.gameObject.activeSelf then
v.is_hide_form_view = true
v.node.gameObject:SetActive(state)
end
end
else
v.node.gameObject:SetActive(state)
end
end
end
end
function BaseItem:AppendToBackContainer(parent_view)
if parent_view then
self.parent_view_target = parent_view
parent_view:AppendToBackContainer(self)
if self.cache_move_node_list then
for i,v in ipairs(self.cache_move_node_list) do
self:MoveUIToBack(unpack(v))
end
self.cache_move_node_list = false
end
end
end