【Cocos2d-X开发学习笔记】第07期:渲染框架之摄像机类(CCCamera)的使用

本系列学习教程使用的是cocos2d-x-2.1.4版本(截至目前为止最新稳定版) ,PC开发环境Windows7,C++开发环境VS2010  




一、摄像机类


     所有节点都拥有一个摄像机类CCCamera。只有通过摄像机类,节点才会被渲染出来。当节点发生缩放旋转和位置

化的时候,都需要覆盖CCCamera类,让这个节点通过CCCamera类重新渲染。


注意:CCNode类里有些方法可以实现缩放、旋转和位置变化,当使用摄像机类实现这些的时候,那些方法就不能同时使用了。使用摄像机类也不可以同时使用世界坐标了。


CCCamera类的继承关系如下图 所示。


      Cocos2D-X中的CCCamera类使用OpenGL的gluLookAt函数来设置位置。gluLookAt函数有三组关于坐标的参数,

其中“Eye”系列的x、y、z坐标参数是视角的位置,而“Center”系列的x、y、z坐标参数是所视目标的坐标位置,

“Up”系列的x、y、z坐标参数是摄像机方向的向量坐标。关于这三个参数,你可以理解为以“Eye”为起点,沿着

“Up”方向,朝着“Center”看。


注意 :这里需要说明的是,在三维效果中,使用CCCamera类是可以的,但是如果你只需要一些二维特效的话,那么更推荐跟随类CCFollow。跟随类CCFollow的相关知识,我们会在后面学习到。


CCCamera类的主要保护成员数据如下图所示。



CCCamera类的主要公共函数如下图所示。


 

二、实例:CCCamera类的使用

 

      CCCamera类可以实现节点对象的缩放旋转等,下面就让我们来实现摄像机类实现缩放的实例。

<1> 首先新建一个Cocos2D-X项目,然后在HelloWorldScene.h文件中添加如下代码所示。

[cpp]  view plain copy
  1. class HelloWorld : public cocos2d::CCLayer  
  2. {   
  3.     float    m_z;  
  4. public:  
  5.     // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone  
  6.     virtual bool init();    
  7.   
  8.     void update(float dt);  
  9.   
  10.     // there's no 'id' in cpp, so we recommand to return the exactly class pointer  
  11.     static cocos2d::CCScene* scene();  
  12.       
  13.     // a selector callback  
  14.     void menuCloseCallback(CCObject* pSender);  
  15.   
  16.     // implement the "static node()" method manually  
  17.     CREATE_FUNC(HelloWorld);  
  18. };  
  19.   
  20. #endif    

添加了一个成员变量m_z和一个成员函数update。

 

<2> 然后在HelloWorldScene.cpp文件的init函数中添加如下所示代码。

[cpp]  view plain copy
  1. bool HelloWorld::init()  
  2. {  
  3.     bool bRet = false;  
  4.     do   
  5.     {       
  6.         CC_BREAK_IF(! CCLayer::init());  
  7.   
  8.         // Create a "close" menu item with close icon, it's an auto release object.  
  9.         CCMenuItemImage *pCloseItem = CCMenuItemImage::create(  
  10.             "CloseNormal.png",  
  11.             "CloseSelected.png",  
  12.             this,  
  13.             menu_selector(HelloWorld::menuCloseCallback));  
  14.         CC_BREAK_IF(! pCloseItem);  
  15.   
  16.         // Place the menu item bottom-right conner.  
  17.         pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));  
  18.   
  19.         // Create a menu with the "close" menu item, it's an auto release object.  
  20.         CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);  
  21.         pMenu->setPosition(CCPointZero);  
  22.         CC_BREAK_IF(! pMenu);  
  23.   
  24.         // Add the menu to HelloWorld layer as a child layer.  
  25.         this->addChild(pMenu, 1);  
  26.   
  27.         CCSize s = CCDirector::sharedDirector()->getWinSize();  
  28.       
  29.         CCSprite *sprite;  
  30.         CCCamera *cam;  
  31.       
  32.         // LEFT  
  33.         sprite = CCSprite::create("grossini.png");  
  34.         addChild( sprite, 0);          
  35.         sprite->setPosition( ccp(s.width/4*1, s.height/2) );  
  36.         cam = sprite->getCamera();  
  37.         cam->setEyeXYZ(0, 0, 415/2);  
  38.         cam->setCenterXYZ(0, 0, 0);  
  39.       
  40.         // CENTER  
  41.         sprite = CCSprite::create("grossini.png");  
  42.         addChild( sprite, 0, 40);  
  43.         sprite->setPosition(ccp(s.width/4*2, s.height/2));  
  44.       
  45.         // RIGHT  
  46.         sprite = CCSprite::create("grossini.png");  
  47.         addChild( sprite, 0, 20);  
  48.         sprite->setPosition(ccp(s.width/4*3, s.height/2));  
  49.   
  50.         m_z = 0;  
  51.   
  52.         scheduleUpdate();  
  53.   
  54.         bRet = true;  
  55.     } while (0);  
  56.     return bRet;  
  57. }  


<3> 最后在update函数中添加如下所示代码。

[cpp]  view plain copy
  1. void HelloWorld::update(float dt)  
  2. {  
  3.     CCNode *sprite;  
  4.     CCCamera *cam;  
  5.       
  6.     m_z += dt * 100;  
  7.       
  8.     sprite = getChildByTag(20);  
  9.     //获得摄像机  
  10.     cam = sprite->getCamera();  
  11.     //设置z轴位置  
  12.     cam->setEyeXYZ(0, 0, m_z);  
  13.       
  14.     sprite = getChildByTag(40);  
  15.     cam = sprite->getCamera();  
  16.     cam->setEyeXYZ(0, 0, -m_z);      
  17. }  

      通过getCamera函数获得摄像机实例,并通过设置视角的z轴位置来实现缩放效果。需要再次强调的是:不推荐

使用摄像机实现二维特效,本实例只是一个使用的范例。

 

实例运行效果图。

 

实例源码下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值