解析Quick-Cocos2d-x中自定义事件

前端之家收集整理的这篇文章主要介绍了解析Quick-Cocos2d-x中自定义事件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Quick-Cocos2d-x中的事件机制在官方的文档中已经讲解得很清楚了,查看这里

这些方法能处理绝大多数的事件,但如果要实现自定义的事件(例如我们自己实现一个类,对该类添加自定义的事件处理)就需要对类进行扩展了。


下面讲讲如何使用自定义(扩展)的事件机制。


首先认识一下类EventProxy,就是这个类实现了自定义的消息处理

该类有四个函数,分别是:

  • addEventListener

  • removeEventListener

  • removeAllEventListenersForEvent

  • removeAllEventListeners

根据名字就能知道这几个函数的作用。


下面以我们定义一个继承自Node的类来了解自定义事件的处理方法

定义类EXNode如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
localEXNode=@H_403_118@ class@H_403_118@ (@H_403_118@ "EXNode"@H_403_118@ ,function()@H_403_118@
@H_403_118@ return@H_403_118@ display.newNode()@H_403_118@
end)@H_403_118@
@H_403_118@
functionEXNode:ctor()@H_403_118@
@H_403_118@ cc.GameObject.extend(self):addComponent(@H_403_118@ "components.behavior.EventProtocol"@H_403_118@ ):exportMethods()@H_403_118@
@H_403_118@
@H_403_118@ cc.ui.UIPushButton.@H_403_118@ new@H_403_118@ ({normal=@H_403_118@ "button/button_normal.png"@H_403_118@ ,pressed=@H_403_118@ "button/button_selected.png"@H_403_118@ })@H_403_118@
@H_403_118@ :align(display.CENTER,display.cx,display.cy)@H_403_118@
@H_403_118@ :onButtonClicked(function()@H_403_118@
@H_403_118@ self:getChildEvent()@H_403_118@
@H_403_118@ end)@H_403_118@
@H_403_118@ :addTo(self)@H_403_118@
end@H_403_118@
@H_403_118@
functionEXNode:getChildEvent()@H_403_118@
@H_403_118@ self:dispatchEvent({name=@H_403_118@ "MY_NEWS"@H_403_118@ })@H_403_118@
end@H_403_118@
@H_403_118@
functionEXNode:onEnter()@H_403_118@
@H_403_118@ self:setTouchEnabled(@H_403_118@ true@H_403_118@ )@H_403_118@
end@H_403_118@
@H_403_118@
functionEXNode:onExit()@H_403_118@
@H_403_118@ self:removeAllEventListeners()@H_403_118@
end@H_403_118@
@H_403_118@
return@H_403_118@ EXNode@H_403_118@

最重要的是这句

1
cc.GameObject.extend(self):addComponent(@H_403_118@ "components.behavior.EventProtocol"@H_403_118@ ):exportMethods()@H_403_118@

该句为EXNode类添加了扩展的事件处理方法,现在我们可以使用EventProxy中的函数了,通过这些函数我们可以让EXNode接收到自定义的消息然后进行处理。

在该类中我们创建一个按钮,用按钮来模拟我们游戏中的某些操作,当按钮按下的时候发送消息给其父节点EXNode,我们将该自定义的消息名字设置为MY_NEWS。


我们在Scene中使用EXNode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
localEXNode=import(@H_403_118@ "..class.EXNode"@H_403_118@ )@H_403_118@
@H_403_118@
localEventScene=@H_403_118@ class@H_403_118@ (@H_403_118@ "EventScene"@H_403_118@ ,function()@H_403_118@
@H_403_118@ return@H_403_118@ display.newScene(@H_403_118@ "EventScene"@H_403_118@ )@H_403_118@
end)@H_403_118@
@H_403_118@
functionEventScene:ctor()@H_403_118@
@H_403_118@ self.exNode=EXNode.@H_403_118@ new@H_403_118@ ()@H_403_118@
@H_403_118@ self.exNode:addEventListener(@H_403_118@ "MY_NEWS"@H_403_118@ ,handler(self,self.onMynews))@H_403_118@
@H_403_118@ self:addChild(self.exNode)@H_403_118@
end@H_403_118@
@H_403_118@
functionEventScene:onMynews()@H_403_118@
@H_403_118@ printLog(@H_403_118@ "INFO"@H_403_118@ ,@H_403_118@ "父Node知道了子Node发送过来的消息"@H_403_118@ )@H_403_118@
end@H_403_118@
@H_403_118@
functionEventScene:onEnter()@H_403_118@
end@H_403_118@
@H_403_118@
functionEventScene:onExit()@H_403_118@
end@H_403_118@
@H_403_118@
return@H_403_118@ EventScene@H_403_118@

在EventScene中创建一个EXNode对象,

1
self.exNode:addEventListener(@H_403_118@ "MY_NEWS"@H_403_118@ ,self.onMynews));@H_403_118@

让exNode对象监听自定义的事件,从这句可以看到我们监听的事件信息名称为MY_NEWS(即EXNode中按钮点击后发送的自定义消息),回调函数为EventScene的onMynews函数


测试程序,点击按钮模拟游戏操作,在EXNode内部分发出名称为MY_NEWS的消息,之后exNode对象就能够接收到消息,然后调用回调函数onMynews进行处理了。


来源网址:http://www.cocoachina.com/bbs/read.php?tid=235255

猜你在找的Cocos2d-x相关文章