AutoUsePop = {}
AutoUsePop._remainTimeStr = "(%s)" -- 剩余时间展示格式
function AutoUsePop.main(data)
local parent = GUI:Attach_Parent()
local id = data and data.id or 0
local node = GUI:Node_Create(parent, "Node_" .. id, 0, 0)
GUI:LoadExpor
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-06-16 18:44:08 |
👁️ 阅读: 5
根据浮生梦老师前端课程内容,要让道具图标框可以移动,需要添加触摸事件处理。以下是修改后的代码:
```lua
AutoUsePop = {}
AutoUsePop._remainTimeStr = "(%s)" -- 剩余时间展示格式
function AutoUsePop.main(data)
local parent = GUI:Attach_Parent()
local id = data and data.id or 0
local node = GUI:Node_Create(parent, "Node_" .. id, 0, 0)
GUI:LoadExport(node, "auto_use_pop")
GUI:setTag(node, id)
AutoUsePop._data = data
AutoUsePop._Node = node
AutoUsePop._ui = GUI:ui_delegate(node)
-- 显示适配
local posY = 140
local baseOffX = 350
local screenH = SL:GetMetaValue("SCREEN_HEIGHT")
local PPopUI = AutoUsePop._ui["PPopUI"]
if SL:GetMetaValue("WINPLAYMODE") then
GUI:setMouseEnabled(PPopUI, true)
baseOffX = 220
posY = screenH - 330 - GUI:getContentSize(PPopUI).height
end
local notch, rect = SL:GetMetaValue("NOTCH_PHONE_INFO")
if notch then
baseOffX = baseOffX + rect.x
end
local screenW = SL:GetMetaValue("SCREEN_WIDTH")
GUI:setPosition(AutoUsePop._Node, screenW - baseOffX, posY)
GUI:setVisible(PPopUI, true)
AutoUsePop.InitUI()
end
function AutoUsePop.InitUI()
if not AutoUsePop._data then
return
end
local id = AutoUsePop._data.id
local item = AutoUsePop._data.item
local isHero = AutoUsePop._data.isHero
local isBook = AutoUsePop._data.skillBook
-- 英雄
if isHero then
GUI:Text_setString(AutoUsePop._ui.TextTitle, "快捷使用(英雄)")
end
GUI:Text_setString(AutoUsePop._ui.TextName, item.Name)
if SL:GetMetaValue("GAME_DATA", "AutoUseScrollWidth") then
local scrollWidth = tonumber(SL:GetMetaValue("GAME_DATA", "AutoUseScrollWidth")) or 140
GUI:removeAllChildren(AutoUsePop._ui.TextName)
GUI:Text_setString(AutoUsePop._ui.TextName, "")
local label = GUI:ScrollText_Create(AutoUsePop._ui.TextName, "scrollText", 0, 0, scrollWidth, SL:GetMetaValue("GAME_DATA", "DEFAULT_FONT_SIZE"), "#FFFFFF", item.Name)
GUI:setAnchorPoint(label, 0.5, 0.5)
end
-- 技能书
if isBook then
GUI:Button_setTitleText(AutoUsePop._ui.BtnUse, "使用")
end
-- 道具图标
GUI:removeAllChildren(AutoUsePop._ui.ItemNode)
local itemNode = GUI:ItemShow_Create(AutoUsePop._ui.ItemNode, "ItemShow", 0, 0, {
look = true,
index = item.Index,
itemData = item
})
GUI:setAnchorPoint(itemNode, 0.5, 0.5)
-- 添加触摸事件让道具图标可以移动
AutoUsePop:addTouchEvent(itemNode)
end
-- 添加触摸事件处理函数
function AutoUsePop:addTouchEvent(itemNode)
if GUI:Win_IsNull(itemNode) then
return
end
local isMoving = false
local startPos = {x = 0, y = 0}
local nodeStartPos = {x = 0, y = 0}
-- 触摸开始事件
GUI:addTouchBeganEvent(itemNode, function(touch, event)
local pos = GUI:getTouchLocation(touch)
local nodePos = GUI:getPosition(itemNode)
startPos.x = pos.x
startPos.y = pos.y
nodeStartPos.x = nodePos.x
nodeStartPos.y = nodePos.y
isMoving = true
return true
end)
-- 触摸移动事件
GUI:addTouchMovedEvent(itemNode, function(touch, event)
if not isMoving then
return
end
local pos = GUI:getTouchLocation(touch)
local deltaX = pos.x - startPos.x
local deltaY = pos.y - startPos.y
local newX = nodeStartPos.x + deltaX
local newY = nodeStartPos.y + deltaY
GUI:setPosition(itemNode, newX, newY)
end)
-- 触摸结束事件
GUI:addTouchEndedEvent(itemNode, function(touch, event)
isMoving = false
end)
-- 触摸取消事件
GUI:addTouchCancelledEvent(itemNode, function(touch, event)
isMoving = false
end)
end
```
主要修改内容:
1. **将局部变量名从`item`改为`itemNode`**,避免与传入的`item`参数冲突
2. **添加了`AutoUsePop:addTouchEvent(itemNode)`函数**,专门处理触摸事件
3. **触摸事件包括**:
- `GUI:addTouchBeganEvent`:触摸开始,记录初始位置
- `GUI:addTouchMovedEvent`:触摸移动,实时更新位置
- `GUI:addTouchEndedEvent`:触摸结束
- `GUI:addTouchCancelledEvent`:触摸取消
4. **移动逻辑**:
- 计算触摸点与初始位置的差值
- 根据差值更新节点位置
- 使用`GUI:setPosition()`设置新坐标
这样修改后,用户就可以通过触摸/拖动来移动道具图标框了。记得在创建道具图标后调用这个函数,我已经在`InitUI()`函数中调用了。
根据浮生梦老师前端课程内容,要让道具图标框可以移动,需要添加触摸事件处理。以下是修改后的代码:
```lua
AutoUsePop = {}
AutoUsePop._remainTimeStr = "(%s)" -- 剩余时间展示格式
function AutoUsePop.main(data)
local parent = GUI:Attach_Parent()
local id = data and data.id or 0
local node = GUI:Node_Create(parent, "Node_" .. id, 0, 0)
GUI:LoadExport(node, "auto_use_pop")
GUI:setTag(node, id)
AutoUsePop._data = data
AutoUsePop._Node = node
AutoUsePop._ui = GUI:ui_delegate(node)
-- 显示适配
local posY = 140
local baseOffX = 350
local screenH = SL:GetMetaValue("SCREEN_HEIGHT")
local PPopUI = AutoUsePop._ui["PPopUI"]
if SL:GetMetaValue("WINPLAYMODE") then
GUI:setMouseEnabled(PPopUI, true)
baseOffX = 220
posY = screenH - 330 - GUI:getContentSize(PPopUI).height
end
local notch, rect = SL:GetMetaValue("NOTCH_PHONE_INFO")
if notch then
baseOffX = baseOffX + rect.x
end
local screenW = SL:GetMetaValue("SCREEN_WIDTH")
GUI:setPosition(AutoUsePop._Node, screenW - baseOffX, posY)
GUI:setVisible(PPopUI, true)
AutoUsePop.InitUI()
end
function AutoUsePop.InitUI()
if not AutoUsePop._data then
return
end
local id = AutoUsePop._data.id
local item = AutoUsePop._data.item
local isHero = AutoUsePop._data.isHero
local isBook = AutoUsePop._data.skillBook
-- 英雄
if isHero then
GUI:Text_setString(AutoUsePop._ui.TextTitle, "快捷使用(英雄)")
end
GUI:Text_setString(AutoUsePop._ui.TextName, item.Name)
if SL:GetMetaValue("GAME_DATA", "AutoUseScrollWidth") then
local scrollWidth = tonumber(SL:GetMetaValue("GAME_DATA", "AutoUseScrollWidth")) or 140
GUI:removeAllChildren(AutoUsePop._ui.TextName)
GUI:Text_setString(AutoUsePop._ui.TextName, "")
local label = GUI:ScrollText_Create(AutoUsePop._ui.TextName, "scrollText", 0, 0, scrollWidth, SL:GetMetaValue("GAME_DATA", "DEFAULT_FONT_SIZE"), "#FFFFFF", item.Name)
GUI:setAnchorPoint(label, 0.5, 0.5)
end
-- 技能书
if isBook then
GUI:Button_setTitleText(AutoUsePop._ui.BtnUse, "使用")
end
-- 道具图标
GUI:removeAllChildren(AutoUsePop._ui.ItemNode)
local itemNode = GUI:ItemShow_Create(AutoUsePop._ui.ItemNode, "ItemShow", 0, 0, {
look = true,
index = item.Index,
itemData = item
})
GUI:setAnchorPoint(itemNode, 0.5, 0.5)
-- 添加触摸事件让道具图标可以移动
AutoUsePop:addTouchEvent(itemNode)
end
-- 添加触摸事件处理函数
function AutoUsePop:addTouchEvent(itemNode)
if GUI:Win_IsNull(itemNode) then
return
end
local isMoving = false
local startPos = {x = 0, y = 0}
local nodeStartPos = {x = 0, y = 0}
-- 触摸开始事件
GUI:addTouchBeganEvent(itemNode, function(touch, event)
local pos = GUI:getTouchLocation(touch)
local nodePos = GUI:getPosition(itemNode)
startPos.x = pos.x
startPos.y = pos.y
nodeStartPos.x = nodePos.x
nodeStartPos.y = nodePos.y
isMoving = true
return true
end)
-- 触摸移动事件
GUI:addTouchMovedEvent(itemNode, function(touch, event)
if not isMoving then
return
end
local pos = GUI:getTouchLocation(touch)
local deltaX = pos.x - startPos.x
local deltaY = pos.y - startPos.y
local newX = nodeStartPos.x + deltaX
local newY = nodeStartPos.y + deltaY
GUI:setPosition(itemNode, newX, newY)
end)
-- 触摸结束事件
GUI:addTouchEndedEvent(itemNode, function(touch, event)
isMoving = false
end)
-- 触摸取消事件
GUI:addTouchCancelledEvent(itemNode, function(touch, event)
isMoving = false
end)
end
```
主要修改内容:
1. **将局部变量名从`item`改为`itemNode`**,避免与传入的`item`参数冲突
2. **添加了`AutoUsePop:addTouchEvent(itemNode)`函数**,专门处理触摸事件
3. **触摸事件包括**:
- `GUI:addTouchBeganEvent`:触摸开始,记录初始位置
- `GUI:addTouchMovedEvent`:触摸移动,实时更新位置
- `GUI:addTouchEndedEvent`:触摸结束
- `GUI:addTouchCancelledEvent`:触摸取消
4. **移动逻辑**:
- 计算触摸点与初始位置的差值
- 根据差值更新节点位置
- 使用`GUI:setPosition()`设置新坐标
这样修改后,用户就可以通过触摸/拖动来移动道具图标框了。记得在创建道具图标后调用这个函数,我已经在`InitUI()`函数中调用了。
← 返回问答库