GUI:addOnClickEvent(ui.Button_1,function()
GUI:removeFromParent(ui.Button_1)
local cardPositions = {}
local cardSizes = {}
for i = 1, 10 do
local pos = GUI:getPosition(ui['Image_'..i])
local size = GUI:getContent
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-04-20 15:15:52 |
👁️ 阅读: 10
根据浮生梦老师前端课程内容,你的代码有几个问题需要修正:
1. **动作嵌套错误**:`GUI:runAction` 嵌套太多层导致逻辑混乱
2. **缺少旋转动作**:需要添加 `GUI:ActionRotateTo` 或 `GUI:ActionRotateBy`
3. **缺少初始位置记录**:应该在移除前记录初始位置
这是修正后的代码:
```lua
GUI:addOnClickEvent(ui.Button_1, function()
GUI:removeFromParent(ui.Button_1)
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, y = pos.y}
cardSizes[i] = {width = size.width, height = size.height}
GUI:removeFromParent(ui['Image_'..i])
end
-- 创建背面卡牌并执行动画
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)
-- 先移动到第一个目标位置
GUI:runAction(beimian, GUI:ActionSequence(
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()
-- 最后旋转并回到初始位置(0.3秒内)
GUI:runAction(beimian, GUI:ActionSequence(
GUI:ActionSpawn(
GUI:ActionMoveTo(0.3, cardPositions[i].x, cardPositions[i].y),
GUI:ActionRotateBy(0.3, 360) -- 旋转360度
),
GUI:CallFunc(function()
SL:Print("卡牌"..i.."动画完成")
end)
))
end)
))
end)
))
end)
))
end
end)
```
**主要改进:**
1. **分离记录和创建**:先记录所有位置再创建新卡牌
2. **添加旋转动作**:使用 `GUI:ActionRotateBy(0.3, 360)` 实现旋转
3. **使用ActionSpawn**:同时执行移动和旋转动作
4. **回到初始位置**:最后使用记录的 `cardPositions[i]` 回到原始位置
**参数说明:**
- `GUI:ActionMoveTo(time, x, y)`:移动到指定坐标
- `GUI:ActionRotateBy(time, angle)`:在指定时间内旋转指定角度
- `GUI:ActionSpawn(...)`:同时执行多个动作
- `GUI:DelayTime(time)`:延迟指定时间
注意:代码中的坐标值 `-72, -103` 等需要根据你的实际布局调整。如果还有不明白的地方,随时问浮生梦尊师!
根据浮生梦老师前端课程内容,你的代码有几个问题需要修正:
1. **动作嵌套错误**:`GUI:runAction` 嵌套太多层导致逻辑混乱
2. **缺少旋转动作**:需要添加 `GUI:ActionRotateTo` 或 `GUI:ActionRotateBy`
3. **缺少初始位置记录**:应该在移除前记录初始位置
这是修正后的代码:
```lua
GUI:addOnClickEvent(ui.Button_1, function()
GUI:removeFromParent(ui.Button_1)
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, y = pos.y}
cardSizes[i] = {width = size.width, height = size.height}
GUI:removeFromParent(ui['Image_'..i])
end
-- 创建背面卡牌并执行动画
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)
-- 先移动到第一个目标位置
GUI:runAction(beimian, GUI:ActionSequence(
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()
-- 最后旋转并回到初始位置(0.3秒内)
GUI:runAction(beimian, GUI:ActionSequence(
GUI:ActionSpawn(
GUI:ActionMoveTo(0.3, cardPositions[i].x, cardPositions[i].y),
GUI:ActionRotateBy(0.3, 360) -- 旋转360度
),
GUI:CallFunc(function()
SL:Print("卡牌"..i.."动画完成")
end)
))
end)
))
end)
))
end)
))
end
end)
```
**主要改进:**
1. **分离记录和创建**:先记录所有位置再创建新卡牌
2. **添加旋转动作**:使用 `GUI:ActionRotateBy(0.3, 360)` 实现旋转
3. **使用ActionSpawn**:同时执行移动和旋转动作
4. **回到初始位置**:最后使用记录的 `cardPositions[i]` 回到原始位置
**参数说明:**
- `GUI:ActionMoveTo(time, x, y)`:移动到指定坐标
- `GUI:ActionRotateBy(time, angle)`:在指定时间内旋转指定角度
- `GUI:ActionSpawn(...)`:同时执行多个动作
- `GUI:DelayTime(time)`:延迟指定时间
注意:代码中的坐标值 `-72, -103` 等需要根据你的实际布局调整。如果还有不明白的地方,随时问浮生梦尊师!
← 返回问答库