欢迎加入Cocos2d-x 交流群:193411763
转载时请注明原文出处 http://blog.csdn.net/u012945598
一个手机游戏,不会没有触屏事件,比如我们玩的捕鱼达人游戏,在点击屏幕某一个位置后,炮弹变回打向那个位置,这就是通过触屏事件来实现的。
Cocos2d-x中,最简单的触屏实现方法就是通过CCLayer的TouchEnable属性开启或者关闭接收触屏事件。(此时的类一定是继承CCLayer的,如 class HelloWorld : publiccocos2d::CCLayer)
以下事件被称为标准触摸(standard touch)事件
以上四种方法中,都含有两个参数,pTouches是一个CCTouch对象的集合(CCTouch表示一个触摸点),包含了当前触摸事件中的所有触摸点.pEvent参数是老的引擎版本留下的形参,在当前版本中并无意义.
此时我们将四种方法写到.h文件中声明,若要真正触发四个函数,还需要开启CCLayer的TouchEnable属性,我们可以在.cpp文件的init()方法中加上如下代码:
this->setTouchEnable(true);
完成后上述操作后,我们在.cpp文件中添加四种方法的实现部分
可以看到运行项目后,在屏幕上点击屏幕会触发ccTouchBegan ,移动时会触发ccTouchMoved, 手指离开后触发ccTouchEnded事件。
如果想要获取到触摸点的坐标,我们可以在ccTouchesBegan函数内添加如下代码:
CCTouch * touch=(CCTouch *)pTouches->anyObject();
CCPoint p1=touch->getLocation(); //获取单击坐标,该坐标是基于3D的
CCPoint p2=touch->getLocationInView(); //获取单击坐标,该坐标基于2D 以左上角为原点
CCPoint p3=CCDirector::sharedDirector()->convertToUI(pos2) //获取基于2d-x的坐标,也就是笛卡尔坐标
此时我们所使用的便是CCLayer的标准触摸事件,这个函数会使每一个CCLayer都能获取到屏幕事件,但是我们有时候并不希望层上面的所有对象都能接收到我们的事件,比如游戏中的一些选项按钮,我们在触摸它们的时候要保证不能对其他的层产生影响,即点击了人物状态按钮,不能让物品栏也同时弹出来。这个时候我们就需要用到一种带目标的触摸事件(targeted touch)机制,通俗来说,这种触摸方式就是一个CCLayer的垄,我们来看一下它们的代码:
我们可以观察到与之前的标准触摸函数不一样的地方
第一,开始触摸函数的返回值变成了bool,表示声明是否要捕捉这个触摸点,只有在此方法中捕捉到的触摸点才会继续引发其他三个事件,否则其他三个事件会被忽略. 当这个函数的返回值为 true时,其他方法都可以被调用,当返回值为false时,所有的标准屏幕事件函数会被调用.
第二,函数的名称由之前的ccTouchesBegan变成了ccTouchBegan
第三,第一个参数变成了pTouch,其实就是单数和复数的区别.pTouch一次只能传入一个触摸点
然而想要注册屏幕监听事件我们还需要重写一个函数(如果不重写该函数则默认的是注册标准屏幕监听事件)
virtualvoid registerWithTouchDispatcher(void);
CCLayer::registerWithTouchDispatcher();相当于调用了父类CCLayer的registerWithTouchDispatch函数,作用是注册标准屏幕事件监听,这个函数会执行一段代码:pDispatcher->addStandardDelegate(this,0);
最后一行代码的意思是实现一个CCTargetedTouchDelegate接口,把对象注册到分发器中。
前两个参数第一个表示触摸接收对象,第二个表示优先级,值越小越优先,可以为负数。第三个参数表示是否“吞噬”一个触摸,如果为真,那么一个触摸一旦被捕捉,所有优先级更低的接收对象都无法接收到触摸。
实际上游戏中的每一个元素都可以实现触摸,只不过CCLayer为我们提供了现成的API