今天搞搞 Cocos2d-x 里面的触摸事件,主要是想弄明白这个 cctouchbegan
到底是怎么回事。一开始看那些官方文档,感觉云里雾里的,还是自己动手试一下比较实在。
我得让我的这个层(Layer)能够响应触摸事件?所以我就得先在 init
方法里面动动手脚。我记得是要创建一个触摸事件监听器,然后把它添加到事件分发器里面。大概就是下面这样:
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
这里面,EventListenerTouchOneByOne
表示一次只处理一个触摸点,应该比较符合我现在的需求。然后 onTouchBegan
属性,我把它设置成我自己的一个函数 HelloWorld::onTouchBegan
。CC_CALLBACK_2
是个宏,我猜是用来绑定成员函数的,反正照着例子写就行。_eventDispatcher
把这个监听器给加上,我的层应该就能响应触摸。
然后,我就得实现我自己的那个 onTouchBegan
函数:
bool HelloWorld::onTouchBegan(Touch touch, Event event)

Vec2 location = touch->getLocation();
CCLOG("手指头按到屏幕上,位置在 x=%f, y=%f", location.x, location.y);
return true;
这个函数有两个参数,一个是 Touch
类型的指针,应该是代表触摸点的信息,另一个是 Event
类型的指针,我暂时没用到。在函数里面,我用 getLocation()
拿到触摸点的位置,然后用 CCLOG
把它打印出来。我返回 true
。这里返回 true
很重要,它告诉系统,这个触摸事件我处理,你别再给别人。要不然,可能别的层或者精灵也会响应这个触摸,那就乱套。
我运行一下,果然,每次我用手指头点屏幕,控制台都会打印出我触摸的位置。成!
后来我又试试拖动。我想着既然 cctouchbegan
是触摸开始,那肯定还有触摸移动和触摸结束之类的?果然,我找到 cctouchmoved
和 cctouchended
。我把它们也加到监听器里面,然后在对应的函数里打印一下触摸位置。这下,我手指头在屏幕上划来划去,控制台就哗地打印出一堆坐标,看着还挺有成就感的。
我还发现一个小坑。如果我在 cctouchbegan
里面返回 false
,那后面的 cctouchmoved
和 cctouchended
就都不会被调用。也就是说,如果你不在 cctouchbegan
里认领这个触摸事件,那后面就跟你没关系。
今天就先搞到这里,感觉对 Cocos2d-x 的触摸事件处理有点感觉。以后再试试更复杂的,比如多点触控什么的。