从头开始学cocos2dx笔记之七(TestCpp之controler)

TestController这个类继承自CCLayer,因此可以通过addChild函数增加各类菜单对象。在构造函数中,可以看到,类首先创建了右上角的关闭按钮,然后创造中间竖排的菜单组。代码:

CCMenuItemImage *pCloseItem = CCMenuItemImage::create(s_pPathClose, s_pPathClose, this, menu_selector(TestController::closeCallback) );

的作用是创建了一个图片菜单对象,但有意思的是这个对象不能单独使用,需要再创建一个CCMenu对象才能正确使用:
    CCMenu* pMenu =CCMenu::create(pCloseItem, NULL);

再往下看,程序通过1个循环,创建了多个CCLabelTTF对象,然后把这些对象都通过addChild函数,加入到一个CCMenu对象中。从这里可以看出,CCMenu是一个容器,包含多个菜单项。

观察一下CCMenuItemImage::create()函数的参数,前2个参数为字符串,指向在普通和被选择状态下的资源图片的路径,而最后一个参数则是一个选择器,即设置了该按钮的回调函数。这个字符串参数是一个C风格的字符串,没有用string。

CCLabelTTF::create()这个函数的参数是需要显示的字体、字符集名以及字体大小。这也是一个很强大的UI。

注意addChild()这个函数,第2个参数为zOrder,可有可无,但TestCpp显然没有把这个值当成zOrder的本意来用:用一个小技巧来分辨是点击了哪个Lable。

setTouchEnabled(true);这句代码开启接受触摸输入。

TestController通过重载处理了2个事件:ccTouchesBegan和ccTouchesMoved。

ccTouchesBegan 这个函数记录了初始触摸的位置,在ccTouchesMoved函数中,程序计算在Y方向移动的位移,然后根据位移计算并设置包含LABELs的CCmenu位置,从而实现整个菜单的移动效果。这大概也是为什么需要创建2个CCMenu,没有必要让close和其他菜单项共同移动。

那有个疑问是,cocos2dx究竟有那些触摸输入的接口呢?推荐看这篇文章:http://blog.csdn.net/ym19860303/article/details/8477567

显然,TestController偷懒,把2个不怎么用的触摸事件没有进行定义。。需要注意的是TestController里面没有涉及消息分发等函数,也没有处理类似点击之类的事件,就可以实现类似点击菜单的效果,因此,这部分的工作应该由引擎帮我们的完成了,我们只需要写一些特殊的事件处理代码并注册好回调函数就可以了。比方说TestController,2个重载函数的处理核心就是实现触摸移动时的菜单移动效果。

接下来再看看菜单组建的回调函数。

关闭按钮比较简单,CCDirector::sharedDirector()->end();这个函数用于结束整个程序。

在各个LABLE的回调函数中,我们注意到,程序利用ZOrder来判断点击了哪个Lable,然后创建对应的Scene,进入相关的场景。

那么,接下来就看看具体每个测试场景,都告诉了我们程序什么样的功能。

你可能感兴趣的:(从头开始学cocos2dx笔记之七(TestCpp之controler))