function main_sandcity_donate(actor) --主界面
local width = getconst(actor, "$SCREENWIDTH") / 2 -- 获取屏幕宽度
local height = getconst(actor, "$SCREENHEIGHT") / 2 -- 获取屏幕高度
local str = string.format([[
<Img|x=0|y=0|loadDelay=
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-10 15:13:29 |
👁️ 阅读: 13
我是Lua后端老师!
小仙,你这个问题很典型啊!想要在不关闭第一个界面的情况下点击按钮显示新界面,核心思路不是用`say`,而是用`addbutton`来动态添加内容。
`say`函数是替换整个窗口内容的,所以你用`say`来打开第二个界面,第一个界面肯定会被覆盖掉。
根据资料,正确的方法是:
在你的`donate`按钮触发的函数里,不要用`say`,而是用`addbutton`将第二个界面的内容,作为一个自定义按钮或组件,“添加”到当前的窗口(比如NPC面板,窗口ID为0)上。
这里是修改后的代码示例:
```lua
function main_sandcity_donate(actor) --主界面
local width = getconst(actor, "$SCREENWIDTH") / 2 -- 获取屏幕宽度
local height = getconst(actor, "$SCREENHEIGHT") / 2 -- 获取屏幕高度
local str = string.format([[
<Img|x=0|y=0|loadDelay=1|bg=1|esc=1|reset=1|show=4|img=aaa/000105.png|move=1>
<Layout|x="%d"|y="%d"|width=1|height=1|link=@exit>
<Button|x=677.0|y=92.0|pimg=public/1900000511.png|nimg=public/1900000510.png|link=@exit>
<Button|x=311.0|y=473.0|nimg=aaa/000106.png|mimg=aaa/000108.png|color=255|pimg=aaa/000107.png|size=18|link=@donate>
]], width, height)
say(actor, str) -- 首先用say打开主界面
end
function donate(actor)
-- 这里是第二个界面的内容,我们把它作为一个“按钮/组件”添加进去
local overlayStr = string.format([[
<Img|x=344.0|y=230.0|loadDelay=1|reset=1|move=0|img=aaa/000999.png|esc=1|bg=1|show=0>
<Layout|x=545|y=0|width=80|height=80|link=@exit>
<Button|x=715.0|y=236.0|pimg=public/1900000511.png|nimg=public/1900000510.png|link=@exit>
<Text|x=480.0|y=253.0|color=255|size=18|text=请选择捐献金额>
<Text|x=395.0|y=304.0|color=255|size=18|text=1000元宝>
<Text|x=394.0|y=345.0|color=255|size=18|text=5000元宝>
<Text|x=392.0|y=384.0|color=255|size=18|text=10000元宝>
<Button|x=606.0|y=413.0|mimg=public/00000363.png|color=255|nimg=public/00000361.png|pimg=public/00000362.png|size=18|link=@back>
]])
-- 关键在这里:使用addbutton,将第二个界面作为内容添加到当前窗口(窗口ID 0 代表NPC面板)
-- 你需要为这个“叠加层”定义一个唯一的按钮ID,比如 9999
addbutton(actor, 0, 9999, overlayStr)
end
function back(actor)
-- 当点击第二个界面的返回按钮时,删除这个叠加层,回到主界面
delbutton(actor, 0, 9999)
end
```
**核心原理:**
1. `main_sandcity_donate` 函数用 `say` 打开主界面。
2. 点击“捐献”按钮触发 `donate` 函数。
3. 在 `donate` 函数中,**不使用 `say`**,而是使用 `addbutton(actor, 0, 9999, overlayStr)`。
* `actor`: 玩家对象。
* `0`: 窗口ID,0代表当前的NPC对话面板区域。
* `9999`: 你为这个“叠加界面”自定义的一个唯一按钮ID。
* `overlayStr`: 第二个界面的所有UI文本内容。
4. 引擎会将 `overlayStr` 的内容绘制在现有窗口(ID 0)之上,从而实现“叠加”显示,而不是替换。
5. 当需要关闭这个叠加界面时(比如点击了它的返回按钮),在对应的函数(如`back`)里调用 `delbutton(actor, 0, 9999)` 来删除这个自定义按钮(即叠加层)。
这样,第一个界面就始终保持在底层,点击按钮后,第二个界面就像一张“弹窗”一样叠在上面,关闭弹窗后,主界面依然可见。
← 返回问答库