android 关闭多点触控_Cocos Creator关闭多点触摸的问题

本文介绍了四种禁用Cocos Creator多点触控的方法:改写Node的派发事件、修改不同设备配置、代码逻辑控制以及修改CCNode.js文件。针对Android和iOS提供了具体的实现细节,以实现单点触控功能。
摘要由CSDN通过智能技术生成

一、 方案一:改写Node的派发事件

方法:改写node的派发事件,当有多个响应的时候不去进行dispatch。

在游戏开启的时候把node原来的方法:

cc.Node.prototype.dispatchEvent ƒ (event) {

_doDispatchEvent(this, event);

cachedArray.length = 0;

}、

改为:在游戏必经的文件中调用一次;改写node的dispatchEvent的方法

DealMulityEventListener:function(){

cc.Node.maxTouchNum = 1;

cc.Node.touchNum = 0;

var __dispatchEvent__ = cc.Node.prototype.dispatchEvent;

cc.Node.prototype.dispatchEvent = function (event) {

switch (event.type) {

case 'touchstart':

if (cc.Node.touchNum < cc.Node.maxTouchNum) {

cc.Node.touchNum++;

this._canTouch = true;

__dispatchEvent__.call(this, event);

}

break;

case 'touchmove':

if (!this._canTouch && cc.Node.touchNum < cc.Node.maxTouchNum) {

this._canTouch = true;

cc.Node.touchNum++;

}

if (this._canTouch) {

__dispatchEvent__.call(this, event);

}

break;

case 'touchend':

if (this._canTouch) {

this._canTouch = false;

cc.Node.touchNum--;

__dispatchEvent__.call(this, event);

}

break;

case 'touchcancel':

if (this._canTouch) {

this._canTouch = false;

cc.Node.touchNum--;

__dispatchEvent__.call(this, event);

}

break;

default:

__dispatchEvent__.call(this, event);

}

};

},

二、 方案二:修改不同设备的配置

ios上很简单的在AppController.mm里

[eaglView setMultipleTouchEnabled:YES]

设置为NO,就是单点触控了,无需更改cocos底层代码;

android上的做法是找到项目所引用的cocos引擎文件:

Cocos2dxGLSurfaceView.java,找到onTouchEvent方法,在switch语句里的

MotionEvent.ACTION_POINTER_DOWN

MotionEvent.ACTION_DOWN

这两个case 的第一行都写上:

if (pointerNumber > 1) return false;

当检测到当前触控点的数量大于1时,就不让再点击屏幕。

三、 方案三:代码逻辑控制

一个全局可访问的变量用来记录 touch id

在 touch start 回调中记录当前的 touch id,在 touch end 中删除当前的 touch id

如果当前全局的 touch id 存在的话,不响应任何事件

不过这个对于 button 好像没办法,因为 button 的事件监听器是引擎内部注册的。

例如:尝试写逻辑来屏蔽多点触控

ff916d9a54500ba55f1f67e913bebd1b.png

期待Cocos Creator以后可以提供一个全局的开关,用来开启或者关闭多点触摸。

四、 方案四:修改修改CCNode.js文件

如何屏蔽多点触控: 修改CCNode.js文件,增加下面加粗代码

var _touchStartHandler = function (touch, event) {

var pos = touch.getLocation();

var node = this.owner;

if(cc.currentTouchNode && cc.currentTouchNode.isValid

&& cc._currentTouchNode.activeInHierarchy){

return;

}

if (node._hitTest(pos, this)) {

if (CC_JSB) {

event = Event.EventTouch.pool.get(event);

}

event.type = EventType.TOUCH_START;

event.touch = touch;

event.bubbles = true;

node.dispatchEvent(event);

if (CC_JSB) {

event.touch = null;

event._touches = null;

Event.EventTouch.pool.put(event);

}

cc._currentTouchNode = node;

return true;

}

return false;

};

var _touchEndHandler = function (touch, event) {

cc._currentTouchNode = null;

};

var _touchCancelHandler = function (touch, event) {

cc._currentTouchNode = null;

};

以上参考是论坛群友给的方案. 欢迎验证反馈。

正在跳转​jq.qq.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值