addtouchEventListener
是属于Widget
下的触摸事件相关的 *** 作,基本使用规则如下:
var button = new ccui.button()button.addtouchEventListener(this.touchEvent,this)touchEvent: function (sender,type) { switch (type) { case ccui.Widget.touch_BEGAN: this._topdisplayLabel.setString("touch Down"); break; case ccui.Widget.touch_MOVED: this._topdisplayLabel.setString("touch Move"); break; case ccui.Widget.touch_ENDED: this._topdisplayLabel.setString("touch Up"); break; case ccui.Widget.touch_CANCELED: this._topdisplayLabel.setString("touch Cancelled"); break; default: break; }}二、为何改善
现在的触摸事件只做监听,并没有相关逻辑上的判断,我们游戏在开发的过程中遇到一些不正常点击而导致的问题。例如:在场景跳转的时候,连续点击两次后,会push两场同样的场景,正常逻辑应该是只push一次。 三、如何改善
先看我在基于原事件基础上添加的一些类型:
ccui.Widget.touch_TYPE_TIMELY = 1 //及时:随时点击,随时响应ccui.Widget.touch_TYPE_DELAY_AFTER = 2 //延时:随时点击,点击后马上响应,延时一段时间后,响应下次点击ccui.Widget.touch_TYPE_DELAY_FRONT = 3 //延时:每次onEnter时,延时一段时间后,才能响应点击ccui.Widget.touch_TYPE_ONCE = 4 //一次:只有一次点击机会,点击后对象触摸禁止,当onExit后恢复ccui.Widget.touch_TYPE_ALL_BAN = 5 //所有:只有一次点击机会,点击后全屏触摸禁止,当onExit后恢复ccui.Widget.touch_TYPE_DELAY_FRONT_AND_ALL_BAN = 11 //兼具:DELAY_FRONT和ALL_BAN
代码如下:
ccui.Widget.prototype.addtouch = function(_func,_type,_time){ var __type = _type || ccui.Widget.touch_TYPE_TIMELY var __time = _time || 1 switch (__type){ case ccui.Widget.touch_TYPE_TIMELY: this.addtouchEventListener(_func) break case ccui.Widget.touch_TYPE_DELAY_AFTER: //当触发点击事件时,将按钮的可触性设置为false,用delayTime延迟1秒后再设置为true var that = this var __func = function(_sender,_type){ switch(_type){ case ccui.Widget.touch_ENDED: that.settouchEnabled(false) _func(_sender,_type) that.runAction(cc.sequence(cc.delayTime(__time),cc.callFunc(function(){ that.settouchEnabled(true) }.bind(that)))) break } } this.addtouchEventListener(__func) break case ccui.Widget.touch_TYPE_DELAY_FRONT: //在onEnter事件中,将按钮的可触性设置为false,然后delayTime延迟1秒后再设置为true this.setonEnterCallback(function(){ this.settouchEnabled(false) this.runAction(cc.sequence(cc.delayTime(__time),cc.callFunc(function(){ this.settouchEnabled(true) }.bind(this)))) }.bind(this)) if (_func == null){ return } var __func = function(_sender,_type){ switch(_type){ case ccui.Widget.touch_ENDED: _func(_sender,_type) break } } this.addtouchEventListener(__func) break case ccui.Widget.touch_TYPE_ONCE: //当触发点击事件时,将按钮的可触性设置为false,在onExit事件中设置为true var that = this var __func = function(_sender,_type) that.setonExitCallback(function(){ that.settouchEnabled(true) }.bind(that)) break } } this.addtouchEventListener(__func) break case ccui.Widget.touch_TYPE_ALL_BAN: //当触发点击事件时,在最上层添加一层遮罩,吞噬掉所有触摸,在onExit事件中移除遮罩 var that = this var __func = function(_sender,_type){ switch(_type){ case ccui.Widget.touch_ENDED: gAddMask() _func(_sender,_type) that.setonExitCallback(function(){ gRemoveMask() }.bind(that)) break } } this.addtouchEventListener(__func) break case ccui.Widget.touch_TYPE_ALL_BAN_AND_DELAY_FRONT: //组合,DELAY_FRONT和ALL_BAN this.setonEnterCallback(function(){ this.settouchEnabled(false) this.runAction(cc.sequence(cc.delayTime(__time),cc.callFunc(function(){ this.settouchEnabled(true) }.bind(this)))) }.bind(this)) var that = this var __func = function(_sender,_type) that.setonExitCallback(function(){ gRemoveMask() }.bind(that)) break } } this.addtouchEventListener(__func) break default: this.addtouchEventListener(_func) break }}
遮罩层的实现:
function gAddMask(){ var __scene = cc.director.getRunningScene() var __mask_layer = __scene.getChildByname("MaskLayer") if(!__mask_layer){ __mask_layer = new MaskLayer() __scene.addChild(__mask_layer,99999) __mask_layer.setname("MaskLayer") }else{ __mask_layer.setSwallowtouches(true) }}function gRemoveMask(){ var __scene = cc.director.getRunningScene() var __mask_layer = __scene.getChildByname("MaskLayer") if(__mask_layer){ __mask_layer.setSwallowtouches(false) }}var MaskLayer = cc.Layer.extend({ ctor:function(){ this._super() cc.log("wade MaskLayer ctor") this.Listener = cc.EventListener.create({ event: cc.EventListener.touch_ONE_BY_ONE,swallowtouches: true,ontouchBegan: function (touch,event) { cc.log("wade MaskLayer ontouchBegan") return true },ontouchmoved:function (touch,event){ cc.log("wade MaskLayer ontouchmoved") },ontouchended:function (touch,event){ cc.log("wade MaskLayer ontouchended") },}) cc.eventManager.addListener(this.Listener,this); },setSwallowtouches:function(_bool){ this.Listener.setSwallowtouches(_bool) }})总结
以上是内存溢出为你收集整理的cocos-js,Widget的addTouchEventListener改善全部内容,希望文章能够帮你解决cocos-js,Widget的addTouchEventListener改善所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)