Cocos2d-x教程(3)-初识触屏事件

来源:互联网 发布:c语言中for与while 编辑:程序博客网 时间:2024/05/14 10:32

一个手机游戏,不会没有触屏事件,比如我们玩的捕鱼达人游戏,在点击屏幕某一个位置后,炮弹变回打向那个位置,这就是通过触屏事件来实现的。

     Cocos2d-x中,最简单的触屏实现方法就是通过CCLayer的TouchEnable属性开启或者关闭接收触屏事件。(此时的类一定是继承CCLayer的,如 classHelloWorld : 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

0 0
原创粉丝点击