local npc = {}
npc.BossReliveCfg = {
[1] = {
monsterName = "牛魔王",
mapName = "牛魔寺庙",
reliveTime = 120
},
[2] = {
monsterName = "黑狐",
mapName = "狐月山",
reliveTime = 120
},
[3] = {
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-05-14 23:35:19 |
👁️ 阅读: 13
要让BOSS刷新列表的文字在中间显示,关键是要正确计算文本的居中位置。从你代码中可以看到,你已经在尝试计算 `textName_x`、`textMap_x` 和 `textTime_x` 来实现居中,但计算方式可能不够精确。
一个更可靠的方法是使用 `GUI:Text_getContentSize(text)` 来获取文本的实际渲染尺寸,然后根据父容器的宽度来计算居中位置。
这里是你修改后的 `openWin` 函数中的相关部分:
```lua
function npc:openWin()
-- 创造外部界面
local win_Boss = GUI:Win_Create("win_Boss", 0, 0, 0, 0)
GUI:LoadExport(win_Boss, "Boss")
npc.ui = GUI:ui_delegate(win_Boss)
GUI:addOnClickEvent(npc.ui.esc, function()
GUI:Win_Close(win_Boss)
end)
for k, v in ipairs(npc.BossReliveCfg) do
-- Boss名列表
local panel1 = "Panel1_"..k
local panel_First = GUI:Layout_Create(npc.ui.ListView_1, panel1, 0, 370, 120, 30, false)
local text1 = "Text1_"..k
local text_Name = GUI:Text_Create(panel_First, text1, 0, 6, 16, "#00B100", v.monsterName)
GUI:Text_setFontName(text_Name, "ZiHunJianQiShouShu/ZiHunJianQiShouShu(ShangYongXuShouQuan)-2.ttf")
GUI:Text_enableOutline(text_Name, "#000000", 1)
-- 获取文本尺寸并居中
local textSize = GUI:Text_getContentSize(text_Name)
local centerX = (120 - textSize.width) * 0.5
GUI:setPosition(text_Name, centerX, 6)
-- Boss地图名列表
local panel2 = "Panel2_"..k
local panel_Second = GUI:Layout_Create(npc.ui.ListView_2, panel2, 0, 370, 120, 30, false)
local text2 = "Text2_"..k
local text_name = GUI:Text_Create(panel_Second, text2, 0, 6, 16, "#d90031", v.mapName)
GUI:Text_setFontName(text_name, "ZiHunJianQiShouShu/ZiHunJianQiShouShu(ShangYongXuShouQuan)-2.ttf")
GUI:Text_enableOutline(text_name, "#000000", 1)
-- 获取文本尺寸并居中
local textSize2 = GUI:Text_getContentSize(text_name)
local centerX2 = (120 - textSize2.width) * 0.5
GUI:setPosition(text_name, centerX2, 6)
-- Boss复活时间列表
local panel3 = "Panel3_"..k
local panel_Third = GUI:Layout_Create(npc.ui.ListView_3, panel3, 0, 370, 120, 30, false)
local text3 = "Text3_"..k
local timeText = tostring(v.reliveTime) -- 注意:这里显示的是分钟数,不是秒
local text_Time = GUI:Text_Create(panel_Third, text3, 0, 6, 16, "#0000e7", timeText)
GUI:Text_setFontName(text_Time, "ZiHunJianQiShouShu/ZiHunJianQiShouShu(ShangYongXuShouQuan)-2.ttf")
-- 获取文本尺寸并居中
local textSize3 = GUI:Text_getContentSize(text_Time)
local centerX3 = (120 - textSize3.width) * 0.5
GUI:setPosition(text_Time, centerX3, 6)
GUI:Text_COUNTDOWN(text_Time, v.reliveTime * 60, function()
GUI:Text_enableOutline(text_Time, "#000000", 1)
GUI:Text_setString(text_Time, "已刷新")
-- 刷新后重新居中
local newSize = GUI:Text_getContentSize(text_Time)
local newCenterX = (120 - newSize.width) * 0.5
GUI:setPosition(text_Time, newCenterX, 6)
end, 0)
end
end
```
**主要修改点:**
1. **初始位置**:创建文本时,先将横坐标 `x` 设为 `0`。
2. **获取尺寸**:使用 `GUI:Text_getContentSize(text)` 获取文本的实际宽度和高度(返回一个包含 `width` 和 `height` 的table)。
3. **计算居中**:根据父容器宽度(这里是 `120`)和文本宽度计算居中位置:`centerX = (父宽 - 文本宽) * 0.5`。
4. **设置位置**:使用 `GUI:setPosition(text, centerX, y)` 将文本移动到居中位置。
5. **倒计时结束**:在倒计时结束的回调函数中,当文本变为“已刷新”后,再次获取新文本的尺寸并重新居中。
这样就能确保不同长度的怪物名、地图名和倒计时文本都能在各自的列表项中完美居中了。记得倒计时结束后要重新计算“已刷新”的位置哦!
← 返回问答库