--[[
@module LeftAttrOBJ
@brief 左侧属性面板模块
@desc 负责显示玩家的攻速、切割、暴率、倍攻、复活状态等属性信息
支持面板的显示/隐藏切换,实时更新属性数据
]]
LeftAttrOBJ = {}
LeftAttrOBJ.__cname = "LeftAttrOBJ"
-- 加载复活装备配置文件
LeftAttrOBJ.config = ssrRequireCsvCfg("cfg_FuHuoZhuangBei")
-- 定时器ID
LeftAttrOBJ.scheduleID = nil
-- 根据平台设置面板位置
if ssrConstCfg.isPc then
-- PC端位置配置
LeftAttrOBJ.left_position_hide = { x = -200, y = -36 } -- 隐藏位置
LeftAttrOBJ.left_position_show = { x = 0, y = -36 } -- 显示位置
else
-- 移动端位置配置
LeftAttrOBJ.left_position_hide = { x = -200, y = -96 } -- 隐藏位置
LeftAttrOBJ.left_position_show = { x = 0, y = -96 } -- 显示位置
end
-------------------------------↓↓↓ UI操作 ↓↓↓---------------------------------------
--[[
@function main
@brief 主函数(当前为空实现)
@return void
]]
function LeftAttrOBJ:main()
end
--[[
@function HideandShow
@brief 控制面板显示/隐藏的动画效果
@param bool 是否播放按钮旋转动画
@return void
@desc 根据当前显示状态切换面板位置,支持平滑动画过渡
]]
function LeftAttrOBJ:HideandShow(bool)
-- 面板移动动画函数
local function visible()
if self.IsShow then
-- 隐藏面板:移动到隐藏位置
GUI:Timeline_EaseSineIn_MoveTo(self.ui.ImageView, self.left_position_hide, 0.1)
else
-- 显示面板:移动到显示位置
GUI:Timeline_EaseSineIn_MoveTo(self.ui.ImageView, self.left_position_show, 0.1)
end
end
if bool then
-- 播放按钮旋转动画
if self.IsShow then
-- 隐藏时:按钮旋转180度
GUI:Timeline_RotateTo(self.ui.HideButton, 180, 0.1, visible)
else
-- 显示时:按钮旋转回0度
GUI:Timeline_RotateTo(self.ui.HideButton, 0, 0.1, visible)
end
else
-- 直接执行移动动画,不旋转按钮
visible()
end
end
--[[
@function createLeftPanel
@brief 创建左侧属性面板UI
@return void
@desc 创建包含攻速、切割、暴率、倍攻、复活状态、战斗状态等信息的面板
]]
local function createLeftPanel()
-- 获取父容器(窗口ID为105)
local parent = GUI:Win_FindParent(105)
if parent then
-- 清空父容器中的所有子控件
GUI:removeAllChildren(parent)
-- 创建根节点
local node = GUI:Node_Create(parent, "Node", 0.00, 0.00)
-- 创建背景图片
local ImageView = GUI:Image_Create(node, "ImageView", 0.00, LeftAttrOBJ.left_position_show.y, "res/custom/LeftAttr/bg.png")
-- 创建属性文本控件,从上到下依次排列
local defaultY = 137
-- 攻速文本(青色)
GUI:Text_Create(ImageView, "gongSu", 70, defaultY, 15, "#21faf2", "")
defaultY = defaultY - 26
-- 切割文本(青色)
GUI:Text_Create(ImageView, "qieGe", 70, defaultY, 15, "#21faf2", "")
defaultY = defaultY - 26
-- 暴率文本(青色)
GUI:Text_Create(ImageView, "baoLv", 70, defaultY, 15, "#21faf2", "")
defaultY = defaultY - 26
-- 倍攻文本(青色)
GUI:Text_Create(ImageView, "beiGong", 70, defaultY, 15, "#21faf2", "")
defaultY = defaultY - 26
-- 复活状态文本(红色)
GUI:Text_Create(ImageView, "fuHuo", 70, defaultY, 15, "#FF0000", "")
defaultY = defaultY - 26
-- 战斗状态文本(绿色,默认显示"脱战状态")
GUI:Text_Create(ImageView, "zhuangTai", 70, defaultY, 15, "#00FF00", "脱战状态")
-- 创建隐藏/显示按钮
local HideButtonY = LeftAttrOBJ.left_position_show.y - 14
local HideButton = GUI:Button_Create(node, "HideButton", 14, HideButtonY, "res/custom/LeftAttr/btn.png")
GUI:setTouchEnabled(HideButton, true) -- 启用触摸
GUI:setAnchorPoint(HideButton, 0.5, 0.5) -- 设置锚点为中心
-- 创建UI代理对象
LeftAttrOBJ.ui = GUI:ui_delegate(parent)
-- 注册自定义属性控件(攻速相关,已注释)
--SL:CustomAttrWidgetAdd("&<REDKEY/U40>&%", LeftAttrOBJ.ui.gongSu)
-- 注册倍攻属性控件
SL:CustomAttrWidgetAdd("&<REDKEY/T40>&倍", LeftAttrOBJ.ui.beiGong)
-- 添加按钮点击事件
GUI:addOnClickEvent(LeftAttrOBJ.ui.HideButton, function()
-- 切换显示状态
LeftAttrOBJ.IsShow = not LeftAttrOBJ.IsShow
-- 执行显示/隐藏动画
LeftAttrOBJ:HideandShow(true)
end)
end
end
--[[
@function onBuffUpdate
@brief Buff状态更新事件处理
@param t Buff更新数据表
@return void
@desc 处理战斗状态和特殊Buff的显示更新
]]
function LeftAttrOBJ:onBuffUpdate(t)
SL:dump(t, "onBuffUpdate", 3)
-- 重新初始化UI
self:reloadInit()
-- 处理战斗状态Buff(ID: 10001)
if t.buffID == 10001 then
if t.type == 1 then
-- 进入战斗状态
GUI:Text_setString(LeftAttrOBJ.ui.zhuangTai, "战斗状态")
GUI:Text_setTextColor(LeftAttrOBJ.ui.zhuangTai, "#FF0000") -- 红色
end
if t.type == 0 then
-- 脱离战斗状态
GUI:Text_setString(LeftAttrOBJ.ui.zhuangTai, "脱战状态")
GUI:Text_setTextColor(LeftAttrOBJ.ui.zhuangTai, "#00FF00") -- 绿色
end
end
-- 处理特殊Buff(ID: 10003)
if t.buffID == 10003 then
if t.type == 1 then
-- 获取玩家对象ID
local actorID = SL:GetMetaValue("MAIN_ACTOR_ID")
-- 获取10003号buff信息
local _buff = SL:GetMetaValue("ACTOR_BUFF_DATA_BY_ID", actorID, 10003)
-- 获取该buff剩余时间
local endtime = _buff["endTime"]
self.endtime = endtime
end
end
end
--[[
@function onAttrChange
@brief 属性变化事件处理
@return void
@desc 当玩家属性发生变化时更新显示的数值
]]
function LeftAttrOBJ:onAttrChange()
-- 重新初始化UI
self:reloadInit()
-- 获取各项属性值
local qieGe = SL:GetMetaValue("ATT_BY_TYPE", 200) -- 切割属性
local baoLv = SL:GetMetaValue("ATT_BY_TYPE", 204) -- 暴击率属性
local gongSu = SL:GetMetaValue("ATT_BY_TYPE", 228) -- 攻击速度属性
-- 更新UI显示
GUI:Text_setString(self.ui.qieGe, qieGe)
GUI:Text_setString(self.ui.baoLv, baoLv .. "%") -- 暴率显示为百分比
GUI:Text_setString(self.ui.gongSu, gongSu + 100 .. "%") -- 攻速基础值+100后显示为百分比
end
--[[
@function UpdateUI
@brief 更新复活状态UI显示
@return void
@desc 根据复活状态数据更新UI,支持文本状态和倒计时显示
]]
function LeftAttrOBJ:UpdateUI()
-- 重新初始化UI
self:reloadInit()
-- 停止该控件下的定时器
GUI:unSchedule(self.ui.fuHuo)
-- 处理字符串类型的状态(如"未穿戴"、"已穿戴"等)
if type(self.state[1]) == "string" then
GUI:Text_setString(self.ui.fuHuo, self.state[1])
if self.state[1] == "未穿戴" then
GUI:Text_setTextColor(self.ui.fuHuo, "#FF0000") -- 红色
else
GUI:Text_setTextColor(self.ui.fuHuo, "#00FF00") -- 绿色
end
end
-- 处理数字类型的状态(倒计时)
if type(self.state[1]) == "number" then
local times = self.state[1]
GUI:Text_setTextColor(self.ui.fuHuo, "#FF0000") -- 红色
GUI:Text_setString(self.ui.fuHuo, "倒计时" .. times .. "秒")
-- 倒计时显示函数
local function showTime()
GUI:Text_setString(self.ui.fuHuo, "倒计时" .. times .. "秒")
times = times - 1
if times < 0 then
-- 倒计时结束,停止定时器
GUI:unSchedule(self.ui.fuHuo)
end
end
-- 启动每秒更新的定时器
GUI:schedule(self.ui.fuHuo, showTime, 1)
end
end
--[[
@function reloadInit
@brief 重新初始化UI代理
@return void
@desc 确保UI代理对象存在,用于防止UI对象丢失的情况
]]
function LeftAttrOBJ:reloadInit()
if not self.ui then
local parent = GUI:Win_FindParent(105)
self.ui = GUI:ui_delegate(parent)
end
end
--[[
@function onEnterGameWorld
@brief 进入游戏世界事件处理
@return void
@desc 游戏加载完成后优先创建左侧属性面板
]]
local function onEnterGameWorld()
LeftAttrOBJ.isInit = true
createLeftPanel()
end
-- 注册进入游戏世界事件
SL:RegisterLUAEvent(LUA_EVENT_ENTER_WORLD, "LeftAttr", onEnterGameWorld)
--[[
@function onBuffUpdate
@brief Buff更新事件处理函数
@param t Buff更新数据
@return void
]]
local function onBuffUpdate(t)
LeftAttrOBJ:onBuffUpdate(t)
end
-- 注册主角Buff更新事件
SL:RegisterLUAEvent(LUA_EVENT_MAINBUFFUPDATE, "LeftAttr", onBuffUpdate)
--[[
@function onAttrChange
@brief 属性变化事件处理函数
@return void
]]
local function onAttrChange()
LeftAttrOBJ:onAttrChange()
end
-- 注册角色属性变化事件
SL:RegisterLUAEvent(LUA_EVENT_ROLE_PROPERTY_CHANGE, "LeftAttr", onAttrChange)
-------------------------------↓↓↓ 网络消息 ↓↓↓---------------------------------------
--[[
@function SyncResponse
@brief 登录同步消息处理(已注释)
@param arg1, arg2, arg3 消息参数
@param data 同步数据
@return void
@desc 处理服务器同步的数据,当前已被注释掉
]]
--function LeftAttrOBJ:SyncResponse(arg1, arg2, arg3, data)
-- self.data = data
-- if GUI:GetWindow(nil, self.__cname) then
-- --self:UpdateUI()
-- end
--end
--[[
@function FuHuo
@brief 复活状态网络消息处理
@param arg1, arg2, arg3 消息参数
@param state 复活状态数据
@return void
@desc 接收服务器发送的复活状态信息并更新UI显示
]]
function LeftAttrOBJ:FuHuo(arg1, arg2, arg3, state)
-- 确保UI已初始化
if not self.ui then
local parent = GUI:Win_FindParent(105)
self.ui = GUI:ui_delegate(parent)
end
-- 保存状态数据
self.state = state
-- 更新UI显示
self:UpdateUI()
end
-- 返回模块对象
return LeftAttrOBJ