cctouchbegan怎么用?这几个功能你一定要知道!

吉云

今天搞搞 Cocos2d-x 里面的触摸事件,主要是想弄明白这个 cctouchbegan 到底是怎么回事。一开始看那些官方文档,感觉云里雾里的,还是自己动手试一下比较实在。

我得让我的这个层(Layer)能够响应触摸事件?所以我就得先在 init 方法里面动动手脚。我记得是要创建一个触摸事件监听器,然后把它添加到事件分发器里面。大概就是下面这样:

cctouchbegan怎么用?这几个功能你一定要知道!

auto listener = EventListenerTouchOneByOne::create();

listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

cctouchbegan怎么用?这几个功能你一定要知道!

这里面,EventListenerTouchOneByOne 表示一次只处理一个触摸点,应该比较符合我现在的需求。然后 onTouchBegan 属性,我把它设置成我自己的一个函数 HelloWorld::onTouchBeganCC_CALLBACK_2 是个宏,我猜是用来绑定成员函数的,反正照着例子写就行。_eventDispatcher 把这个监听器给加上,我的层应该就能响应触摸。

然后,我就得实现我自己的那个 onTouchBegan 函数:


bool HelloWorld::onTouchBegan(Touch touch, Event event)

cctouchbegan怎么用?这几个功能你一定要知道!

Vec2 location = touch->getLocation();

CCLOG("手指头按到屏幕上,位置在 x=%f, y=%f", location.x, location.y);

return true;

cctouchbegan怎么用?这几个功能你一定要知道!

这个函数有两个参数,一个是 Touch 类型的指针,应该是代表触摸点的信息,另一个是 Event 类型的指针,我暂时没用到。在函数里面,我用 getLocation() 拿到触摸点的位置,然后用 CCLOG 把它打印出来。我返回 true。这里返回 true 很重要,它告诉系统,这个触摸事件我处理,你别再给别人。要不然,可能别的层或者精灵也会响应这个触摸,那就乱套。

我运行一下,果然,每次我用手指头点屏幕,控制台都会打印出我触摸的位置。成!

后来我又试试拖动。我想着既然 cctouchbegan 是触摸开始,那肯定还有触摸移动和触摸结束之类的?果然,我找到 cctouchmovedcctouchended。我把它们也加到监听器里面,然后在对应的函数里打印一下触摸位置。这下,我手指头在屏幕上划来划去,控制台就哗地打印出一堆坐标,看着还挺有成就感的。

我还发现一个小坑。如果我在 cctouchbegan 里面返回 false,那后面的 cctouchmovedcctouchended 就都不会被调用。也就是说,如果你不在 cctouchbegan 里认领这个触摸事件,那后面就跟你没关系。

今天就先搞到这里,感觉对 Cocos2d-x 的触摸事件处理有点感觉。以后再试试更复杂的,比如多点触控什么的。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]