-- 隐藏所有小球
for i = 1, 5 do
local widget = ui["Effect_"..i]
if GUI:Win_IsNotNull(widget) then
GUI:setVisible(widget, false)
end
end
-- 显示小球 + 只播放最新一个动画
for i = 1, effectPos do
local widget = ui["Effect_" .. i]
if not GUI:Wi
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-04-22 22:24:22 |
👁️ 阅读: 16
看了你的代码,问题主要出在坐标获取和父节点选择上。`GUI:getPosition(widget)`获取的是相对于父节点的本地坐标,而你需要的是世界坐标。
另外,特效创建时应该使用正确的父节点层级。以下是修正后的代码:
```lua
-- 隐藏所有小球
for i = 1, 5 do
local widget = ui["Effect_"..i]
if GUI:Win_IsNotNull(widget) then
GUI:setVisible(widget, false)
end
end
-- 显示小球 + 只播放最新一个动画
for i = 1, effectPos do
local widget = ui["Effect_" .. i]
if not GUI:Win_IsNull(widget) then
GUI:setVisible(widget, true)
if i == effectPos and effectPos ~= zhuansheng.lastEffectPos then
-- 关键修正:获取世界坐标而不是本地坐标
-- 先获取本地坐标
local localPos = GUI:getPosition(widget)
-- 获取父节点
local parent = GUI:getParent(widget)
-- 计算世界坐标(需要转换为世界坐标系)
local worldX = localPos.x
local worldY = localPos.y
-- 逐级向上转换坐标
while parent and not GUI:Win_IsNull(parent) do
local parentPos = GUI:getPosition(parent)
worldX = worldX + parentPos.x
worldY = worldY + parentPos.y
parent = GUI:getParent(parent)
end
-- 创建特效:使用场景根节点作为父节点
local sceneRoot = zhuansheng.parent._ui.root or ui.root
if not sceneRoot then
-- 如果找不到根节点,使用当前界面最顶层
sceneRoot = GUI:Win_Create("TempRoot", 0, 0, 0, 0, false, false, true, false, false, false, 1)
end
local effectWidget = GUI:Effect_Create(
sceneRoot, -- 使用场景根节点确保特效在最上层
"eff_86325_" .. os.time(), -- 确保ID唯一
worldX, -- 使用计算后的世界坐标X
worldY, -- 使用计算后的世界坐标Y
0, -- 特效类型:0代表特效
86325, -- 特效ID
nil, -- 性别(可选)
nil, -- 动作(可选)
nil, -- 方向(可选)
nil -- 播放速度(可选)
)
-- 小球弹动动画
GUI:runAction(widget, GUI:ActionSequence(
GUI:ActionScaleTo(0.2, 1.2),
GUI:ActionScaleTo(0.2, 1.0)
))
-- 特效播放完成后的回调
GUI:Effect_addOnCompleteEvent(effectWidget, function()
if not GUI:Win_IsNull(effectWidget) then
GUI:removeFromParent(effectWidget)
end
end)
end
end
end
```
**主要修改点:**
1. **坐标转换**:通过逐级向上累加父节点坐标的方式,将本地坐标转换为世界坐标
2. **父节点选择**:使用场景根节点作为特效的父节点,确保特效在最上层显示
3. **ID唯一性**:给特效ID添加时间戳,避免重复ID导致的冲突
**调试建议:**
你可以在创建特效前添加调试输出,确认坐标是否正确:
```lua
SL:print("本地坐标: x=" .. localPos.x .. ", y=" .. localPos.y)
SL:print("世界坐标: x=" .. worldX .. ", y=" .. worldY)
```
如果还是有问题,可能是你的小球控件层级结构比较复杂,需要更精确的坐标转换。可以先用一个固定坐标测试特效是否正常显示。
看了你的代码,问题主要出在坐标获取和父节点选择上。`GUI:getPosition(widget)`获取的是相对于父节点的本地坐标,而你需要的是世界坐标。
另外,特效创建时应该使用正确的父节点层级。以下是修正后的代码:
```lua
-- 隐藏所有小球
for i = 1, 5 do
local widget = ui["Effect_"..i]
if GUI:Win_IsNotNull(widget) then
GUI:setVisible(widget, false)
end
end
-- 显示小球 + 只播放最新一个动画
for i = 1, effectPos do
local widget = ui["Effect_" .. i]
if not GUI:Win_IsNull(widget) then
GUI:setVisible(widget, true)
if i == effectPos and effectPos ~= zhuansheng.lastEffectPos then
-- 关键修正:获取世界坐标而不是本地坐标
-- 先获取本地坐标
local localPos = GUI:getPosition(widget)
-- 获取父节点
local parent = GUI:getParent(widget)
-- 计算世界坐标(需要转换为世界坐标系)
local worldX = localPos.x
local worldY = localPos.y
-- 逐级向上转换坐标
while parent and not GUI:Win_IsNull(parent) do
local parentPos = GUI:getPosition(parent)
worldX = worldX + parentPos.x
worldY = worldY + parentPos.y
parent = GUI:getParent(parent)
end
-- 创建特效:使用场景根节点作为父节点
local sceneRoot = zhuansheng.parent._ui.root or ui.root
if not sceneRoot then
-- 如果找不到根节点,使用当前界面最顶层
sceneRoot = GUI:Win_Create("TempRoot", 0, 0, 0, 0, false, false, true, false, false, false, 1)
end
local effectWidget = GUI:Effect_Create(
sceneRoot, -- 使用场景根节点确保特效在最上层
"eff_86325_" .. os.time(), -- 确保ID唯一
worldX, -- 使用计算后的世界坐标X
worldY, -- 使用计算后的世界坐标Y
0, -- 特效类型:0代表特效
86325, -- 特效ID
nil, -- 性别(可选)
nil, -- 动作(可选)
nil, -- 方向(可选)
nil -- 播放速度(可选)
)
-- 小球弹动动画
GUI:runAction(widget, GUI:ActionSequence(
GUI:ActionScaleTo(0.2, 1.2),
GUI:ActionScaleTo(0.2, 1.0)
))
-- 特效播放完成后的回调
GUI:Effect_addOnCompleteEvent(effectWidget, function()
if not GUI:Win_IsNull(effectWidget) then
GUI:removeFromParent(effectWidget)
end
end)
end
end
end
```
**主要修改点:**
1. **坐标转换**:通过逐级向上累加父节点坐标的方式,将本地坐标转换为世界坐标
2. **父节点选择**:使用场景根节点作为特效的父节点,确保特效在最上层显示
3. **ID唯一性**:给特效ID添加时间戳,避免重复ID导致的冲突
**调试建议:**
你可以在创建特效前添加调试输出,确认坐标是否正确:
```lua
SL:print("本地坐标: x=" .. localPos.x .. ", y=" .. localPos.y)
SL:print("世界坐标: x=" .. worldX .. ", y=" .. worldY)
```
如果还是有问题,可能是你的小球控件层级结构比较复杂,需要更精确的坐标转换。可以先用一个固定坐标测试特效是否正常显示。
← 返回问答库