摘要

在一部分游戏开发中,多点触控并不是被期望的。官方在 v2.3.0 版本时提供了单点触控的开关,但是并不能指定触点数量,且旧版本没法使用,那么可不可以实现这一功能呢?

正文

测试版本

CocosCreator 版本 2.0.5
CocosCreator 版本 2.1.2
CocosCreator 版本 2.3.4
CocosCreator 版本 2.4.2

思维过程

控制开关 cc.macro.ENABLE_MULTI_TOUCH 是新版才有的,想兼容旧版本还是要去更根源的地方找,跑到源码里先看看触摸事件最开始在哪里分发的!首先想到的是,既然在浏览器端可以进行点击,必然会走注册事件的方法,去源码里搜一下 window.addEventListener,看了一下,果然有个翻译过来像输入的脚本 CCInputManager.js。然后在这个脚本中搜一下 touchstart 果然找到了对应的方法:

/*** @method handleTouchesBegin* @param {Array} touches*/
handleTouchesBegin (touches) {let selTouch, index, curTouch, touchID,handleTouches = [], locTouchIntDict = this._touchesIntegerDict,now = sys.now();for (let i = 0, len = touches.length; i < len; i ++) {selTouch = touches[i];touchID = selTouch.getID();index = locTouchIntDict[touchID];if (index == null) {let unusedIndex = this._getUnUsedIndex();if (unusedIndex === -1) {cc.logID(2300, unusedIndex);continue;}//curTouch = this._touches[unusedIndex] = selTouch;curTouch = this._touches[unusedIndex] = new cc.Touch(selTouch._point.x, selTouch._point.y, selTouch.getID());curTouch._lastModified = now;curTouch._setPrevPoint(selTouch._prevPoint);locTouchIntDict[touchID] = unusedIndex;handleTouches.push(curTouch);}}if (handleTouches.length > 0) {this._glView._convertTouchesWithScale(handleTouches);let touchEvent = new cc.Event.EventTouch(handleTouches);touchEvent._eventCode = cc.Event.EventTouch.BEGAN;eventManager.dispatchEvent(touchEvent);}
}

代码的逻辑是处理传入的多个触点,为每个触点分配一个未使用的 id,排好序后分发出去,我们想控制触点的数量,那么是不是可以从获取 未分配的 id 入手呢,我最多允许分配固定数量的 ID 是不是就可以控制最大触点数量?看下分配的方法:

_getUnUsedIndex () {let temp = this._indexBitsUsed;let now = cc.sys.now();for (let i = 0; i < this._maxTouches; i++) {if (!(temp & 0x00000001)) {this._indexBitsUsed |= (1 << i);return i;}else {let touch = this._touches[i];if (now - touch._lastModified > TOUCH_TIMEOUT) {this._removeUsedIndexBit(i);delete this._touchesIntegerDict[touch.getID()];return i;}}temp >>= 1;}// all bits are usedreturn -1;
}

分配时有个 this._touches 数组存储这些触点,经过一次 For 循环分配 ID,最多分配 this._maxTouches 个 ID。这样就明白了,干脆改掉 _maxTouches 就能限制分配的数量了,先改成一,然后拿手机扫码试试。成了!再搞成 0 试试,果然触摸失效了!!!完美!

更好的实现

魔改下引擎后,换项目或者引擎版本无法做到复用,有没有更好的办法呢?当然,插件脚本就能实现这个需求,在 CocosCreator 中脚本执行顺序为:Cocos2d 引擎最先执行,然后是插件脚本(有多个的话按项目中的路径字母顺序依次加载),最后才是我们写的普通脚本(打包后只有一个文件,内部按 require 的依赖顺序依次初始化)。

那就将这个修改写进 k-cocos.js 扩展脚本中,声明一个方法挂载到 cc 上吧,CCInputManager.js 脚本最末尾有着导出的逻辑:

module.exports = cc.internal.inputManager = inputManager;

不同的版本还不一样,新版是 cc.internal,比较旧的版本是 _cc.inputManager,那就只好做下兼容处理。

// 触点数量控制
cc.kMultTouch = function (count) {// 2.3.0 版本以上if (cc.internal && cc.internal.inputManager) {cc.internal.inputManager._maxTouches = count;return;}// 低版本if (_cc && _cc.inputManager) {_cc.inputManager._maxTouches = count;}// 低版本兼容 QQ_PLAY 的一段逻辑if (CC_QQPLAY && BK && BK.inputManager) {BK.inputManager._maxTouches = count;}
}

结语

扩展脚本已经开源,实现了游戏速率控制、全局触点数量控制、也扩展了节点的一些属性和方法,还有许多想法没加进去,欢迎大家提建议、给点个星星 Star,欢迎加入讨论 QQ 群:1085201157

GitHub地址: https://github.com/KuoKuo666/k-cocos

个人网站:www.kuokuo666.com

2020!我们一起进步!O(∩_∩)O~~

CocosCreator之控制游戏触点数量相关推荐

  1. 个人使用CocosCreator开发小游戏路上的一些“坑坑洼洼”

    个人使用CocosCreator开发小游戏路上的一些"坑坑洼洼" 开场自白 微信小游戏 适配 一般界面弹窗节点适配 套路的需求适配 PS ps中的ps 摄像机的新手操作 tiled ...

  2. CocosCreator物理小游戏实战-别离开碗(一)

    摘要 CocosCreator 物理小游戏实战教程开更啦!来跟 KUOKUO 一起学习吧!开发语言为 TypeScript! 正文 使用版本 CocosCreator 版本 2.3.4 游戏效果 游戏 ...

  3. python手势控制游戏_欢乐的计算机视觉-隔空玩游戏(python手势控制飞机大战)

    每个人儿时都有一个武侠梦,梦想自己有一天10块钱买到一本如来神掌,从此仗剑走天涯,不过在桃花岛,真的有一本秘籍:隔空玩游戏,今天,就带领大家翻阅翻阅这本秘籍. 这本秘籍全部都是用python来完成的哦 ...

  4. hadoop中如何控制map的数量

    hadoop中如何控制map的数量 @(HADOOP)[hadoop] hadooop提供了一个设置map个数的参数mapred.map.tasks,我们可以通过这个参数来控制map的个数.但是通过这 ...

  5. 【unity】FPS用鼠标控制游戏对象转动

    文章目录 前言 step1:获取鼠标的横纵坐标 Step2:限制视角上下的旋转角度 Step3:通过旋转相机角度来控制游戏物体的旋转 Step4:鼠标居中 完整脚本如下: 前言 随便写了个demo,记 ...

  6. Java多线程 信号量和屏障实现控制并发线程数量,主线程等待所有线程执行完毕2

    项目需求需要多线程执行计算任务,主线程要等所有线程执行完毕,记录执行结果.另外要控制并行线程数量,防止用光内存.实现测试代码如下. 测试代码如下: public class ThreadsTest { ...

  7. SparkSql 控制输出文件数量且大小均匀(distribute by rand())

    @羲凡--只为了更好的活着 SparkSql 控制输出文件数量且大小均匀(distribute by rand()) Q:Spark如何控制文件你输出数量? A:这个简单,用 coalesce或者re ...

  8. unity中通过代码控制游戏中画质

    最近在开发项目的时候突然想到可以添加一个调整画质的按钮或者DropDown或者Slider的UI来控制游戏中的画质 因为我之前写过一篇关于DropDown的使用方法的博客 DropDown的使用方法地 ...

  9. 深度分析如何在Hadoop中控制Map的数量

    深度分析如何在Hadoop中控制Map的数量 guibin.beijing@gmail.com 很多文档中描述,Mapper的数量在默认情况下不可直接控制干预,因为Mapper的数量由输入的大小和个数 ...

最新文章

  1. 网络文件系统(NFS)简介
  2. 使用Python+Pycaret进行异常检测
  3. java尝试编写macd,试验顶背离底背离
  4. 写在SDOI2016Round1前的To Do List
  5. 2017年网易校招题 买苹果
  6. 日结问题解决思路和方式
  7. Oracle In Memory最佳实践(附PPT和视频回放)
  8. shell中if条件字符串、数字比对,` `和[ ]区别
  9. 解决weblogic.net.http.SOAPHttpsURLConnection incompatible with javax.net.ssl.HttpsURLConnection
  10. 零基础考公务员,备考多长时间最合适?
  11. 生物统计学(biostatistics)学习笔记(三)
  12. Android开发问题汇总
  13. 【渝粤教育】国家开放大学2018年春季 8635-22T老年人中医体质辨识与养 参考试题
  14. springboot整合阿里云oss上传文件(图片或视频)
  15. python猴子分桃问题_阶乘
  16. java字符串hash算法_Java常用HASH算法总结【经典实例】
  17. WiFi知识点大总结
  18. 第四周项目3--单链表应用之逆置
  19. 基于ABP的AppUser对象扩展
  20. LayUi——OA项目 03(会议排座送审)

热门文章

  1. visual studio如何不使用system(“pause”)仍可暂停
  2. Opencv实战5-实现提取目标框图像
  3. Wdcdn缓存加速系统1.0发布
  4. Hydra安装及其用法
  5. 读过《坏孩子的故事》后
  6. 频繁爆雷之后 P2P网贷平台还值得大家投资吗?
  7. 使用DEAP数据进行情绪识别
  8. 一个可乐瓶自制捕蟑螂神器
  9. c语言付款功能代码_c语言实现的货物管理系统实例代码(增加删除 查找货物信息等功能)...
  10. QQ个人中心模块用例(初稿截图)