local zhuanpanOBJ = {}
zhuanpanOBJ.Name = "zhuanpanOBJ"
zhuanpanOBJ.cfg = {
[1] = {
["id"] = 100004,
["reward"] = {
[1] = {
[1] = 321,
[2] = 5,
},
},
["showR
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-03-07 03:57:41 |
👁️ 阅读: 15
好的,浮生梦老师来帮你优化一下这个脚本。我会根据你提供的代码和浮生梦老师前端课程内容,对已知的函数进行调整和优化,并指出未知函数。
主要优化点:
1. 修正已知的函数调用方式。
2. 优化网络消息注册,使其更清晰。
3. 调整动画逻辑,使其更健壮。
4. 为未知函数添加备注。
以下是优化后的脚本:
```lua
local zhuanpanOBJ = {}
zhuanpanOBJ.Name = "zhuanpanOBJ"
zhuanpanOBJ.cfg = {
[1] = {
["id"] = 100004,
["reward"] = {
[1] = {
[1] = 321,
[2] = 5,
},
},
["showReward"] = {
[1] = {
[1] = 19,
[2] = 12,
},
},
["index2"] = 1,
["probability"] = 50,
["desc"] = "福利转盘",
["anparam"] = 38,
},
-- ... 其他配置项保持不变,为节省篇幅此处省略
[9] = {
["id"] = 100004,
["reward"] = {
[1] = {
[1] = 249,
[2] = 3,
},
},
["showReward"] = {
[1] = {
[1] = 19,
[2] = 233,
},
},
["index2"] = 9,
["probability"] = 500,
["desc"] = "福利转盘",
["anparam"] = 38,
},
}
zhuanpanOBJ.tab = {
{ jg = 8, item = "直购币", count = { 12, 18 } },
{ jg = 15, item = "直购币", count = { 20, 30 } },
{ jg = 32, item = "直购币", count = 60 },
{ jg = 66, item = "直购币", count = { 70, 99 } },
{ jg = 119, item = "直购币", count = 231 },
}
function zhuanpanOBJ:main(p2, p3, p4)
local _V = function(...) return SL:GetMetaValue(...) end
local parent = GUI:Win_Create(self.Name, _V("SCREEN_WIDTH") * 0.5, _V("SCREEN_HEIGHT") * 0.5, 0, 0, false, false,
true, false)
self._parent = parent
self.old_idx = nil
--加载UI
GUI:LoadExport(parent, "A/zhuanpanUI", function()
self.ui = GUI:ui_delegate(parent)
--背景关闭
GUI:addOnClickEvent(self.ui.CloseLayout, function()
GUI:Win_Close(self._parent)
end)
--关闭按钮
GUI:addOnClickEvent(self.ui.CloseButton, function()
GUI:Win_Close(self._parent)
end)
--给服务端发消息
GUI:addOnClickEvent(self.ui.btn_lottery, function()
-- 请求服务端下发奖励idx
SL:SendLuaNetMsg(1100, 1, 1, 0, "请求获取奖励道具idx111111111")
end)
self:createItemShow()
self:pullpay()
if p2 == 1 or p2 == 2 then
self:lotteryAnim(p3)
end
end)
end
--创建奖励道具
function zhuanpanOBJ:createItemShow()
for i = 1, 9 do
local cfgData = self.cfg[i]
local item = GUI:ItemShow_Create(self.ui["item_" .. i], "item", 0, 0,
{ index = cfgData.showReward[1][1], look = true, count = cfgData.showReward[1][2] })
GUI:setAnchorPoint(item, 0.5, 0.5)
end
end
--创建购买道具
function zhuanpanOBJ:pullpay()
for i = 1, #self.tab do
-- 优化:使用正确的按钮创建函数(根据课程内容,创建按钮应使用GUI:Button_Create)
-- 注意:原代码中的`GUI:createButton`和`GUI:onClick`在知识库中未找到,此处按课程规范调整。
-- 由于原函数未知,以下为按课程规范的自定义实现示例,你需要确认原函数的具体实现。
local btn = GUI:Button_Create(self._parent, "btn_" .. i, 300, 132 - (i - 1) * 42, "res/public/1900000680.png")
GUI:Button_setTitleText(btn, self.tab[i].jg .. "元购买")
-- 设置按钮文字颜色可能需要其他函数,这里假设用`GUI:Button_setTitleColor`
-- GUI:Button_setTitleColor(btn, "#FF00FF3C") -- 此函数在知识库中未找到,为示例
GUI:addOnClickEvent(btn, function()
SL:RequestPay(1, 7, self.tab[i].jg, 10)
end)
end
-- 同上,优化按钮创建
local btn_goumai = GUI:Button_Create(self._parent, "btn_goumai", 225, -160, "res/public/1900000680.png")
GUI:Button_setTitleText(btn_goumai, "一键购买")
GUI:addOnClickEvent(btn_goumai, function()
SL:RequestPay(1, 7, 218, 10)
end)
local btn_lingqu = GUI:Button_Create(self._parent, "btn_lingqu", 255, -220, "res/public/1900000680.png")
GUI:Button_setTitleText(btn_lingqu, "领取称号")
GUI:addOnClickEvent(btn_lingqu, function()
SL:SendLuaNetMsg(1100, 1, 4, 0, "请求获取奖励道具idx")
end)
end
--抽奖动画
function zhuanpanOBJ:lotteryAnim(gift_idx)
-- 增加安全性检查
if not self._parent or GUI:Win_IsNull(self._parent) then
SL:Print("界面未创建或已关闭")
return
end
if not gift_idx or gift_idx < 1 or gift_idx > 9 then
SL:Print("奖励索引无效:", gift_idx)
return
end
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
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)
end
-- 将动画结束后的回调放在序列最后
actionList[#actionList + 1] = GUI:CallFunc(function()
-- 动画播放完毕,解禁按钮
GUI:setEnabled(self.ui.btn_lottery, true)
self.old_idx = gift_idx
-- 注:发送的奖励idx需要在服务端随机后存放于人物变量上
-- SL:SendLuaNetMsg(102,0,0,0,"请求服务端发放实际奖励道具")
SL:Print("抽奖动画结束,获得奖励索引:", gift_idx)
end)
GUI:runAction(self._parent, GUI:ActionSequence(actionList))
end
-------------------------------↓↓↓ 网络消息 ↓↓↓-------------------------------
--收到服务端消息,抽奖动画
-- 优化:将消息处理函数独立出来,并绑定到对象上,避免全局函数冲突
function zhuanpanOBJ:onNetMsg_101(msgID, p1, p2, p3, msgData)
-- 注意:原代码中`msgID`参数似乎是奖励索引,但`msgID`通常是消息号。
-- 这里假设服务端通过p1, p2, p3传递数据,你需要根据实际协议调整。
-- 例如,假设奖励索引在 p3 中:
local rewardIndex = p3
self:lotteryAnim(rewardIndex)
end
-- 注册网络消息
SL:RegisterLuaNetMsg(101, function(...)
if zhuanpanOBJ and zhuanpanOBJ.onNetMsg_101 then
zhuanpanOBJ:onNetMsg_101(...)
end
end)
-- --点击npc打开界面(示例,需要对应的事件名)
-- SL:RegisterLUAEvent("LUA_EVENT_TALKTONPC", "zhuanpanOBJ", function(npcID)
-- zhuanpanOBJ:main()
-- end)
return zhuanpanOBJ
```
**优化说明:**
1. **函数修正**:
* 将原`GUI:createButton`和`GUI:onClick`替换为课程中标准的`GUI:Button_Create`和`GUI:addOnClickEvent`。原函数在知识库中未找到,因此按规范重写。
* 注意:按钮文字颜色的设置函数`GUI:Button_setTitleColor`在知识库中未找到示例,你需要确认是否存在或使用其他方式设置。
2. **动画优化**:
* 在`lotteryAnim`函数开始处增加了安全性检查,防止界面无效或索引错误导致问题。
* 将动画结束后的回调(启用按钮、更新索引)整合到动作序列的最后一步,确保逻辑执行顺序。
3. **网络消息优化**:
* 将消息处理逻辑封装为对象方法`onNetMsg_101`,使结构更清晰。
* 在注册的回调中增加了对象存在性检查,防止界面关闭后调用错误。
* 注释中指出原代码可能存在的参数理解问题(`msgID` vs 奖励索引),你需要根据服务端实际发送的数据调整`rewardIndex`的获取方式。
4. **未知函数备注**:
* `GUI:createButton`, `GUI:onClick`: 在知识库中未找到,已按课程规范替换。
* `GUI:Button_setTitleColor`: 在知识库中未找到,需要你确认具体函数名或使用其他方法。
* `SL:RequestPay`: 此函数在知识库中未找到,但属于SL模块,可能为底层函数,**予以保留**。
**重点提醒**:
* `pullpay`函数中的按钮创建和事件绑定已按课程规范重写,你需要测试按钮的显示和点击事件是否正常。
* 网络消息`101`的处理函数`onNetMsg_101`中获取`rewardIndex`的逻辑(`local rewardIndex = p3`)是假设的,**你必须根据服务端发送的实际协议格式进行修改**,否则动画不会正确触发。
如果还有不明白的,随时问浮生梦老师!
← 返回问答库