下载 App

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

精华04/21157 浏览开发交流
作者:琋琯的攻略机
开发引擎: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 事件系统
适用场景:游戏弹窗、按钮点击、跨平台开发
开发难度:简单
别再烧积分了!从每次 2000 到每次 50 的血泪经验截图
别再烧积分了!从每次 2000 到每次 50 的血泪经验
适用场景:所有在用 TapTap Code 开发游戏的小白 难度:★☆☆☆☆ 背景最近群里总有人"炫耀"一次操作花了几千积分,说实话这不是值得高兴的事——这是在告诉所有人你的开发方式有根本性问题。我也走过这条弯路,所以来说说怎么改。 积分消耗的本质是什么积分 = AI 处理的 token 数量 = 你发给 AI 的内容 + AI 回给你的内容所以烧积分的本质只有两种: 你让 AI 做了大量无效/重
精华
68 赞
21 回复
01:27
《大二暑假,我用AI做了一款属于自己的游戏》截图
《大二暑假,我用AI做了一款属于自己的游戏》
本人自制游戏现已加入taptap封闭测试(仅适配安卓机型)欢迎大家前来尝试(八月十号可以正式开始游玩) 如果有建议或者bug反馈可以加入qq群928501443 #发现好游戏 #游戏日常 #浅评一下 #今天游戏圈发生了啥
3 赞
03:06
为了不被斩杀,我只能做到这些了截图
为了不被斩杀,我只能做到这些了
之前一直申请不到计划3,之前说太花哨,后面说体量完成度不足,在我一番小作文下,编辑终于给了我解答,什么原生质感,玩家开局体验啥的。 本来计划2也够用,准备以后再优化了,结果计划2赠送的积分要砍半了,学生党实在消费不起,于是只能再冲一波计划3了 从周六中午到现在一天半时间,优化了一遍角色卡,战斗卡,还有抽卡界面,优化了新手教程,该说不说确实比之前要舒服些。 前半部分为新版,后半部分为旧版。 明天再次
37 赞
6 回复
如何提升你游戏中的UI美术水平截图
如何提升你游戏中的UI美术水平
一、请为你的游戏挑选一款合适的字体 很多开发者没有注意到其实UI界面中最重要的元素是字体,一款合适的字体能给整个游戏的界面感官带来蜕变。 请看案例 那么如何挑选适合自己的字体呢? 我总结出了一些小经验可供参考: 黑体:通用 宋体:古风、武侠、修仙 楷体:古风、武侠、修仙 圆体:卡通、动漫、Q版 科技:科幻、未来、电子 顺手分享一个免费可商用字体网站: 当然 如果你不知道自己的游戏适合什么风格
精华
123 赞
44 回复
自律打卡帖截图
自律打卡帖
开发游戏时常常有脑雾,遇到序列帧、骨架、3d、服务端等让游戏更高级的技巧抗拒阅读,学习不下去,为了跟上嗒啦啦进步的步伐,从今天开始戒色!百日起步,一赞一天,上不封顶。破戒一次给tap充100点券😡😡
3 赞
40 回复
开发心得-界面布局心得截图
开发心得-界面布局心得
大家好,我正在用 TapTap 制造制作一款2D 治愈林间徒步旅行游戏《徒步荒野》。 我分享一下我的开发心得,希望能有用,下面是一些界面布局的心得。 第一步:定版式、操作 先确定游戏是横版还是竖版、需要哪些操作按钮,敲定整体玩法思路。 我的玩法灵感参考《边境之旅》,主打散步看风景、沿途触发随机事件。 原版是 3D,考虑到自己是新手,选择2D 横版街机式来做,制作更简单、好上手。 第二步:敲定全局美
6 赞
3 回复
00:26
塔啦啦科研:三渲二(风格1)截图
塔啦啦科研:三渲二(风格1)
最近在研究像素风格的三渲二,一直想做小丑牌那种风格,但是塔啦啦一直做不出来,发现是有一部分的功能做不了,只能实现简单的材质制作和描边,因此,我从零直接搭建了一整套引擎基础。目前进度可以看视频。 @嗒啦啦 什么时候出shader 评论区随意提问 #TapTap制造 #TapTap制造社区 #TapTap制造
4 赞
5 回复
永恒虚空持续开发日记1——关于游戏中的新名词:场频截图
永恒虚空持续开发日记1——关于游戏中的新名词:场频
写在前边:首先感谢TapTap制造版主大大@汪崽 对于作品潜力的肯定,给与了我积分计划二的权限[表情_不好意思]。这边也在加紧开发改进各种功能中,期望尽快给大家带来成熟的版本。[表情_猫咪举手] 大家好,我是永恒虚空的制作人黑猫不详,大家叫我黑猫就好。从今天开始我将以后置开发日记的形式给大家分享我在TapTap制造中制作的游戏永恒虚空的开发过程,新人希望大家多多关照! 今天先给大家介绍我作品中最重
投票
3 赞
游戏自荐《少女终焉契约》截图
游戏自荐《少女终焉契约》
之前玩放置类型的rpg游戏的时候我就在想,现在游戏的操作有的太过于繁琐了,有没有一款休闲一点的,想上线就上线,离线的时候角色能自动行动的游戏呢?感谢TapTap制造,我按照我的想法开发出了现在这款游戏。 一、故事背景和UI 游戏的故事背景是传统的异世界穿越故事,玩家被女神召唤到异世界,随后组建工会,招募美少女,打怪升级探索世界。所以我选择了更加二次元萌系画风的UI风格,主页为各个主要的功能,点开来
8 赞
3 回复
「游戏上新」秦王的游戏截图
「游戏上新」秦王的游戏
你是秦王嬴政身边的廷臣。 方士徐福献上一匣【帝王卡牌】,四张凶牌封死命运: 屠戮|淫欲|奢华|征伐 七日死限,必须一一折断卡牌对应的欲望任务。 办不成? 秦王殿上长剑出鞘,君臣性命,顷刻倾覆。 ⚔游戏核心玩法 ▪回合卡牌策略,抉择牵动秦廷朝堂势力 ▪朝堂派系博弈:王权、法家、军功贵族、方士暗流角力 ▪多重结局:功成辅秦王一统,或是任务失败血染咸阳宫 ▪随机事件触发,每一局嬴政的猜忌程度截然
4 赞
2 回复