Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了【cocos2d-x3.2游戏开发】 模态对话框拦截所有事件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

开发基础:Cocos2dx 3.2

开发目标:1.实现模态对话框,无论弹出多少层都可以拦截事件。 2.ScrollView上有按钮,可以点击按钮滑动,响应事件并且不影响模态对话框的事件拦截。



实现方法:@H_197_8@
1.Cocos2dx 2版本中,我们会设置DlgLayer事件的优先级为-128,这样会拦截底层的按钮事件(-128),但是问题是会拦截当前层的按钮事件(-128),需要将DlgLayer上的点击事件手动传入对话框上的按钮处理。
3.0版本中已经不再使用了,这种方法有很大的局限性,尤其在界面比较多,比较复杂的情况下,传递事件是一种比较挫的做法。直接排除。

2.Cocos2dx 3.X版本中,因为改变了事件的规则,几乎所有的控件的事件处理都按SceneGraphpriority走的,甚至连Cocos2dx 2.X版本的Menu的-128也更改为0了。
做法: 直接弹出一个DlgLayer(CCColorLayer),封装一个事件吞噬(onTouchBegan,onTouchEnded...),事件优先级为addEventListenerWithSceneGraphpriority,即0
因为所有层的拦截事件优先级为0,就会先处理最上方的事件,即弹出的对话框事件。


特殊情况:@H_197_8@
弹出的对话框上有ScrollView,ScrollView上有按钮,最常见的问题就是@H_197_8@
1.点击按钮能触发事件,但是点击按钮无法滑动ScrollView@H_197_8@。
解决办法:把按钮优先级设置为1(当前ScrollView的优先级为0),这样就能点着按钮滑动了。
但是产生新问题,按钮能滑动,却不能点击了,因为DlgLayer的优先级为0,会拦截掉按钮的事件。

2.有一个特殊的API,setSwallowTouches,在为一个控件封装点击事件的时候,可以将setSwallowTouches(false)
这就意味着按钮能够响应点击事件,但是因为没有吞噬事件,就可以把按钮的事件传给ScrollView,ScrollView也可以滑动。
DlgLayer 优先级 0
ScrollView 优先级 0
Button 优先级 0
根据ZOrder的顺序,先触发Button,然后是ScrollView,最后是DlgLayer

3. 3.0版本不建议修改priority,因为你无法得知需要弹出多少层对话框,就无法确定每个对话框的priority

eventdispatcher事件分发规则
@H_197_8@添加监听的方法addEventListenerWithSceneGraphpriority和addEventListenerWithFixedPriority

1.SceneGraphpriority
和Node节点绑定的所有事件的优先级为0,
添加监听器后,事件监听列表内部的排序为 "<0,scene graph (0 priority),>0"

2.FixedPriority
用来自己定制优先级,一般设置"<0 或 >0"

3. 响应事件的优先级,数值越小,越先响应,-1 0 1这个顺序
内部事件处理顺序:
1.优先级为负数的事件
2.优先级为0(scene graph)的事件,相同的优先级会根据Node的z顺序高的(绘制于顶部的)节点将优于z顺序低的节点。这将保证了诸如触碰事件的自顶向下传播。
3.优先级为整数的事件


最后附带一个lua版封装的TouchableSprite

一个可点击的图片,可以在ScrollView上点击滑动,响应事件。


  1. --[[@H_197_8@@H_197_8@
  2. 可点击的图片,可以设置响应的优先级。@H_197_8@
  3. 比如ScrollView上的按钮,可以用TouchableSprite实现。将TouchableSprite设置为不吞噬消息即可。@H_197_8@
  4. @H_197_8@
  5. ~~~lua@H_197_8@
  6. --点击点击事件@H_197_8@
  7. localfunctionequip_touch_began_listener(sender,touch,event)@H_197_8@
  8. end@H_197_8@
  9. --点击结束事件@H_197_8@
  10. localfunctionequip_touch_ended_listener(sender,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> if@H_197_8@scroll_view:isTouchMoved()then@H_197_8@@H_197_8@
  11. return@H_197_8@@H_197_8@@H_197_8@
  12. --可以添加容错点击,如5个像素内。@H_197_8@
  13. localstart_pt=touch:getStartLOCATIOn()@H_197_8@
  14. localend_pt=touch:getLOCATIOn()@H_197_8@
  15. if@H_197_8@checkint(start_pt.X)==checkint(end_pt.X)andcheckint(start_pt.y)==checkint(end_pt.y)then@H_197_8@@H_197_8@
  16. print(sender.id_)@H_197_8@
  17. print("Readytoequip......"@H_197_8@)@H_197_8@@H_197_8@
  18. end@H_197_8@
  19. @H_197_8@
  20. --添加到ScrollView上可点击的图片@H_197_8@
  21. localsp=TouchableSprite.new@H_197_8@(@H_197_8@"data/equip.png"@H_197_8@,@H_197_8@@H_197_8@
  22. equip_touch_began_listener,@H_197_8@
  23. equip_touch_ended_listener,@H_197_8@
  24. false@H_197_8@)@H_197_8@@H_197_8@
  25. sp.id_=9999@H_197_8@
  26. scroll_view:addChild(sp)@H_197_8@
  27. ]]@H_197_8@
  28. localTouchableSprite=class@H_197_8@(@H_197_8@"TouchableSprite"@H_197_8@,function(pic_path)@H_197_8@@H_197_8@
  29. return@H_197_8@display.newSprite(pic_path)@H_197_8@@H_197_8@
  30. end)@H_197_8@
  31. TouchableSprite.__index=TouchableSprite@H_197_8@
  32. TouchableSprite.listener_=nil@H_197_8@
  33. TouchableSprite.swallowTouch_=true@H_197_8@@H_197_8@@H_197_8@
  34. TouchableSprite.fixedPriority_=0@H_197_8@
  35. TouchableSprite.useNodePriority_=false@H_197_8@@H_197_8@@H_197_8@
  36. TouchableSprite.removeListenerOnTouchEnded_=false@H_197_8@@H_197_8@@H_197_8@
  37. TouchableSprite.touch_began_listener_=nil@H_197_8@
  38. TouchableSprite.touch_ended_listener_=nil@H_197_8@
  39. --[[@H_197_8@
  40. 构造一个可响应点击事件的TouchableSprite。@H_197_8@
  41. ~~~lua@H_197_8@
  42. --监听器有三个参数,第一个参数是自己@H_197_8@
  43. localfunctiontouch_began_listener(sender,event)@H_197_8@
  44. localfunctiontouch_ended_listener(sender,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> localstart_pt=touch:getStartLOCATIOn()@H_197_8@
  45. localend_pt=touch:getLOCATIOn()@H_197_8@
  46. if@H_197_8@checkint(start_pt.X)==checkint(end_pt.X)andcheckint(start_pt.y)==checkint(end_pt.y)then@H_197_8@@H_197_8@
  47. print(sender.id_)@H_197_8@
  48. print("Readytoequip......"@H_197_8@)@H_197_8@@H_197_8@
  49. equip_touch_ended_listener)@H_197_8@
  50. sp:setTexture("data/equip1.png"@H_197_8@)@H_197_8@@H_197_8@
  51. sp:setPriority(1)@H_197_8@
  52. parent:addChild(sp)@H_197_8@
  53. @paramStringpic_path传入图片路径.可为空,后通过:setTexture("pic_path"@H_197_8@)重新设置@H_197_8@@H_197_8@
  54. @paramtouch_began_listener点击开始事件的监听器。为空时不响应。监听器有三个参数,第一个参数是可点击图片自己@H_197_8@
  55. @paramtouch_ended_listener点击结束时事件监听器。为空时不响应。监听器有三个参数,第一个参数是可点击图片自己@H_197_8@
  56. @paramswallow_touch是否吞噬事件true@H_197_8@事件不再向下传递@H_197_8@false@H_197_8@响应完事件后,继续向下传递@H_197_8@@H_197_8@
  57. functionTouchableSprite:ctor(pic_path,touch_began_listener,touch_ended_listener,swallow_touch)@H_197_8@
  58. self.touch_began_listener_=touch_began_listener@H_197_8@
  59. self.touch_ended_listener_=touch_ended_listener@H_197_8@
  60. self.swallowTouch_=swallow_touch@H_197_8@
  61. localfunctiononNodeEvent(event)@H_197_8@
  62. if@H_197_8@event==@H_197_8@"enter"@H_197_8@then@H_197_8@@H_197_8@
  63. self:onEnter()@H_197_8@
  64. elseifevent=="exit"@H_197_8@then@H_197_8@@H_197_8@
  65. self:onExit()@H_197_8@
  66. self:registerScriptHandler(onNodeEvent)@H_197_8@
  67. functionTouchableSprite:setTouchBeganListener(touch_began_listener)@H_197_8@
  68. functionTouchableSprite:setTouchEndedListener(touch_ended_listener)@H_197_8@
  69. self.touch_ended_listener_=touch_ended_listener@H_197_8@
  70. functionTouchableSprite:onEnter()@H_197_8@
  71. localeventDispatcher=self:getEventDispatcher()@H_197_8@
  72. localfunctiononTouchBegan(touch,248)"> localLOCATIOnInNode=self:convertToNodeSpace(touch:getLOCATIOn())@H_197_8@
  73. locals=self:getContentSize()@H_197_8@
  74. localrect=cc.rect(0,s.width,s.height)@H_197_8@
  75. if@H_197_8@cc.rectContainsPoint(rect,LOCATIOnInNodE)then@H_197_8@@H_197_8@
  76. if@H_197_8@self.touch_began_listener_then@H_197_8@@H_197_8@
  77. self:touch_began_listener_(self,153); font-weight:bold; BACkground-color:inherit">return@H_197_8@@H_197_8@true@H_197_8@@H_197_8@@H_197_8@
  78. localfunctiononTouchMoved(touch,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> localfunctiononTouchEnded(touch,248)"> print("onTouchEnded......."@H_197_8@)@H_197_8@@H_197_8@
  79. if@H_197_8@self.touch_ended_listener_then@H_197_8@@H_197_8@
  80. self:touch_ended_listener_(self,153); font-weight:bold; BACkground-color:inherit">if@H_197_8@self.removeListenerOnTouchEnded_then@H_197_8@@H_197_8@
  81. eventDispatcher:removeEventListener(self.listener_)@H_197_8@
  82. locallistener=cc.EventListenerTouchOneByOne:create()@H_197_8@
  83. self.listener_=listener@H_197_8@
  84. listener:setSwallowTouches(self.swallowTouch_)@H_197_8@
  85. listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN)@H_197_8@
  86. listener:registerScriptHandler(onTouchMoved,cc.Handler.EVENT_TOUCH_MOVED)@H_197_8@
  87. listener:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED)@H_197_8@
  88. if@H_197_8@0==self.fixedPriority_then@H_197_8@@H_197_8@
  89. eventDispatcher:addEventListenerWithSceneGraphpriority(listener,self)@H_197_8@
  90. else@H_197_8@@H_197_8@@H_197_8@
  91. eventDispatcher:addEventListenerWithFixedPriority(listener,self.fixedPriority_)@H_197_8@
  92. functionTouchableSprite:setSwalllowTouch(swallow)@H_197_8@
  93. self.swallowTouch_=swallow@H_197_8@
  94. functionTouchableSprite:onExit()@H_197_8@
  95. localeventDispatcher=self:getEventDispatcher()@H_197_8@
  96. eventDispatcher:removeEventListener(self.listener_)@H_197_8@
  97. functionTouchableSprite:setPriority(fixedPriority)@H_197_8@
  98. self.fixedPriority_=fixedPriority@H_197_8@
  99. self.useNodePriority_= functionTouchableSprite:removeListenerOnTouchEnded(toRemovE)@H_197_8@
  100. self.removeListenerOnTouchEnded_=toRemove@H_197_8@
  101. functionTouchableSprite:setPriorityWithNode(useNodePriority)@H_197_8@
  102. self.fixedPriority_=0@H_197_8@
  103. self.useNodePriority_=useNodePriority@H_197_8@
  104. return@H_197_8@TouchableSprite@H_197_8@@H_197_8@
原文请看:http://blog.csdn.net/teng_ontheway/article/details/39528037

大佬总结

以上是大佬教程为你收集整理的【cocos2d-x3.2游戏开发】 模态对话框拦截所有事件全部内容,希望文章能够帮你解决【cocos2d-x3.2游戏开发】 模态对话框拦截所有事件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。