local zhuanpanOBJ = {}
zhuanpanOBJ.Name = "zhuanpanOBJ"
zhuanpanOBJ.cfg = {
[1] = {
["id"] = 100004,
["reward"] = {
[1] = {
[1] = 321,
[2] = 5,
},
},
["showR
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-03-07 04:10:49 |
👁️ 阅读: 10
你的代码已经实现了记录上次抽到的数字(`self.old_idx`)并在下次抽奖时从该位置开始转圈的功能。不过,为了确保逻辑清晰,我建议在`lotteryAnim`函数开始时,将`self.old_idx`的初始化逻辑调整得更明确一些。
根据浮生梦老师前端课程内容,你的`lotteryAnim`函数已经正确使用了`self.old_idx`来记录上次的索引。以下是优化后的关键部分:
```lua
--抽奖动画
function zhuanpanOBJ:lotteryAnim(gift_idx)
-- 确保old_idx有值,默认为1
self.old_idx = self.old_idx or 1
GUI:setEnabled(self.ui.btn_lottery, false)
local maxNum = 9 --奖励道具上限
local turnsNum = 4 --轮盘空转圈数
local start_idx = self.old_idx
local randomNum = turnsNum * maxNum
-- 计算动画次数,确保从old_idx开始,最终停在gift_idx
local anim_num = randomNum - ((self.old_idx + randomNum) % maxNum - gift_idx)
local actionList = {}
for i = 1, anim_num do
start_idx = (self.old_idx + i) % maxNum
local cur_idx = start_idx == 0 and maxNum or start_idx
local delayTime = 0.05
if i <= 3 then
--变快
delayTime = 0.4 - 0.1 * i
elseif i >= anim_num - 3 then
--变慢
delayTime = 0.1 + 0.1 * (i + 3 - anim_num)
end
actionList[#actionList + 1] = GUI:DelayTime(delayTime)
actionList[#actionList + 1] = GUI:CallFunc(function()
for k = 1, maxNum do
GUI:setVisible(self.ui["select_" .. k], k == cur_idx)
end
end)
if i == anim_num then
actionList[#actionList + 1] = GUI:CallFunc(function ()
-- 动画播放完毕,解禁按钮
GUI:setEnabled(self.ui.btn_lottery, true)
-- 注:发送的奖励idx需要在服务端随机后存放于人物变量上
-- SL:SendLuaNetMsg(102,0,0,0,"请求服务端发放实际奖励道具")
end)
end
end
-- 关键:更新old_idx为本次抽中的索引,供下次使用
self.old_idx = gift_idx
GUI:runAction(self._parent, GUI:ActionSequence(actionList))
end
```
**核心逻辑说明:**
1. `self.old_idx` 在函数开始时被初始化为上次的值(默认为1)。
2. 动画计算 `anim_num` 时,基于 `self.old_idx` 和本次的 `gift_idx` 确定转动步数,确保从上次位置开始。
3. 动画循环中,`cur_idx` 根据 `self.old_idx + i` 计算当前高亮位置。
4. 动画结束后,`self.old_idx = gift_idx` 更新记录,这样下次抽奖就会从这次停下的位置开始。
你的代码已经正确实现了这个功能,无需额外修改。如果抽奖动画的起始位置不符合预期,请检查服务端下发的 `gift_idx` 参数是否正确(范围应为1-9)。
← 返回问答库