下载 App

天哥教你maker手机端常见点不开按钮时怎么办

精华04/21170 浏览开发交流
作者:琋琯的攻略机
开发引擎:TapTap Maker (UrhoX)
一、问题背景
手机端点击按钮打开弹窗时,弹窗刚出现就立刻消失了,视觉上像是没反应一样。而在电脑端,这个问题却不存在。刚好今天在论坛看到天哥回复了相关内容,于是炼化天哥的仙道潜力发帖。
TapTap
二、问题分析
根因分析
开发者用 onClick 做了两件互相冲突的事:
按下(TouchBegin)→ 触发打开弹窗逻辑
抬起(TouchEnd)→ 触发关闭弹窗逻辑(通常是点击弹窗外部蒙层关掉的)
在手机上,一次完整的触摸会经历 按下 → 抬起 的过程,两个事件都在一帧内或很短时间内触发,导致弹窗开了又关,用户感知不到。
而 PC 端鼠标点击的语义略有不同(MouseButtonDown → MouseButtonUp),UI 事件过滤逻辑可能有差异,所以电脑端正常。
常见误解
有些开发者可能听说过"添加保护层"的说法,但这是一个模糊的民间描述,实际上是在绕路解决一个本不应该存在的问题。
保护层指标不治本:保护层是让点击空白处不退出当前页面,但是手机端双击的问题还是在的。
三、技术方案
正确的解决方案
改事件触发时机:把打开弹窗的逻辑改为监听 onClick(点击完成,即 TouchEnd 后确认是点击而非滑动),而不是 onPress(按下时)。
UrhoX 的 urhox-libs/UI 库里的 onClick 本身就是封装过的"安全点击"事件(完整的按下+抬起+未滑出范围才触发),正确用 onClick 就不会有这个问题。
错误的做法
使用 onPress 事件打开弹窗
使用原始触摸事件(TouchBegin/TouchEnd)处理弹窗逻辑
添加所谓的"保护层"来绕路解决问题
四、与嗒啦啦沟通
如何让嗒啦啦帮你修复这个问题
嗒啦啦,我遇到了一个弹窗问题:在手机端点击按钮打开弹窗时,弹窗刚出现就立刻消失了。 问题原因:我可能把打开弹窗的逻辑绑在了 onPress 事件上,而关闭弹窗的逻辑在 onClick 事件上,导致冲突。 请帮我检查并修复这个问题,把打开弹窗的逻辑改为使用 onClick 事件。 具体要做: 1. 找到打开弹窗的代码位置 2. 将 onPress 事件改为 onClick 事件 3. 确保关闭弹窗的逻辑正常工作 4. 测试在手机端和电脑端都能正常打开和关闭弹窗
如何预防这个问题
嗒啦啦,我要实现一个弹窗功能,需要注意以下几点: 1. 打开弹窗的逻辑要用 onClick 事件,不要用 onPress 事件 2. 关闭弹窗的逻辑可以用 onClick 事件(点击蒙层关闭) 3. 确保在手机端和电脑端都能正常工作 请帮我实现这个弹窗功能,包括: 1. 弹窗的 UI 布局 2. 打开和关闭的逻辑 3. 点击蒙层关闭的功能 4. 适当的动画效果
五、代码实现
正确的弹窗实现示例
-- 打开弹窗的按钮 local openButton = UI.Button { text = "打开弹窗", onClick = function() -- 正确:使用 onClick 打开弹窗 MyModal.Open() end } -- 弹窗实现 local MyModal = {} function MyModal.Open() -- 创建遮罩层 local overlay = UI.Panel { position = "absolute", left = 0, top = 0, width = "100%", height = "100%", backgroundColor = { 0, 0, 0, 160 }, justifyContent = "center", alignItems = "center", cursor = "pointer", onClick = function() -- 正确:使用 onClick 关闭弹窗 MyModal.Close() end, children = { -- 弹窗内容 UI.Panel { width = 300, height = 200, backgroundColor = { 50, 30, 80, 255 }, borderRadius = 10, padding = 20, pointerEvents = "auto", -- 阻止事件冒泡到遮罩 children = { UI.Label { text = "弹窗内容", fontSize = 16, fontColor = { 255, 255, 255, 255 } }, UI.Button { text = "关闭", marginTop = 20, onClick = function() MyModal.Close() end } } } } } -- 添加到 UI 树 local root = UI.GetRoot() if root then root:AddChild(overlay) end UI.PushOverlay(overlay) MyModal.overlay = overlay end function MyModal.Close() if MyModal.overlay then UI.PopOverlay(MyModal.overlay) local root = UI.GetRoot() if root then root:RemoveChild(MyModal.overlay) end MyModal.overlay = nil end end return MyModal
错误的实现示例(避免这样做)
-- 错误示例:使用 onPress 打开弹窗 local openButton = UI.Button { text = "打开弹窗", onPress = function() -- 错误:使用 onPress 打开弹窗 MyModal.Open() end } -- 关闭弹窗还是用 onClick local overlay = UI.Panel { -- ... onClick = function() -- 关闭弹窗用 onClick MyModal.Close() end, -- ... }
六、项目案例分析
在《节拍前夜》项目中,我们可以看到正确的弹窗实现:
SkillDetailModal.lua(技艺大卡悬浮浮窗):
第305-307行:使用 onClick 事件关闭弹窗
打开弹窗的逻辑由其他组件的 onClick 事件触发
SkillCardWidget.lua(技艺卡牌组件):
第609行:使用 onClick 事件处理卡片点击
第770行:使用 onClick 事件处理横向卡点击
七、踩坑记录
常见问题及解决方案
弹窗闪一下就消失
原因:使用了 onPress 打开弹窗,而 onClick 关闭弹窗
解决方案:将打开弹窗的逻辑改为使用 onClick 事件
点击蒙层不关闭弹窗
原因:弹窗内容没有设置 pointerEvents = "auto",导致事件冒泡被阻止
解决方案:在弹窗内容面板上设置 pointerEvents = "auto"
弹窗在电脑端正常,手机端异常
原因:触摸事件和鼠标事件的处理逻辑不同
解决方案:统一使用 onClick 事件处理点击操作
八、最佳实践
使用 onClick 处理点击操作:onClick 是封装过的"安全点击"事件,会在完整的点击过程(按下+抬起+未滑出范围)后触发
避免使用 onPress:onPress 会在按下时立即触发,容易与其他事件冲突
合理处理事件冒泡:弹窗内容需要设置 pointerEvents = "auto",避免事件冒泡被阻止
测试多平台:在手机端和电脑端都测试弹窗的打开和关闭功能
九、结语
弹窗点击事件的处理是游戏开发中的一个常见问题,特别是在跨平台开发时。通过正确使用 onClick 事件,我们可以避免弹窗闪一下就消失的问题,为玩家提供更流畅的游戏体验。
记住:问题根本不是"缺保护层",而是开发者把弹窗打开绑在了错误的事件上。正确使用 onClick 事件,就能从根本上解决这个问题。
我会把该攻略整理成skill,不知道能不能过审,如果过审了大家可以直接下载。
技术栈:UrhoX、Lua、UI 事件系统
适用场景:游戏弹窗、按钮点击、跨平台开发
开发难度:简单
猜你想搜
taptap制造 urhoxui开发
别再烧积分了!从每次 2000 到每次 50 的血泪经验截图
别再烧积分了!从每次 2000 到每次 50 的血泪经验
适用场景:所有在用 TapTap Code 开发游戏的小白 难度:★☆☆☆☆ 背景最近群里总有人"炫耀"一次操作花了几千积分,说实话这不是值得高兴的事——这是在告诉所有人你的开发方式有根本性问题。我也走过这条弯路,所以来说说怎么改。 积分消耗的本质是什么积分 = AI 处理的 token 数量 = 你发给 AI 的内容 + AI 回给你的内容所以烧积分的本质只有两种: 你让 AI 做了大量无效/重
精华
81 赞
23 回复
如何提升你游戏中的UI美术水平截图
如何提升你游戏中的UI美术水平
一、请为你的游戏挑选一款合适的字体 很多开发者没有注意到其实UI界面中最重要的元素是字体,一款合适的字体能给整个游戏的界面感官带来蜕变。 请看案例 那么如何挑选适合自己的字体呢? 我总结出了一些小经验可供参考: 黑体:通用 宋体:古风、武侠、修仙 楷体:古风、武侠、修仙 圆体:卡通、动漫、Q版 科技:科幻、未来、电子 顺手分享一个免费可商用字体网站: 当然 如果你不知道自己的游戏适合什么风格
精华
126 赞
44 回复
自律打卡帖截图
自律打卡帖
开发游戏时常常有脑雾,遇到序列帧、骨架、3d、服务端等让游戏更高级的技巧抗拒阅读,学习不下去,为了跟上嗒啦啦进步的步伐,从今天开始戒色!百日起步,一赞一天,上不封顶。破戒一次给tap充100点券😡😡
3 赞
40 回复
永恒虚空持续开发日记1——关于游戏中的新名词:场频截图
永恒虚空持续开发日记1——关于游戏中的新名词:场频
写在前边:首先感谢TapTap制造版主大大@汪崽 对于作品潜力的肯定,给与了我积分计划二的权限[表情_不好意思]。这边也在加紧开发改进各种功能中,期望尽快给大家带来成熟的版本。[表情_猫咪举手] 大家好,我是永恒虚空的制作人黑猫不详,大家叫我黑猫就好。从今天开始我将以后置开发日记的形式给大家分享我在TapTap制造中制作的游戏永恒虚空的开发过程,新人希望大家多多关照! 今天先给大家介绍我作品中最重
投票
3 赞
01:29
官方阅,申请积分计划2,希望官方继续支持我完成这款游戏,截图
官方阅,申请积分计划2,希望官方继续支持我完成这款游戏,
视频内容只是一部分, 本游戏耗时3个月,目前完成进度百分之80, 是生存游戏,进入修仙界,走剧情找到宗门加入, 这时游戏才是真正开始, 提升实力境界后就可以变强,获取功法法术法宝, @视频内是游戏里挑战妖族入侵一种主流玩法,游戏就是围绕着这个来进行, 还有很多地方可以战斗,获得资源修炼变强,比如去藏书阁学习功法, 去法宝楼抽法宝,每一个宗门数十个法宝抽取 去修仙界探索,获得各自的资源,可能遇见妖兽
1 赞
3 回复
AI制作,4K音游《StarEcho》现已开放预约!截图
AI制作,4K音游《StarEcho》现已开放预约!
#新游预告 #新游预约 #发现好游戏 #单机游戏 #音游 具体公测时间未定,敬请期待!
游戏自荐《少女终焉契约》截图
游戏自荐《少女终焉契约》
之前玩放置类型的rpg游戏的时候我就在想,现在游戏的操作有的太过于繁琐了,有没有一款休闲一点的,想上线就上线,离线的时候角色能自动行动的游戏呢?感谢TapTap制造,我按照我的想法开发出了现在这款游戏。 一、故事背景和UI 游戏的故事背景是传统的异世界穿越故事,玩家被女神召唤到异世界,随后组建工会,招募美少女,打怪升级探索世界。所以我选择了更加二次元萌系画风的UI风格,主页为各个主要的功能,点开来
8 赞
3 回复
浅记《阿方的旅程》开发历程截图
浅记《阿方的旅程》开发历程
预计阅读时长10分钟,欢迎您先品鉴游戏,再回来看这篇“流水账” 这是我第一次实际接触“用自然语言制作游戏”,也是我第一次接触游戏开发工作,所以一切都是从零开始,跌跌撞撞,懵懵懂懂。[表情_豹哭] 我是通过获得的本次开发资格,6月22日晚,在微信公众号收到了测试资格的消息,最开始公布主题“跳跃”的时候,脑子里最先想到的就是几款非常经典的游戏「马里奥」「Flappy Bird」「Doodle Jump
10 赞
1 回复
2D 等轴测视角:完整理论截图
2D 等轴测视角:完整理论
2D 等轴测视角:完整理论 一、视角的本质 什么是等轴测 人站在高处斜着往下看地面,地面上的方格子不再是正方形,而变成了菱形。这就是等轴测的视觉本质。 俯视(正上方看下去): 等轴测(斜上方看下去): ┌──┬──┬──┐ ◇ ├──┼──┼──┤ ◇ ◇ ├──┼──┼──┤ ◇ ◇ ◇ └──┴──┴──┘ ◇ ◇ ◇ 正方形网格经过旋转 + 压缩,变成了菱形网格。 为什么是 2:1
6 赞
《灵植仙途》开发心得—代码小白,用TapTap,7天做出游戏雏形截图
《灵植仙途》开发心得—代码小白,用TapTap,7天做出游戏雏形
大家好,我是《灵植仙途》的制作者,首先感谢官方大大给的测试资格。我是一个彻彻底底完完全全的代码小白。变量、函数、循环这些概念我有所耳闻,但真要我从零敲出一行Lua代码,十有八九会缺逗号少括号。 那这款有70种灵植、52位NPC、63件法器、5种结局的修仙种田游戏是怎么做出来的? 答案是:我用详细的设计文档,驱动TapTap制造的AI帮我写完了全部代码。 7天时间,204次构建,约24400行
11 赞
3 回复