local cardPositions = {}
local cardSizes = {}
-- 先记录所有初始位置
for i = 1, 10 do
local pos = GUI:getPosition(ui['Image_'..i])
local size = GUI:getContentSize(ui['Image_'..i])
cardPositions[i] = {x = pos.x
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-04-20 15:18:39 |
👁️ 阅读: 24
你的代码想要实现卡牌依次执行动画,但目前的嵌套方式会导致所有卡牌同时开始动画。要实现“一张移动完后再移动下一张”的效果,需要为每张卡牌的动作序列添加一个总的延迟,让它们错开开始时间。
这里的关键是使用 `GUI:DelayTime` 在每张卡牌的初始动作前增加一个累计的等待时间。
修改后的核心逻辑如下:
```lua
-- 创建背面卡牌并执行动画
for i = 1, 10 do
local beimian = GUI:Button_Create(layout, "bei"..i, cardPositions[i].x, cardPositions[i].y, "res/public_win32/1900000610.png")
GUI:setContentSize(beimian, cardSizes[i].width, cardSizes[i].height)
GUI:setVisible(beimian, true)
-- 计算这张卡牌开始前的总等待时间
-- 假设每张卡牌完整的动画周期是 1 + 0.5 + 0.5+0.3+0.5 + 0.5+0.3+0.5 + 0.3 = 4.1 秒
-- 为了让下一张在前一张结束后才开始,我们让每张卡牌延迟 (i-1) * 4.1 秒开始
local startDelay = (i - 1) * 4.1
-- 构建完整的动作序列,并在最前面加上延迟
GUI:runAction(beimian, GUI:ActionSequence(
GUI:DelayTime(startDelay), -- 关键:等待前面的卡牌完成
GUI:ActionMoveTo(1, -72, -103),
GUI:DelayTime(0.5),
GUI:CallFunc(function()
-- 上下移动
local targetY = -103
if i % 2 == 1 then
targetY = -103 + 172
else
targetY = -103 - 172
end
GUI:runAction(beimian, GUI:ActionSequence(
GUI:ActionMoveTo(0.5, -72, targetY),
GUI:DelayTime(0.3),
GUI:ActionMoveTo(0.5, -72, -103),
GUI:DelayTime(0.5),
GUI:CallFunc(function()
-- 左右移动
local targetX = -72
if i % 3 == 1 then
targetX = -72 - 142
else
targetX = -72 + 142
end
GUI:runAction(beimian, GUI:ActionSequence(
GUI:ActionMoveTo(0.5, targetX, -103),
GUI:DelayTime(0.3),
GUI:ActionMoveTo(0.5, -72, -103),
GUI:DelayTime(0.5),
GUI:CallFunc(function()
-- 最后旋转并回到初始位置
GUI:runAction(beimian, GUI:ActionSequence(
GUI:ActionSpawn(
GUI:ActionMoveTo(0.3, cardPositions[i].x, cardPositions[i].y),
GUI:ActionRotateBy(0.3, 360)
)
))
end)
))
end)
))
end)
))
end
```
**修改说明:**
1. **`startDelay`**:这个变量计算了当前卡牌需要等待多久才开始自己的动画序列。`(i-1) * 4.1` 秒意味着第1张卡立即开始,第2张卡等待4.1秒(等第1张做完),第3张等待8.2秒,以此类推。
2. **`GUI:DelayTime(startDelay)`**:将这个延迟动作作为每张卡牌动作序列的第一个动作,确保了严格的先后顺序。
**注意:**
* `4.1` 这个总时长是我根据你代码里的各个动作时间累加估算的(1 + 0.5 + 1.3 + 1.3 + 0.3)。你需要根据实际想要的动画节奏精确计算和调整这个值。
* 这种嵌套的 `GUI:CallFunc` 和 `GUI:runAction` 虽然能实现功能,但会让代码层次很深,不易阅读和维护。如果动画逻辑非常复杂,建议考虑将每个阶段(如“上下移动”、“左右移动”)封装成独立的函数,或者使用状态机来管理。
这样修改后,10张卡牌就会像多米诺骨牌一样,一张接一张地执行完所有动画,而不是一窝蜂地同时开始了。
你的代码想要实现卡牌依次执行动画,但目前的嵌套方式会导致所有卡牌同时开始动画。要实现“一张移动完后再移动下一张”的效果,需要为每张卡牌的动作序列添加一个总的延迟,让它们错开开始时间。
这里的关键是使用 `GUI:DelayTime` 在每张卡牌的初始动作前增加一个累计的等待时间。
修改后的核心逻辑如下:
```lua
-- 创建背面卡牌并执行动画
for i = 1, 10 do
local beimian = GUI:Button_Create(layout, "bei"..i, cardPositions[i].x, cardPositions[i].y, "res/public_win32/1900000610.png")
GUI:setContentSize(beimian, cardSizes[i].width, cardSizes[i].height)
GUI:setVisible(beimian, true)
-- 计算这张卡牌开始前的总等待时间
-- 假设每张卡牌完整的动画周期是 1 + 0.5 + 0.5+0.3+0.5 + 0.5+0.3+0.5 + 0.3 = 4.1 秒
-- 为了让下一张在前一张结束后才开始,我们让每张卡牌延迟 (i-1) * 4.1 秒开始
local startDelay = (i - 1) * 4.1
-- 构建完整的动作序列,并在最前面加上延迟
GUI:runAction(beimian, GUI:ActionSequence(
GUI:DelayTime(startDelay), -- 关键:等待前面的卡牌完成
GUI:ActionMoveTo(1, -72, -103),
GUI:DelayTime(0.5),
GUI:CallFunc(function()
-- 上下移动
local targetY = -103
if i % 2 == 1 then
targetY = -103 + 172
else
targetY = -103 - 172
end
GUI:runAction(beimian, GUI:ActionSequence(
GUI:ActionMoveTo(0.5, -72, targetY),
GUI:DelayTime(0.3),
GUI:ActionMoveTo(0.5, -72, -103),
GUI:DelayTime(0.5),
GUI:CallFunc(function()
-- 左右移动
local targetX = -72
if i % 3 == 1 then
targetX = -72 - 142
else
targetX = -72 + 142
end
GUI:runAction(beimian, GUI:ActionSequence(
GUI:ActionMoveTo(0.5, targetX, -103),
GUI:DelayTime(0.3),
GUI:ActionMoveTo(0.5, -72, -103),
GUI:DelayTime(0.5),
GUI:CallFunc(function()
-- 最后旋转并回到初始位置
GUI:runAction(beimian, GUI:ActionSequence(
GUI:ActionSpawn(
GUI:ActionMoveTo(0.3, cardPositions[i].x, cardPositions[i].y),
GUI:ActionRotateBy(0.3, 360)
)
))
end)
))
end)
))
end)
))
end
```
**修改说明:**
1. **`startDelay`**:这个变量计算了当前卡牌需要等待多久才开始自己的动画序列。`(i-1) * 4.1` 秒意味着第1张卡立即开始,第2张卡等待4.1秒(等第1张做完),第3张等待8.2秒,以此类推。
2. **`GUI:DelayTime(startDelay)`**:将这个延迟动作作为每张卡牌动作序列的第一个动作,确保了严格的先后顺序。
**注意:**
* `4.1` 这个总时长是我根据你代码里的各个动作时间累加估算的(1 + 0.5 + 1.3 + 1.3 + 0.3)。你需要根据实际想要的动画节奏精确计算和调整这个值。
* 这种嵌套的 `GUI:CallFunc` 和 `GUI:runAction` 虽然能实现功能,但会让代码层次很深,不易阅读和维护。如果动画逻辑非常复杂,建议考虑将每个阶段(如“上下移动”、“左右移动”)封装成独立的函数,或者使用状态机来管理。
这样修改后,10张卡牌就会像多米诺骨牌一样,一张接一张地执行完所有动画,而不是一窝蜂地同时开始了。
← 返回问答库