Cocos通过Electron打包web应用后,在触屏一体机设备触摸滑动无效问题解决

news2024/11/24 13:08:06

Cocos通过Electron打包web应用后,在触屏一体机设备触摸滑动无效问题解决

已经很晚了,刚刚解决这个问题,还是想记录一下,因为刚刚接触 cocos 没多久,这个问题困扰了我很久。

背景

接手了一个答题小游戏,由于涉及敏感信息就不在这里截图了,交接到我手里的是用cocos开发的,之前从来没有接触过,于是也是边学边做,由于整体并不是特别的复杂,因此一切也都比较顺利,直到第一版交付到客户手里设备实测,出现了问题。

客户需要将应用程序放到触屏一体机上面进行宣传使用,就是像银行取号的那种机器,类似于下面这种,它其实就是一个 1920 * 1080 的 window 电脑,只不过可以进行触摸罢了:

在这里插入图片描述

我是使用 cocos 编写的代码,写完之后,把项目构建发布成 Web Desktop 或者是 Web Mobile ,其实他们都是差不多的,官方解释是 Cocos Creator 提供了两种 Web 平台的页面模板,可以通过 发布平台 的下拉菜单选择 Web Mobile 或 Web Desktop,他们的区别主要在于 Web Mobile 会默认将游戏视图撑满整个浏览器窗口,而 Web Desktop 允许在发布时指定一个游戏视图的分辨率,而且之后游戏视图也不会随着浏览器窗口大小变化而变化。

构建完成,将构建完成的文件包放到 Electron 程序里面套上壳,生成 exe 文件,然后客户将 exe 文件放到上面说的触屏一体机上用。

问题出现

点击事件、页面切换啥的,一切都很顺利,直到做到一个排序题,需要拖拽选项进行排序的时候发现,一体机上没反应。但是这个拖拽选项的操作在我电脑上,无论是浏览器、还是浏览器手机模式、还是最终通过 electron 打包成 exe 文件,都是可以操作的,只有一体机上没反应。

定位原因

第一:这时候我的第一反应是触屏的原因,毕竟点击事件触摸事件是两回事,而且我自己电脑再怎么测试,鼠标再怎么点,他也是 click 事件而不是 touch 事件。

但是在我查找资料发现,cocos 提供的 touch 事件,是兼容 click 事件的,也就是说,可以简单的理解,只要用 touch 事件写,如果设备不支持 touch 事件的话,他也会帮我们用 click 事件处理,而且我在开发的过程中也是使用的 touch 事件而不是 click 事件。所以我觉得跟 cocos 开发没关系。

第二:我又在想,是不是因为 electron 打包的原因?

electron 在早期的版本是不支持触摸的,但是一想也不对,我是最近新安装的版本,就算不是最新,也到不了早期的程度,肯定是支持触摸的(electron7开始才支持触摸,现在都20多了),但是我还是不放心,我就在 electron 里面监听了一下,果然支持!擦!

第三:我有他妈的突然一想,是不是因为 electron 打包后,设备放到一体机上,一体机是window PC,它没有判断出是不是触摸设备,还在用 click 事件处理?

因为单纯的点击事件是没有任何问题的,因为我是用的 touch 处理的,也就是说 touch_end 监听到了,就是按下没监听到,移动没监听到,但是抬起的时候监听到了。于是我就在 electron 打包的时候,强行开启触摸模式:

  mainWindow.webContents.debugger.attach('1.3');
  mainWindow.webContents.debugger.sendCommand('Emulation.setTouchEmulationEnabled', {
    enabled: true,
    configuration: 'mobile',
  });
  mainWindow.webContents.debugger.sendCommand('Emulation.setEmitTouchEventsForMouse', { enabled: true });

开启之后打包生成的 exe 就模拟手机效果嘛,鼠标变成了小圆圈,很遗憾,我的还是不行,甚至我自己的电脑也不行了,以前我电脑还可以拖拽,开启强制触摸后,也不行了,只能点击事件,和一体机一模一样了。

失败!当然庆幸的是,我还原出来了一体机的问题。

注意哈。有的人,通过上面的配置,就可以成功了!只是我的不行。

第四:我从网上找资料,说是 cocos 的问题,cocos 的底层引擎在触摸屏上使用的时候需要强制开启触摸。

当看到这个消息的时候我觉得 “天亮了!”

我抓紧按照他的步骤修改底层引擎:

首先找到引擎位置:

在这里插入图片描述

然后一层一层的找到目标文件:

在这里插入图片描述

然后用记事本打开或者 notepad++ 打开,搜索 var capabilities =,找到后再后面添加一段代码:capabilities["touches"] = true; 然后保存关闭。

在这里插入图片描述

最后到 cocos 编辑器中,选择开发者,重新编译引擎

在这里插入图片描述

上面这个步骤搞完,重新编译打包,在用 electron 套壳完,就可以了!!!

天塌了!!!我还是失败了,但是有的人就可以了。

第五:只有一个原因了!

你看,通过上面几部分,electron 支持触摸、cocos 引擎开启了强制触摸、甚至 electron 也开启了手机模式让 cocos 使用触摸。还是没有办法。

然后我就在 cocos 项目加载之后,打印了一下触摸的配置:

console.log("触摸======>> ", cc.sys.capabilities.touches, cc.sys.capabilities)

然后效果是:本地浏览器肯定没问题,但是我用 electron 打包成 exe 之后,挑事的时候,打印了两次,第一次 cc.sys.capabilities.touches 的值是 undefined,第二次才是 true

也就是说在最开始的时候,他是 undefined,也就是说在应用启动的最开始,是没有 cc.sys.capabilities.touches 的,后来才有的。

然后百度!搜!资料少的要死,但是后来才大体知道一件事,就是 cocos 在应用启动的时候,会先判断你能不能使用触摸事件,如果能,才给你开启触摸监听,不然的话,不启动触摸监听,通过打印,最开始 cc.sys.capabilities.touches 的值是 undefined,不支持触摸,所以他就没有开启监听,后来尽管有了,但是他已经判断完了,觉得你设备已经不支持触摸了,怎么判断的呢,下面代码:

const supportTouch = (document.documentElement.ontouchstart !== undefined || document.ontouchstart !== undefined);

解决需要该他引擎源码,麻烦的一比,但是有一种更佳粗暴的方式,那就是改 cocos 构建发布完的文件包的 index.html 文件,给他加一个ontouchstart ,因为源码判断的是只要 ontouchstart 不是 undefined 就开启触摸监听,所以,我们只要初始化一下就可以了:

<script>
// Cocos 解决触摸屏问题
if (document.documentElement.ontouchstart === undefined) document.documentElement.ontouchstart = null
</script>

改完,通过 electron 打包后,完美实现!

擦,难为了我一天,饭都没吃好。

今天就这样,希望这篇博文可以帮助一些小萌新的 cocos 开发程序猿!

拜了个拜!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

直线度测量仪测量不准时如何快速自检恢复?

直线度测量仪应用于圆形产品的直线度及外径尺寸检测&#xff0c;既有应用于生产线中的在线测量仪又有离线直线度测量仪&#xff0c;但不管哪种设备&#xff0c;都是光学检测设备&#xff0c;也都具备光学设备的特性。 在测量仪的长期使用过程中&#xff0c;难免会遇到测量不准…

2015款到18款奔驰GLC升级为2021款的HU6主机后,实现了触摸屏人机交互和Carplay功能

奔驰GLC是北京奔驰生产的一款中型SUV。有车主将2015款奔驰GLC升级为2021款的HU6主机后&#xff0c;实现了触摸屏人机交互和Carplay功能。该车主分享了使用体验&#xff1a; • Carplay功能&#xff1a;可以直接在车机大屏幕上显示导航、音乐和电话信息&#xff0c;让用户在开车…

中国信息学奥赛专用系统之----NOI Linux 2.0系统安装教程

1、下载NOI Linux 2.0系统&#xff0c;下载地址&#xff1a; https://noiresources.ccf.org.cn/ubuntu-noi-v2.0.iso 2、新建虚拟机 3、开机安装系统 下载插件&#xff0c;可能需要10分钟以上。 5、进系统看看 OK,NOI Linux 2.0系统安装完毕&#xff01;

MySQL面试题全解析:准备面试所需的关键知识点和实战经验

MySQL有哪几种数据存储引擎&#xff1f;有什么区别&#xff1f; MySQL支持多种数据存储引擎&#xff0c;其中最常见的是MyISAM和InnoDB引擎。可以通过使用"show engines"命令查看MySQL支持的存储引擎。 存储方式&#xff1a;MyISAM引擎将数据和索引分别存储在两个不…

手机怎么远程控制电脑屏幕?手机远程控制电脑方法分享

手机与电脑之间的互联互通变得越来越便捷。 无论是工作还是学习&#xff0c;有时我们需要在手机上远程控制电脑屏幕&#xff0c;以完成一些复杂的操作或查看电脑上的文件。 本文将详细介绍几种实用的手机远程控制电脑屏幕的方法&#xff0c;帮助读者轻松实现这一目标。 一、使…

美容院节假日可以做哪些营销活动?博弈美业系统源码|美容院管理系统

美容院在节假日期间开展各种类型的营销活动是必不可少的&#xff0c;可以吸引用户消费或充值、开发新客户、提高客户忠诚度。 在举办各类活动时&#xff0c;可针对不同的用户群体采取不同的活动策略&#xff0c;下面给大家简单列举一些活动策略&#xff0c;门店可在此基础上根…

【Nessus破解及20220412插件】漏洞扫描工具之一,windows版本安装

一、双击安装程序 安装路径默认即可&#xff0c;记住安装的路径在哪里。 一般默认路径都是——C:\Program Files\Tenable\Nessus 等待初始化加载完成。 选择第四个。 选择Tenable.sc&#xff0c;继续下一步。 填写username和密码继续。 安装完是以下界面&#xff0c;目前还不能…

【机器学习之深度学习】神经元、层的基本概念,神经网络以及神经元与线性回归和逻辑回归的相似之处

引言 神经元、层和神经网络是深度学习模型的核心组成部分&#xff0c;它们共同工作&#xff0c;使得深度学习能够处理复杂的数据和任务。通过叠加多个层&#xff0c;可以构建出能够学习复杂函数的深度神经网络 一、神经元和层 深度学习中的神经元和层是构建复杂预测模型的基础…

Unity 使用字符串更改Text指定文字颜色、大小、换行、透明

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用字符串改变文字属性的方法&#xff08;一&#xff09;修改颜色&#xff08;二&#xff09;修改大小&#xff08;三&#xff09;换行&#xff08;四&…

SQL注入实例(sqli-labs/less-15)

0、初始页面 1、确定闭合符号 确定符号的闭合 2、爆库名 python脚本爆库名 def inject_database(url):name for i in range(1,20):low 32high 128while low < high:mid (low high) // 2payload "-1 or ascii(substr(database(),%d,1))>%d # " %(i,mid…

从今天开始深入学习 SQL 优化

SQL优化 .SQL优化12.1 selet具体字段 12.2 多用limit 12.3 用union all替换 union 12.4 优化group by 12.5 优化order by 12.6 小表驱动大表 12.7 字段类型使用合理 12.8 优化linit分页 12.9 exist& in的合理利用 12.10 join关联的表不宜过多 12.11 deletein自查询不走索引…

学习记录——day29 网络编程

目录 一、网络编程引入 1.1、IPC通信方式 1&#xff09;内核提供&#xff1a; 无名管道 有名管道 信号 2&#xff09;system V: 消息队列 共享内存 信号量集 1.2、网络通信使用缘由 二、网络发展阶段 2.1 APRAnet阶段 2.2 TCP/IP两个协议阶段…

Java收发邮件笔记

1 关于邮箱的前置知识 1.1 概念部分 邮箱服务器和协议是电子邮件系统中不可或缺的两个组成部分&#xff0c;它们共同确保了电子邮件的顺利发送、接收和管理。 1.1.1 服务器和协议 邮箱服务器 比如常见的QQ邮箱,网易邮箱。 邮箱服务器是一种负责电子邮件收发管理的计算机系…

Rust学习---Hello World

编写 Rust 程序 1.程序文件后缀名: rs 2.文件命名规范:hello_world.rs 3.(例子) 使用命令创建项目&#xff0c;命名为"hello world" 打开 cmd 输入: mkdir hello_world cd hello_world 新建文件 main.rs编译与运行 Rust 程序 1.编译:rustc main.rs&#xff0c;…

【无标题】Unity Asset Hunter 插件

Asset Hunter PRO是Unity的一款插件&#xff0c;用于分析工程内的资源使用情况&#xff0c;资源大小&#xff0c;分析资源依赖关系&#xff0c;可以用来清理项目中未使用的资源。尤其是项目较大时&#xff0c;删除没有使用的资源很有帮助。 对于项目UI图片修改次数过多时&…

Linux 进程概念

Linux 进程概念 硬件理解冯 诺依曼体系结构五大组成部件强调存储 引子操作系统&#xff08;Operator System&#xff09;概念作用认识为什么要有操作系统&#xff1f; 结构 示意图理解操作系统system call库函数概念 进程什么是进程概念误区认识 描述进程 - PCBtask_struct - P…

colResizable插件实现网页中表格列宽自定义

需求&#xff1a;页面上每个字段的列宽&#xff0c;可以通过页面拖动的形式进行调整。 解决方法&#xff1a;使用jQuery的一个插件&#xff0c;名称叫 colResizable&#xff0c;可以实现。 插件官网 colResizable – 可调整大小的列和表 (bacubacu.com) 说明&#xff1a; 该…

汽车线路保护设计

汽车线路保护设计 线路保护就是要对导线加以保护&#xff0c;兼顾对回路电器件的保护。保护装置主要有熔断器、断路器和易熔线等。 保险、继电器、导线、电瓶的选择和计算 熔断器的选取原则 发动机ECU、ABS等对整车性能及安全影响大&#xff0c;另外&#xff0c;易受其他用…

从零安装pytorch并在pycharm中使用

背景介绍 目前主流使用的工具有Facebook搞的pythorch和谷歌开发的tensorflow两种&#xff0c;二者在实现理念上有一定区别&#xff0c;pytorch和人的思维模式与变成习惯更像&#xff0c;而tensorflow则是先构建整体结构&#xff0c;然后整体运行&#xff0c;开发调试过程较为繁…

算法工程师必知必会的数学基础之微积分上

系列文章&#xff1a; 第一篇&#xff1a;算法工程师必知必会的数学基础之线性代数第二篇&#xff1a;算法工程师必知必会的数学基础之微积分上&#xff08;本文&#xff09;。 文章目录 2. 微积分2.1 极限&#xff08;Limits&#xff09;和 连续性&#xff08;Continuity&…