-- 设置容器默认图片(第一张图片)
local defaultImage = nil -- 默认背景图片
local clickedImage = "res/public/1900000678_2.png" -- 点击后切换的图片
local laot_x = SL:GetMetaValue("CURRENT_OPERMODE") == 1 and -13 or 3
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-05-05 02:26:40 |
👁️ 阅读: 3
要实现这个功能,我们需要在点击时维护一个已点击物品ID的字符串,并处理重复点击的情况。根据浮生梦老师前端课程内容,我们可以这样实现:
```lua
-- 首先创建一个全局变量来存储已点击的物品ID字符串
local clickedItemsStr = ""
-- 设置容器默认图片(第一张图片)
local defaultImage = nil -- 默认背景图片
local clickedImage = "res/public/1900000678_2.png" -- 点击后切换的图片
local laot_x = SL:GetMetaValue("CURRENT_OPERMODE") == 1 and -13 or 3
local laot_y = SL:GetMetaValue("CURRENT_OPERMODE") == 1 and -12 or 3
-- 创建容器内的图片控件
local containerImage = GUI:Image_Create(container, "container_image", laot_x, laot_y, 47, 47, defaultImage)
-- 为容器添加点击事件
GUI:addOnClickEvent(container, function()
SL:print("点击了物品容器!物品Index:", itemData.Index)
-- 将物品Index转换为字符串
local itemId = tostring(itemData.Index)
-- 检查这个物品是否已经点击过
local pattern = "#" .. itemId .. "#"
local isClicked = string.find(clickedItemsStr, pattern, 1, true) ~= nil
if isClicked then
-- 如果已经点击过,从字符串中删除
SL:print("物品已选中,现在取消选中")
clickedItemsStr = string.gsub(clickedItemsStr, pattern, "#")
-- 切换回默认图片
GUI:Image_loadTexture(containerImage, defaultImage or "")
GUI:setContentSize(containerImage, 47, 47) -- 恢复原始大小
else
-- 如果没点击过,添加到字符串中
SL:print("物品未选中,现在选中")
if clickedItemsStr == "" then
clickedItemsStr = "#" .. itemId .. "#"
else
clickedItemsStr = clickedItemsStr .. itemId .. "#"
end
-- 切换到点击后的图片
GUI:setContentSize(containerImage, 55, 55) -- 宽度55,高度55
GUI:Image_loadTexture(containerImage, clickedImage)
end
-- 打印当前存储的字符串(调试用)
SL:print("当前已点击物品ID字符串:", clickedItemsStr)
-- 这里可以添加你需要的其他逻辑
end)
```
**代码说明:**
1. **存储结构**:使用`clickedItemsStr`字符串变量存储已点击的物品ID,格式为`#id1#id2#id3#`
2. **重复检查**:使用`string.find()`函数检查物品是否已经在字符串中
3. **添加/删除逻辑**:
- 如果物品未选中:添加到字符串末尾
- 如果物品已选中:从字符串中删除
4. **图片切换**:
- 选中时:切换到`clickedImage`并调整大小
- 取消选中时:切换回`defaultImage`并恢复原始大小
5. **注意事项**:
- 使用`#`作为分隔符可以避免ID边界问题
- 如果`defaultImage`为nil,`Image_loadTexture`会清空图片
- 记得在适当的时候清空`clickedItemsStr`变量(比如界面关闭时)
如果需要将存储的字符串保存到服务端,可以使用:
```lua
SL:SetMetaValue("CLICKED_ITEMS", playerID, clickedItemsStr)
```
这样就能实现点击切换选中状态的功能了!
要实现这个功能,我们需要在点击时维护一个已点击物品ID的字符串,并处理重复点击的情况。根据浮生梦老师前端课程内容,我们可以这样实现:
```lua
-- 首先创建一个全局变量来存储已点击的物品ID字符串
local clickedItemsStr = ""
-- 设置容器默认图片(第一张图片)
local defaultImage = nil -- 默认背景图片
local clickedImage = "res/public/1900000678_2.png" -- 点击后切换的图片
local laot_x = SL:GetMetaValue("CURRENT_OPERMODE") == 1 and -13 or 3
local laot_y = SL:GetMetaValue("CURRENT_OPERMODE") == 1 and -12 or 3
-- 创建容器内的图片控件
local containerImage = GUI:Image_Create(container, "container_image", laot_x, laot_y, 47, 47, defaultImage)
-- 为容器添加点击事件
GUI:addOnClickEvent(container, function()
SL:print("点击了物品容器!物品Index:", itemData.Index)
-- 将物品Index转换为字符串
local itemId = tostring(itemData.Index)
-- 检查这个物品是否已经点击过
local pattern = "#" .. itemId .. "#"
local isClicked = string.find(clickedItemsStr, pattern, 1, true) ~= nil
if isClicked then
-- 如果已经点击过,从字符串中删除
SL:print("物品已选中,现在取消选中")
clickedItemsStr = string.gsub(clickedItemsStr, pattern, "#")
-- 切换回默认图片
GUI:Image_loadTexture(containerImage, defaultImage or "")
GUI:setContentSize(containerImage, 47, 47) -- 恢复原始大小
else
-- 如果没点击过,添加到字符串中
SL:print("物品未选中,现在选中")
if clickedItemsStr == "" then
clickedItemsStr = "#" .. itemId .. "#"
else
clickedItemsStr = clickedItemsStr .. itemId .. "#"
end
-- 切换到点击后的图片
GUI:setContentSize(containerImage, 55, 55) -- 宽度55,高度55
GUI:Image_loadTexture(containerImage, clickedImage)
end
-- 打印当前存储的字符串(调试用)
SL:print("当前已点击物品ID字符串:", clickedItemsStr)
-- 这里可以添加你需要的其他逻辑
end)
```
**代码说明:**
1. **存储结构**:使用`clickedItemsStr`字符串变量存储已点击的物品ID,格式为`#id1#id2#id3#`
2. **重复检查**:使用`string.find()`函数检查物品是否已经在字符串中
3. **添加/删除逻辑**:
- 如果物品未选中:添加到字符串末尾
- 如果物品已选中:从字符串中删除
4. **图片切换**:
- 选中时:切换到`clickedImage`并调整大小
- 取消选中时:切换回`defaultImage`并恢复原始大小
5. **注意事项**:
- 使用`#`作为分隔符可以避免ID边界问题
- 如果`defaultImage`为nil,`Image_loadTexture`会清空图片
- 记得在适当的时候清空`clickedItemsStr`变量(比如界面关闭时)
如果需要将存储的字符串保存到服务端,可以使用:
```lua
SL:SetMetaValue("CLICKED_ITEMS", playerID, clickedItemsStr)
```
这样就能实现点击切换选中状态的功能了!
← 返回问答库