local zhuansheng = {}
function zhuansheng.main(param1, param2, param3, param4)
SL:print("===== 转生界面打开 =====")
lib:Require(param1, function(state)
if state then
if param1 then
zhuansheng.parent = lib:o
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-03-11 19:48:10 |
👁️ 阅读: 22
你的代码中有一个关键问题:在动画执行前没有正确设置控件的初始位置。你虽然定义了`startX = 0`和`startY = targetY`,但在`ActionMoveBy`中使用的移动距离是基于`moveX = targetX - startX`计算的,而`startX`确实是0,这会导致从当前位置移动77像素。
但根据你的描述“初始位子是0,0”,如果控件`ui.Image_9`的初始位置真的是(0,0),那么`ActionMoveBy(0.5, moveX, moveY)`会让它移动到(77, 281),这是正确的。
问题可能出在**控件初始位置并非(0,0)**。`update_effect_icons`函数在`upmain`之前执行,它已经将`ui.Image_9`的位置设置为了`targetX, targetY`(即77, 281)。所以当动画开始时,控件已经在目标位置了,再执行`ActionMoveBy`就会移动过头。
**修复方案:** 在动画开始前,**强制**将控件重置到动画起点。修改按钮点击事件中的动画部分:
```lua
GUI:addOnClickEvent(ui["Button_1"], function()
SL:print("点击升级按钮")
-- 延迟按钮点击
GUI:delayTouchEnabled(ui["Button_1"], 0.2)
local msg = {}
msg.Script = zhuansheng.param1
local jsonstr = SL:JsonEncode(msg)
SL:SendLuaNetMsg(58003, zhuansheng.param2, 0, 0, jsonstr)
-- 检查条件
if next_data and lib and lib.checkitem then
local check_data = {
count = 2,
type1 = "物品",
name1 = next_data.name1 or "转生石",
value1 = tonumber(next_data.value1) or 0,
type2 = "货币",
name2 = next_data.name2 or "金币",
value2 = tonumber(next_data.value2) or 0,
}
local can_upgrade = lib:checkitem(check_data)
if not can_upgrade then
return
end
-- 明确设置动画起点和终点
local startX = 0
local startY = 281
local targetX = 77
local targetY = 281
-- 计算移动距离
local moveX = targetX - startX -- 77
local moveY = targetY - startY -- 0
-- 关键修复:先停止所有当前动作,然后重置到起点
GUI:stopAllActions(ui.Image_9)
GUI:setPosition(ui.Image_9, startX, startY)
GUI:setVisible(ui.Image_9, true)
-- 动画回调函数
local callback = function()
SL:print("Image_9动画完成,已固定在最终位置")
end
-- 执行动画序列:先缩放,再移动
GUI:runAction(ui.Image_9, GUI:ActionSequence(
GUI:ActionScaleTo(0.5, 1.4),
GUI:ActionScaleTo(0.5, 1),
GUI:ActionMoveBy(0.5, moveX, moveY),
GUI:CallFunc(callback)
))
end
end)
```
**主要修改点:**
1. 添加了 `GUI:stopAllActions(ui.Image_9)` - 停止控件上所有正在进行的动画,防止动画叠加
2. 在设置起点位置前先停止动作,确保位置重置生效
3. 明确设置了 `GUI:setVisible(ui.Image_9, true)`,确保控件可见
这样就能保证每次点击按钮时,`Image_9`都会从(0, 281)的位置开始动画,移动到(77, 281)。
另外,注意`update_effect_icons`函数中已经设置了`Image_9`的位置为`targetX, targetY`,所以动画执行前必须重置,否则起点就不对了。
你的代码中有一个关键问题:在动画执行前没有正确设置控件的初始位置。你虽然定义了`startX = 0`和`startY = targetY`,但在`ActionMoveBy`中使用的移动距离是基于`moveX = targetX - startX`计算的,而`startX`确实是0,这会导致从当前位置移动77像素。
但根据你的描述“初始位子是0,0”,如果控件`ui.Image_9`的初始位置真的是(0,0),那么`ActionMoveBy(0.5, moveX, moveY)`会让它移动到(77, 281),这是正确的。
问题可能出在**控件初始位置并非(0,0)**。`update_effect_icons`函数在`upmain`之前执行,它已经将`ui.Image_9`的位置设置为了`targetX, targetY`(即77, 281)。所以当动画开始时,控件已经在目标位置了,再执行`ActionMoveBy`就会移动过头。
**修复方案:** 在动画开始前,**强制**将控件重置到动画起点。修改按钮点击事件中的动画部分:
```lua
GUI:addOnClickEvent(ui["Button_1"], function()
SL:print("点击升级按钮")
-- 延迟按钮点击
GUI:delayTouchEnabled(ui["Button_1"], 0.2)
local msg = {}
msg.Script = zhuansheng.param1
local jsonstr = SL:JsonEncode(msg)
SL:SendLuaNetMsg(58003, zhuansheng.param2, 0, 0, jsonstr)
-- 检查条件
if next_data and lib and lib.checkitem then
local check_data = {
count = 2,
type1 = "物品",
name1 = next_data.name1 or "转生石",
value1 = tonumber(next_data.value1) or 0,
type2 = "货币",
name2 = next_data.name2 or "金币",
value2 = tonumber(next_data.value2) or 0,
}
local can_upgrade = lib:checkitem(check_data)
if not can_upgrade then
return
end
-- 明确设置动画起点和终点
local startX = 0
local startY = 281
local targetX = 77
local targetY = 281
-- 计算移动距离
local moveX = targetX - startX -- 77
local moveY = targetY - startY -- 0
-- 关键修复:先停止所有当前动作,然后重置到起点
GUI:stopAllActions(ui.Image_9)
GUI:setPosition(ui.Image_9, startX, startY)
GUI:setVisible(ui.Image_9, true)
-- 动画回调函数
local callback = function()
SL:print("Image_9动画完成,已固定在最终位置")
end
-- 执行动画序列:先缩放,再移动
GUI:runAction(ui.Image_9, GUI:ActionSequence(
GUI:ActionScaleTo(0.5, 1.4),
GUI:ActionScaleTo(0.5, 1),
GUI:ActionMoveBy(0.5, moveX, moveY),
GUI:CallFunc(callback)
))
end
end)
```
**主要修改点:**
1. 添加了 `GUI:stopAllActions(ui.Image_9)` - 停止控件上所有正在进行的动画,防止动画叠加
2. 在设置起点位置前先停止动作,确保位置重置生效
3. 明确设置了 `GUI:setVisible(ui.Image_9, true)`,确保控件可见
这样就能保证每次点击按钮时,`Image_9`都会从(0, 281)的位置开始动画,移动到(77, 281)。
另外,注意`update_effect_icons`函数中已经设置了`Image_9`的位置为`targetX, targetY`,所以动画执行前必须重置,否则起点就不对了。
← 返回问答库