local function networkCB(msgID, msgData)
local parent = GUI:Attach_RightTop()
local ui = GUI:ui_delegate(parent)
local tag = GUI:getTag(ui['bt_11'])
SL:print(tag)
if tag == -1 then
GUI:setTag(ui['bt_11'],1)
G
你的代码逻辑存在一个关键问题:**回调函数重复绑定**。
让我帮你分析一下问题所在:
```lua
local function networkCB(msgID, msgData)
local parent = GUI:Attach_RightTop()
local ui = GUI:ui_delegate(parent)
local tag = GUI:getTag(ui['bt_11'])
SL:print(tag)
if tag == -1 then
-- 第一次点击:设置tag为1,并绑定点击事件
GUI:setTag(ui['bt_11'], 1)
GUI:addOnClickEvent(ui['bt_11'], function()
-- 这里每次都把tag重新设为1!
GUI:setTag(ui['bt_11'], 1)
for i = 1, 10 do
GUI:setOpacity(ui['bt_'..i], 255)
local fadeOutAction = GUI:ActionFadeTo(0.5, 0)
local hideFunc = GUI:CallFunc(function()
GUI:setVisible(ui['bt_'..i], false)
end)
GUI:runAction(ui['bt_'..i], GUI:ActionSequence(fadeOutAction, hideFunc))
end
end)
return
end
if tag == 1 then
-- 永远不会走到这里,因为回调里又把tag设回了1
GUI:setTag(ui['bt_11'], -1)
-- zhankai(ui)
return
end
end
SL:RegisterNetMsg(1000, networkCB)
```
**问题分析:**
1. **第一次执行** `networkCB` 时:
- `tag == -1`(初始值)
- 设置 `tag = 1`
- 绑定点击事件到 `bt_11`
2. **点击按钮时**:
- 执行回调函数
- 回调函数里又执行 `GUI:setTag(ui['bt_11'], 1)` ← **这里就是问题!**
- 所以tag永远保持为1
3. **再次收到网络消息**:
- `tag == 1`(因为回调里设成了1)
- 应该执行 `tag == 1` 的分支,但是...
- 点击按钮的回调又把tag设回1,所以永远无法进入 `tag == 1` 的分支
**解决方案:**
```lua
local function networkCB(msgID, msgData)
local parent = GUI:Attach_RightTop()
local ui = GUI:ui_delegate(parent)
local tag = GUI:getTag(ui['bt_11'])
SL:print("当前tag值:", tag)
if tag == -1 then
GUI:setTag(ui['bt_11'], 1)
GUI:addOnClickEvent(ui['bt_11'], function()
-- 移除这行:GUI:setTag(ui['bt_11'], 1)
for i = 1, 10 do
GUI:setOpacity(ui['bt_'..i], 255)
local fadeOutAction = GUI:ActionFadeTo(0.5, 0)
local hideFunc = GUI:CallFunc(function()
GUI:setVisible(ui['bt_'..i], false)
end)
GUI:runAction(ui['bt_'..i], GUI:ActionSequence(fadeOutAction, hideFunc))
end
end)
return
end
if tag == 1 then
GUI:setTag(ui['bt_11'], -1)
-- zhankai(ui) 展开函数
return
end
end
```
**建议:**
下次写这种状态切换逻辑时,记得不要在回调里重复设置状态值,否则会导致状态机混乱。这是一个常见的编程错误,多注意一下就好!