-- 隐藏所有小球
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
你的代码问题在于特效位置计算。`GUI:getPosition(widget)` 获取的是相对于父控件的坐标,而 `GUI:Effect_Create` 的 x, y 参数也是相对于同一个父控件的坐标。但你可能希望特效直接显示在小球的位置上。
**问题分析:**
当 `widget` 是小球控件时,`pos.x` 和 `pos.y` 已经是相对于小球父控件的坐标。再用这个坐标在小球内部创建特效,会导致特效位置偏移。
**解决方案:**
如果希望特效覆盖在小球上,应该在小球的位置(0,0)创建特效,或者直接以场景根节点为父控件。
**方法一:在小球位置(0,0)创建特效**
```lua
-- 创建并播放特效 ID: 86325
-- 在小球自身坐标系原点创建
local effectWidget = GUI:Effect_Create(widget, "ball_effect", 0, 0, 0, 86325)
```
**方法二:在场景根节点创建特效(推荐)**
```lua
-- 获取小球在场景中的世界坐标
local pos = GUI:getPosition(widget)
-- 获取小球的父节点,作为特效的父节点
local parent = GUI:getParent(widget)
-- 在相同位置创建特效
local effectWidget = GUI:Effect_Create(parent, "ball_effect", pos.x, pos.y, 0, 86325)
```
**完整修正代码:**
```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 parent = GUI:getParent(widget)
-- 获取小球在父节点中的位置
local pos = GUI:getPosition(widget)
-- 在父节点相同位置创建特效
local effectWidget = GUI:Effect_Create(parent, "ball_effect", pos.x, pos.y, 0, 86325)
-- 小球小幅弹动
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. `GUI:getPosition(widget)` 返回的是相对于父控件的坐标
2. `GUI:Effect_Create` 的 x, y 参数也是相对于传入的父控件
3. 要让特效和小球位置完全一致,需要确保它们有相同的父控件和坐标
这样修改后,特效就会准确显示在小球的位置上了。