cocos2d-x知识巩固-基础篇(2)

       上一篇博客介绍了整个cocos2dx引擎需要掌握的各个模块,每一个模块实际上往深了研究都有难点,后面我会详细地去分析它的用法。今天我们从第一个模块说起,即渲染模块。首先,为了理解,我们做个类比,说明该模块中几个类之间的关系:

       如果把一个游戏项目的开发比作一部电影的制作的话,那么导演(CCDirector类)的作用也就不言而喻,它控制整个游戏的良好运行。导演可以决定这部电影的拍摄场景(CCScene类),比如说在北京,场景可能会根据需要进行转移,因此场景可能会有多个,但同一时刻只能在一个地方。地点确定好了,就要选址,搭建摄影棚,也就是拍摄场地(CCLayer类),然后就是演员们(CCSprite类)的表演了,这样就完成了一部电影的拍摄过程,但是别忘了后期制作,比如需要给电影加上字幕(CCLabel类)等,那么菜单呢,可以理解为开头的介绍,比如主演:xx 导演:xx 。说道这里我想大家都能理解透彻了。下面简单介绍用法:

       导演类:CCDirector

      它是一个单例,在整个游戏运行期间只实例化一次,维护一个实例对象

CCDirector* pDirector = CCDirector::sharedDirector();//拿到导演类的实例
CCScene *pScene = HelloWorld::scene();//创建一个场景
pDirector->runWithScene(pScene);//运行这个场景法国风格
pDirector->replaceScene(pScene1);//替换到pScene1场景
pDirector->pause;//暂停当前场景
pDirector->resume;//恢复当前场景
pDirector->end;//结束执行,释放当前场景


       场景类:CCScene
      可以理解为一个容器,就像剧院一样,在剧院中搭建舞台(即CCLayer)上演节目。一个场景中可以有多个层CCLayer,我们可以通过层的Z轴标记或者层的名字来找到这个层对象。场景可以做特效,即不同场景进行切换时的效果,比如淡进淡出、百叶窗、旋转缩小等。
刚开始的时候对层和场景可能会有点蒙,主要是因为项目自带的这个HelloWorldScene(有的是HelloWorldLayer)搞得鬼,实际上我们不是那么用的,实际项目中一般不写“static CCScene* scene();”这个方法。我们一般需要场景的时候直接创建一个自定义的场景类,继承CCScene,在任何需要切换场景的地方,创建我们自定义的场景类,并由导演类来切换场景:
//在代码中的任何地方切换场景,并添加场景的切换特效
MyScene* myScene = MyScene::scene();//创建自定义的场景
CCTransitionRotoZoom* tScene = CCTransitionRotoZoom::create(3.0f,myScene);//创建特效过度场景,它是场景的子类,3秒内以特效的形式过渡到myScene场景
CCDirector::sharedDirector()->replaceScene(pTranslateScene);//只能由导演来切换场景,可以再任何地方调用


       图层类:CCLayer
      个人理解就是做画面渲染的,好比画家手中的画板,我们可以在上面涂鸦,添加精灵。现在的游戏通常至少要分三个层,例如一个简单的主菜单画面:

       这三个层互相叠加,他们在Z轴上的坐标不同,实际上就是addChild(layer,5)中数字的标记,值越大越靠近屏幕外侧,也就是最外层。上图BackgroundLayer层号为0,AnimationLayer层号为1,MenuLayer层号为2,最靠外。图层的顺序决定了渲染的次序和交互信息传递(即用户响应)的顺序,这涉及到触摸和重力加速计的知识点,后面会单独拿出来讲。
       层--最重要的就是能够“接受用户操作”,除此之外还可以填充游戏背景颜色等。通常我们创建一个类,继承CCLayer,并添加“virtual bool init()”方法进行初始化,并在其中添加新的内容,实现我们的功能。
--init()方法内部必须调用父类的init()方法做初始化工作--
注:virtual关键字声明虚函数,就是说,如果以后扩展了子类,子类重写这个init()方法,那么运行时子类对象执行的是子类的init()方法,屏蔽掉父类的init()方法,其他方法同理。

       精灵类:CCSprite
      本质上,就是一张2d图片,但是难点还是很多的,比如锚点(CCAnchorPoint)和位置(CCPosition)的区别,精灵帧动画的三种方式,还有使用cocoStudio编辑器做骨骼动画等,这些都会单独拿出来去讲,我们先介绍精灵的用法,再解释一下锚点和位置:
CCSprite* sprite = CCSprite::create("Imanges/car.png");//参数为项目Resources目录下开始的图片路径,需要带后缀.png .jpg .....
sprite->setPosition(ccp(240,160));//ccp 即 CCPointMake( , )
addChild(sprite,2);//添加进层中

//常用的属性操作
sprite->setScale(0.5,0.5);//精灵缩放,参数为:x轴缩放系数,y轴缩放系数
sprite->setVisible(true);//默认为true,可见,false时隐藏,但没有移除
sprite->setOpacity(0.5);//设置透明度:0-1
sprite->setRotation(180);//设置旋转角度0-360


      锚点和位置的区别:

      首先,要区别精灵和图片,实际上精灵只是层中的一个点而已,这个点就是精灵的位置(position),如果不给它附上图片的话,它就是一个点,图片让它有了可视化的形象,由于图片肯定不是一个点,而是一个矩形的框,那么给精灵附加图片的时候,该把图片的哪个位置放到精灵的位置(position)上呢,这就是锚点的作用,设置锚点(anchorPoint)实际上是更改了图片的中心点,默认的时候中心点在图片的中间,锚点是(0.5,0.5):也就是说图片的中心点是通过anchorPoint来设置。
      设图片宽为W = 100 ,高 为 H = 200 :设置中心点时坐标系以图片的左下角为原点画坐标系
      当anchorPoint为(0,0):图片的中心点在(100 * 0,200 * 0)处,这只是图片的中心点,千万记住
      当anchorPoint为(0.5,0.5):图片的中心点在(100 * 0.5,200 * 0.5)处;也就是视觉上的图片中心
      当anchorPoint为(1,1):图片的中心点在(100 * 1,200 * 1)处;

      锚点理解了,就好办了,实际上给精灵附加上图片以后,就是图片的锚点位置(图中红圈的地方)放在精灵的position位置处。但是实践经验上来说,尽量能不改锚点就不改锚点,因为貌似复杂情况会出问题,之前就是不同电脑显示不一样。

      文字类:CCLabel
比较简单,不想多说,给一个链接:点击打开链接-CCLabel,有时间回来补充。

      菜单类:CCMenu
创建一个菜单的思路很简单,首先得有菜单项,然后基于菜单项创建菜单,菜单项要能点击,因此还要添加事件的监听回调函数。由于菜单项可以是多种多样的,因此,引擎提供了多种创建菜单项的类,直接看代码:
CCMenuItemLabel* item_lb = CCMenuItemLabel::create( myLabel,this,menu_selector(ThisClass::itemCallBack) );//使用label创建一个菜单项
CCMenuItemFont* item_ft = CCMenuItemFont::create( “Start”,this,menu_selector(ThisClass::itemCallBack) );//使用字符串创建一个菜单项
CCMenuItemSprite* item_sp = CCMenuItemLabel::create( normalSprite,selectedSprite,disabledSprite,this,menu_selector(ThisClass::itemCallBack) );//使用sprite创建一个菜单项
//上面的crete函数有多个,可以参考其他的参数列表,如果选择较短参数列表的create函数,那就必须在外边手动指定其他参数,
//如item_lb->setTarget(this,menu_selector(ThisClass::itemCallBack));
CCMenuItemImage* item_ig = CCMenuItemImage::create("normalImage","selectedImage","disabledImage");
item_ig->setTarget(this,menu_selector(ThisClass::itemCallBack));

CCMenu* menu = CCMenu::create(item_lb,item_ft,item_sp,item_ig,NULL);//最后的NULL结束标记不能少,否则报错
menu->alignItemsVertically();//设置对齐方式,若不设置,则会重叠

      

        渲染框架大体介绍这些,好多细节的难点会在后面单独研究,基础部分也就这些吧,其他的稍有难度,下一篇开始进阶吧。
     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值