[LUA-print] ----------------------------------------
Warning: cc.Node:runAction argument 2 is invalid native object(nullptr)
[LUA-print] ----------------------------------------
[LUA-print] LUA ERROR: ASSERT FAILED ON LUA EXECUTE: Argument must be no
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-04-27 18:21:47 |
👁️ 阅读: 10
你的代码有几个问题需要修复:
## 主要问题分析
1. **动作对象创建时机错误**:你在 `if a == 1 then` 块中创建了动作,但这个块在界面打开时只执行一次,而点击按钮时可能动作对象已经失效。
2. **`runAction` 参数错误**:错误信息显示第二个参数是无效的本地对象(nullptr),说明动作对象为空。
3. **`GUI:ActionEaseExponentialOut` 使用错误**:这个函数需要包裹一个动作对象,而不是在回调函数中调用。
## 修复后的代码
```lua
function npc:openWin()
-- 创造外部界面
local win_donate = GUI:Win_Create("win_donate", 0, 0, 0, 0)
GUI:LoadExport(win_donate, "donate")
npc.ui = GUI:ui_delegate(win_donate)
GUI:addOnClickEvent(npc.ui.esc, function()
GUI:Win_Close(win_donate)
end)
-- 左侧平移动画
local a = 1
GUI:addOnClickEvent(npc.ui.Button_1, function()
if a == 1 then
a = 2
GUI:Timeline_MoveTo(npc.ui.Panel_1, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_3, {x = 5, y = -316}, 0, function() end)
elseif a == 2 then
a = 3
GUI:Timeline_MoveTo(npc.ui.Panel_2, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_1, {x = 5, y = -316}, 0, function() end)
else
a = 1
GUI:Timeline_MoveTo(npc.ui.Panel_3, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_2, {x = 5, y = -316}, 0, function() end)
end
local panelName = "Panel_" .. a
local moveActionUp_1 = GUI:ActionMoveTo(0.2, 5, 35)
local moveActionDown_1 = GUI:ActionMoveTo(0.3, 5, 0)
local moveAction_Up = GUI:ActionSequence(moveActionUp_1, moveActionDown_1)
-- 正确使用 ActionEaseExponentialOut
GUI:runAction(npc.ui[panelName], GUI:ActionEaseExponentialOut(moveAction_Up))
end)
GUI:addOnClickEvent(npc.ui.Button_2, function()
if a == 1 then
a = 3
GUI:Timeline_MoveTo(npc.ui.Panel_2, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_1, {x = 5, y = -316}, 0, function() end)
elseif a == 3 then
a = 2
GUI:Timeline_MoveTo(npc.ui.Panel_1, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_3, {x = 5, y = -316}, 0, function() end)
else
a = 1
GUI:Timeline_MoveTo(npc.ui.Panel_3, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_2, {x = 5, y = -316}, 0, function() end)
end
local panelName = "Panel_" .. a
local moveActionUp_2 = GUI:ActionMoveTo(0.3, 5, -35)
local moveActionDown_2 = GUI:ActionMoveTo(0.2, 5, 0)
local moveAction_Down = GUI:ActionSequence(moveActionUp_2, moveActionDown_2)
-- 正确使用 ActionEaseExponentialOut
GUI:runAction(npc.ui[panelName], GUI:ActionEaseExponentialOut(moveAction_Down))
end)
-- 修复 Button_3 的点击事件
GUI:addOnClickEvent(npc.ui.Button_3, function()
-- 每次点击都重新创建动作对象
local action = GUI:ActionSpawn(
GUI:ActionScaleTo(0.2, 80),
GUI:ActionMoveTo(0.2, 32, 127)
)
-- 先检查控件是否存在
if not GUI:Win_IsNull(npc.ui.Effect_2) then
GUI:runAction(npc.ui.Effect_2, action)
else
SL:print("Effect_2 控件不存在或已销毁")
end
end)
end
```
## 关键修改点
1. **动作创建时机**:将 `Button_3` 的动作创建移到点击回调内部,确保每次点击都创建新的有效动作对象。
2. **控件存在性检查**:使用 `GUI:Win_IsNull()` 检查控件是否存在再执行动作。
3. **`ActionEaseExponentialOut` 正确用法**:这个函数应该直接包裹动作对象,而不是在回调中调用。
4. **移除无效的 `GUI:Timeline_MoveTo` 回调**:原来的回调函数用法不正确。
下次注意动作对象的生命周期和控件存在性检查,有问题可以再问浮生梦尊师!
你的代码有几个问题需要修复:
## 主要问题分析
1. **动作对象创建时机错误**:你在 `if a == 1 then` 块中创建了动作,但这个块在界面打开时只执行一次,而点击按钮时可能动作对象已经失效。
2. **`runAction` 参数错误**:错误信息显示第二个参数是无效的本地对象(nullptr),说明动作对象为空。
3. **`GUI:ActionEaseExponentialOut` 使用错误**:这个函数需要包裹一个动作对象,而不是在回调函数中调用。
## 修复后的代码
```lua
function npc:openWin()
-- 创造外部界面
local win_donate = GUI:Win_Create("win_donate", 0, 0, 0, 0)
GUI:LoadExport(win_donate, "donate")
npc.ui = GUI:ui_delegate(win_donate)
GUI:addOnClickEvent(npc.ui.esc, function()
GUI:Win_Close(win_donate)
end)
-- 左侧平移动画
local a = 1
GUI:addOnClickEvent(npc.ui.Button_1, function()
if a == 1 then
a = 2
GUI:Timeline_MoveTo(npc.ui.Panel_1, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_3, {x = 5, y = -316}, 0, function() end)
elseif a == 2 then
a = 3
GUI:Timeline_MoveTo(npc.ui.Panel_2, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_1, {x = 5, y = -316}, 0, function() end)
else
a = 1
GUI:Timeline_MoveTo(npc.ui.Panel_3, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_2, {x = 5, y = -316}, 0, function() end)
end
local panelName = "Panel_" .. a
local moveActionUp_1 = GUI:ActionMoveTo(0.2, 5, 35)
local moveActionDown_1 = GUI:ActionMoveTo(0.3, 5, 0)
local moveAction_Up = GUI:ActionSequence(moveActionUp_1, moveActionDown_1)
-- 正确使用 ActionEaseExponentialOut
GUI:runAction(npc.ui[panelName], GUI:ActionEaseExponentialOut(moveAction_Up))
end)
GUI:addOnClickEvent(npc.ui.Button_2, function()
if a == 1 then
a = 3
GUI:Timeline_MoveTo(npc.ui.Panel_2, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_1, {x = 5, y = -316}, 0, function() end)
elseif a == 3 then
a = 2
GUI:Timeline_MoveTo(npc.ui.Panel_1, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_3, {x = 5, y = -316}, 0, function() end)
else
a = 1
GUI:Timeline_MoveTo(npc.ui.Panel_3, {x = 5, y = 316}, 0, function() end)
GUI:Timeline_MoveTo(npc.ui.Panel_2, {x = 5, y = -316}, 0, function() end)
end
local panelName = "Panel_" .. a
local moveActionUp_2 = GUI:ActionMoveTo(0.3, 5, -35)
local moveActionDown_2 = GUI:ActionMoveTo(0.2, 5, 0)
local moveAction_Down = GUI:ActionSequence(moveActionUp_2, moveActionDown_2)
-- 正确使用 ActionEaseExponentialOut
GUI:runAction(npc.ui[panelName], GUI:ActionEaseExponentialOut(moveAction_Down))
end)
-- 修复 Button_3 的点击事件
GUI:addOnClickEvent(npc.ui.Button_3, function()
-- 每次点击都重新创建动作对象
local action = GUI:ActionSpawn(
GUI:ActionScaleTo(0.2, 80),
GUI:ActionMoveTo(0.2, 32, 127)
)
-- 先检查控件是否存在
if not GUI:Win_IsNull(npc.ui.Effect_2) then
GUI:runAction(npc.ui.Effect_2, action)
else
SL:print("Effect_2 控件不存在或已销毁")
end
end)
end
```
## 关键修改点
1. **动作创建时机**:将 `Button_3` 的动作创建移到点击回调内部,确保每次点击都创建新的有效动作对象。
2. **控件存在性检查**:使用 `GUI:Win_IsNull()` 检查控件是否存在再执行动作。
3. **`ActionEaseExponentialOut` 正确用法**:这个函数应该直接包裹动作对象,而不是在回调中调用。
4. **移除无效的 `GUI:Timeline_MoveTo` 回调**:原来的回调函数用法不正确。
下次注意动作对象的生命周期和控件存在性检查,有问题可以再问浮生梦尊师!
← 返回问答库