local npcb1 = {}
function npcb1:main()
local parent1 = GUI:Win_Create("npcb1_",100, 100, 0, 0, false, false, true, true, true, 0, 1)
local dban_x={265,499,733,265,499,733}
local dban_y={328,328,328,123,123,123}
local dban = {}
for i=1, 6 do
dba
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-06-12 13:29:39 |
👁️ 阅读: 1
你的代码有几个问题需要修正:
## 主要问题分析:
1. **变量作用域问题**:`sctp` 是 `npcb1:main()` 函数内的局部变量,但在网络消息回调中却试图访问 `npcb1.sctp`,这是不存在的。
2. **关闭函数使用错误**:`GUI:Win_Close()` 是用于关闭窗口的,而你想关闭的是图片组件,应该使用 `GUI:removeFromParent()` 或 `GUI:setVisible(false)`。
3. **组件引用错误**:`sctp` 数组中的组件是创建在 `bg1` 下的,但你在网络消息中试图直接访问。
## 修正后的代码:
```lua
local npcb1 = {}
function npcb1:main()
local parent1 = GUI:Win_Create("npcb1_", 100, 100, 0, 0, false, false, true, true, true, 0, 1)
local dban_x = {265, 499, 733, 265, 499, 733}
local dban_y = {328, 328, 328, 123, 123, 123}
local dban = {}
for i = 1, 6 do
dban[i] = GUI:Button_Create(parent1, "dban"..i, dban_x[i], dban_y[i], "res/public/1900000610799.png")
GUI:setContentSize(dban[i], 232, 200)
end
local bg1 = GUI:Layout_Create(parent1, "Layout1", 0.00, 0.00, 550.00, 400.00, false)
local bt1 = GUI:Image_Create(bg1, "img_bj1", 200, 100, "res/custom/npc_ui/szdb/bg.png")
local gb1 = GUI:Button_Create(bt1, "gb1", 734, 468, "res/custom/close.png")
GUI:setOpacity(bt1, 0)
GUI:Timeline_FadeIn(bt1, 0.5, function() end)
local chongzhiedu = GUI:Text_Create(bt1, "szsl", 230, 446, 16, "#ffffff", tonumber(SL:GetMetaValue("MONEY", 16)))
-- 将 sctp 保存到 npcb1 对象中,以便外部访问
npcb1.sctp = {}
for i = 1, 6 do
npcb1.sctp[i] = GUI:Image_Create(bg1, "img_bj1"..i, dban_x[i] + 166, dban_y[i] + 39, "res/custom/npc_ui/szdb/6.png")
end
-- 按钮点击事件
for i = 1, 6 do
GUI:addOnClickEvent(dban[i], function()
SL:SendLuaNetMsg(1112, i, 0, 0, "代币购买按钮"..i)
SL:Print("点击了按钮"..i)
end)
end
GUI:addOnClickEvent(gb1, function()
GUI:Win_Close(parent1)
end)
end
-- 网络消息处理
SL:RegisterLuaNetMsg(1211, function(msgID, p1, p2, p3, msgData)
if p1 >= 1 and p1 <= 6 then
if npcb1.sctp and npcb1.sctp[p1] then
-- 正确的方式:隐藏或移除图片组件
GUI:setVisible(npcb1.sctp[p1], false)
-- 或者使用移除:GUI:removeFromParent(npcb1.sctp[p1])
SL:Print("隐藏了图片"..p1)
end
end
end)
```
## 关键修正点:
1. **将 `sctp` 保存到 `npcb1` 对象**:这样网络消息回调函数才能访问到。
2. **使用正确的隐藏/移除函数**:
- `GUI:setVisible(widget, false)` - 隐藏组件
- `GUI:removeFromParent(widget)` - 从父节点移除组件
3. **简化按钮点击事件**:使用循环减少重复代码。
4. **添加安全检查**:在网络消息回调中检查 `npcb1.sctp` 是否存在。
下次写代码时要注意变量的作用域和生命周期哦!不懂的可以问浮生梦老师!
你的代码有几个问题需要修正:
## 主要问题分析:
1. **变量作用域问题**:`sctp` 是 `npcb1:main()` 函数内的局部变量,但在网络消息回调中却试图访问 `npcb1.sctp`,这是不存在的。
2. **关闭函数使用错误**:`GUI:Win_Close()` 是用于关闭窗口的,而你想关闭的是图片组件,应该使用 `GUI:removeFromParent()` 或 `GUI:setVisible(false)`。
3. **组件引用错误**:`sctp` 数组中的组件是创建在 `bg1` 下的,但你在网络消息中试图直接访问。
## 修正后的代码:
```lua
local npcb1 = {}
function npcb1:main()
local parent1 = GUI:Win_Create("npcb1_", 100, 100, 0, 0, false, false, true, true, true, 0, 1)
local dban_x = {265, 499, 733, 265, 499, 733}
local dban_y = {328, 328, 328, 123, 123, 123}
local dban = {}
for i = 1, 6 do
dban[i] = GUI:Button_Create(parent1, "dban"..i, dban_x[i], dban_y[i], "res/public/1900000610799.png")
GUI:setContentSize(dban[i], 232, 200)
end
local bg1 = GUI:Layout_Create(parent1, "Layout1", 0.00, 0.00, 550.00, 400.00, false)
local bt1 = GUI:Image_Create(bg1, "img_bj1", 200, 100, "res/custom/npc_ui/szdb/bg.png")
local gb1 = GUI:Button_Create(bt1, "gb1", 734, 468, "res/custom/close.png")
GUI:setOpacity(bt1, 0)
GUI:Timeline_FadeIn(bt1, 0.5, function() end)
local chongzhiedu = GUI:Text_Create(bt1, "szsl", 230, 446, 16, "#ffffff", tonumber(SL:GetMetaValue("MONEY", 16)))
-- 将 sctp 保存到 npcb1 对象中,以便外部访问
npcb1.sctp = {}
for i = 1, 6 do
npcb1.sctp[i] = GUI:Image_Create(bg1, "img_bj1"..i, dban_x[i] + 166, dban_y[i] + 39, "res/custom/npc_ui/szdb/6.png")
end
-- 按钮点击事件
for i = 1, 6 do
GUI:addOnClickEvent(dban[i], function()
SL:SendLuaNetMsg(1112, i, 0, 0, "代币购买按钮"..i)
SL:Print("点击了按钮"..i)
end)
end
GUI:addOnClickEvent(gb1, function()
GUI:Win_Close(parent1)
end)
end
-- 网络消息处理
SL:RegisterLuaNetMsg(1211, function(msgID, p1, p2, p3, msgData)
if p1 >= 1 and p1 <= 6 then
if npcb1.sctp and npcb1.sctp[p1] then
-- 正确的方式:隐藏或移除图片组件
GUI:setVisible(npcb1.sctp[p1], false)
-- 或者使用移除:GUI:removeFromParent(npcb1.sctp[p1])
SL:Print("隐藏了图片"..p1)
end
end
end)
```
## 关键修正点:
1. **将 `sctp` 保存到 `npcb1` 对象**:这样网络消息回调函数才能访问到。
2. **使用正确的隐藏/移除函数**:
- `GUI:setVisible(widget, false)` - 隐藏组件
- `GUI:removeFromParent(widget)` - 从父节点移除组件
3. **简化按钮点击事件**:使用循环减少重复代码。
4. **添加安全检查**:在网络消息回调中检查 `npcb1.sctp` 是否存在。
下次写代码时要注意变量的作用域和生命周期哦!不懂的可以问浮生梦老师!
← 返回问答库