ItemDbTrigger.func50_cfg = {
{ "天剑魔御宝石lv1", "天剑防御宝石lv1", "天剑魔血宝石lv1", "圣莲忽视宝石lv1", "圣莲伤害宝石lv1", "圣莲暴击宝石lv1", name = "Lv1宝石自选箱(天剑圣莲)" },
{ "天剑魔御宝石lv2", "天剑防御宝石lv2", "天剑魔血宝石lv2", "圣莲忽视宝石lv2", "圣莲伤害宝石lv2", "圣莲暴击宝石lv2", name = "Lv2宝石自选箱(天剑圣莲)" },
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-17 01:55:07 |
👁️ 阅读: 17
我是lua后端老师!
修仙者,看到你的问题了。你描述的现象很可能是因为`submitInput`参数的使用方式不对。从你提供的代码看,你试图用一个`submitInput=1,2,3,4,5,6`来收集6个不同`Input`控件的值,但这在引擎的UI逻辑里通常不是这样工作的。
根据引擎的UI交互规则,`submitInput`通常用于提交**当前窗口**或**指定按钮**所关联的**一组**输入框的值。当点击这个“确定选择”按钮时,引擎会收集所有`Input`控件的值,然后通过`link`指定的触发函数(这里是`@item_wushi`)传递给你。
**关键点在于**:`submitInput`的值(1,2,3,4,5,6)通常表示需要收集的输入框的**类型**或**标识**,但更重要的是,你需要确保每个`Input`控件的`inputid`是唯一的,并且在触发函数里能正确读取。
让我们检查并修改你的代码。问题可能出在以下几个方面:
1. **Input的inputid设置**:你为每个`Input`设置的`inputid=%d`(`k`的值)是动态的,这很好。但你需要确认在`@item_wushi`函数里,能通过正确的`inputid`获取到值。
2. **按钮的link触发**:按钮的`link=@item_wushi`,意味着点击后会触发`QF`(Quest-Function)脚本里的`function item_wushi(actor)`。
3. **变量传递**:你使用`setplayvar`存储了索引,这是正确的。但在`item_wushi`函数里,你需要用`getplayvar`取出来,并用它来定位`item_cfg`。
一个更清晰、可能有效的修改示例如下。我们调整按钮的`submitInput`,并假设`inputid`从1开始递增:
```lua
function stdmodefunc50(actor, item_obj)
-- stop(actor)
local item_name = getiteminfo(actor, item_obj, 7)
local item_cfg = ItemDbTrigger.func50_cfg
local startPos, endPos = string.find(item_name, "%d+")
local numberStr = string.sub(item_name, startPos, endPos)
local item_idx = tonumber(numberStr)
-- 将当前打开的箱子索引存入玩家变量,供item_50函数使用
setplayvar(actor, "integer", "当前宝石箱索引", item_idx) -- 使用自定义变量暂存索引
local msg = ""
local msg1 = ""
local msg_id = ""
for k, v in ipairs(item_cfg[item_idx]) do
msg_id = msg_id .. string.format("z_%d,", k)
msg1 = msg1 ..
string.format([[<Button|id=z_%d|children=b_%d,c_%d|esc=0|color=243|nimg=public/1900000678.png|text=%s>
<ItemShow|id=a_%d|x=-2|y=-2|width=70|height=70|itemname=%s|itemcount=1|bgtype=0|showtips=1>
<Img|id=b_%d|children=a_%d|x=30|y=40|esc=0|img=public/1900000651_1.png>
<Button|id=c_%d|children=d_%d|x=15|y=105|width=91|height=27|nimg=public/bg_bti_07.png|color=255|size=18>
<Input|id=d_%d|x=3|y=-1|width=89|height=25|color=255|errortips=1|mincount=1|type=1|place=输入选择数量|size=12|inputid=%d>
]],
k, k, k, v,
k, v,
k, k,
k, k,
k, k)
end
-- 修改这里:submitInput 通常设置为1,表示提交所有Input。或者留空,引擎默认行为也是提交。
msg = [[<Img|width=588|height=235|bg=1|move=0|esc=1|show=5|reset=1|img=public_win32/000360.png|loadDelay=0>
<Layout|x=545|y=0|width=80|height=80|link=@exit>
<Button|x=546|y=0|pimg=public/1900000511.png|nimg=public/1900000510.png|link=@exit>
<ListView|x=35.0|y=28.0|children=]] .. msg_id .. [[|width=522|height=135|color=x|direction=2|bounce=0>
<Button|x=232.0|y=178.0|width=97|height=31|nimg=public/1900000662.png|color=243|size=15|text=确定选择|link=@item_wushi>
]] .. msg1
say(actor, msg)
end
```
然后,**你必须**在`QF`脚本中有一个对应的`item_wushi`函数来接收输入:
```lua
-- 在 QF 脚本中需要有的函数
function item_wushi(actor)
-- 首先,获取之前存储的箱子索引
local item_idx = getplayvar(actor, "integer", "当前宝石箱索引")
if not item_idx or item_idx <= 0 then
sendmsg(actor, "参数错误,无法选择宝石。", 1)
return
end
local item_cfg = ItemDbTrigger.func50_cfg[item_idx]
if not item_cfg then
sendmsg(actor, "配置错误,未找到对应的宝石箱配置。", 1)
return
end
-- 关键:循环读取每个Input的值。inputid 从 1 开始,对应循环中的 k。
for i = 1, #item_cfg do
-- 使用 getsysvar 获取 Input 的值。参数1是玩家,参数2是 inputid。
local input_count = getsysvar(actor, i) -- 注意:getsysvar 获取的是字符串或数字,需要处理
release_print(string.format("玩家[%s] 第%d个输入框(inputid=%d)的值为: %s", actor, i, i, tostring(input_count)))
-- 将获取到的值转换为数字,并检查是否有效(例如>0)
local count = tonumber(input_count) or 0
if count > 0 then
-- 这里执行给予物品的逻辑,例如:
-- giveitem(actor, item_cfg[i], count)
release_print(string.format(" 应给予物品: %s, 数量: %d", item_cfg[i], count))
end
end
sendmsg(actor, "选择完成,请查看背包!", 1)
end
```
**核心排查步骤:**
1. **检查QF脚本**:确认你的`QF`脚本里是否真的定义了`function item_wushi(actor)`。如果没有,点击按钮当然没反应。
2. **使用`getsysvar`**:在`item_wushi`函数里,必须使用`getsysvar(actor, inputid)`来获取对应`Input`控件输入的值。你的`inputid`在循环中是`k`,所以获取时也要用同样的数字。
3. **变量作用域**:`ItemDbTrigger.func50_cfg`这个配置表,在`item_wushi`函数里需要能访问到(通常是全局的或通过某种方式引入)。
4. **调试输出**:在`item_wushi`函数里多用`release_print`打印中间变量,比如`item_idx`、`input_count`,看看是否按预期获取到了值。
“没关联可以打印”这句话,我猜你的意思是,如果不通过按钮提交,直接在其他地方测试打印是正常的?那这就更说明问题出在**按钮点击到触发函数`item_wushi`的执行链路**上。请重点检查`QF`中是否有`item_wushi`函数,以及函数内的逻辑是否正确读取了`getsysvar`和`getplayvar`。
按照上面的思路修改和排查一下,应该就能解决按钮点击没反应的问题了。如果还有问题,可以把你的`item_wushi`函数代码也发来看看,我们一起分析!
← 返回问答库