Cocos2D-X 渲染框架之导演和场景

Cocos2D-X引擎是基于OpenGLES渲染来完成游戏画面的绘制。不过这些引擎底层的东西就跟我们没什么关系了。引擎为开发者提供了灵活自如、简单易用的渲染框架。他几乎能够应对所有类型游戏的绘制需求。如前面所说,整个渲染框架的根源就是【CCNode】的这个类。


       (上图为Cocos2D-X引擎的渲染框架)

Cocos2D-X引擎将游戏画面按照层次细分为上图内容。游戏画面是由导演来控制的,然后通过不同的场景来组合。每个场景又分为不同的层次(途中的各种布景),层次中又包含许多精灵对象,就这样一层又一层。由此引擎就构成了整个游戏的画面,其中包含了四个概念:导演、场景、层次和精灵。它们对应了引擎的四个类(重点**):【CCDirector】、【CCScene】、【CCLayer】和【CCSprite】。

从游戏角度,一个游戏产品,只存在一个导演对象,他来负责这个游戏场景的切换以及游戏流程。游戏中存在多个被导演管理的场景。每个场景代表了游戏的一种状态,在这个状态会显示对应的界面。这边是编译原理的有限机。比如:菜单场景、游戏场景和结束场景等。

在场景中,游戏画面被分为了多个层次。层次是比场景低一等级的显示画面。它们可以彼此互相包含,也可以同时处于一个场景之中。在层次中,就是要用于表现游戏物体的精灵。精灵这个概念就不做详细描述了。。

导演类,【CCDirector】类,是引擎渲染框架的指挥者。导演对象负责创建、管理应用程序或者游戏的主窗口,在特定的条件下显示执行某个场景。在代码中导演是一个单例对象。

下面是导演类的使用方法:(在第一篇文章中提到过)

 // initialize director 初始化导演,通过sharedDirector()来获得导演类的单例对象

   CCDirector *pDirector=CCDirector::sharedDirector();

   //设置场景窗口,为了显示内容,通过sharedOpenGLView来获得一个窗口来显示游戏内容,将游戏的sharedOpenGLView对象传递给导演,这个过程相当于把摄像机交给了导演,之后拍什么就和摄像机有关的操作,都由导演来负责。

   pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());

//开启FPS,注释:每秒传输帧数(Frames PerSecond

   pDirector->setDisplayStats(true);

   // set FPS. the defaultvalue is 1.0/60 if you don't call this

   pDirector->setAnimationInterval(1.0 / 60);//设置刷新率

 

   // create a scene. it's anautorelease object,创建场景

   CCScene *pScene =HelloWorld::scene();

 

   // run,运行场景pScene,通过导演来运行场景

   pDirector->runWithScene(pScene);

导演类中与场景有关的函数:

voidCCDirector::runWithScene(CCScene *pScene)//运行下一个场景

voidCCDirector::pushScene(CCScene *pScene)//压入当前活动场景,使其进入等待状态

voidCCDirector::popScene(void)//从队列顶端弹出场景对象

voidCCDirector::popToRootScene(void)//替换新的场景对象

voidCCDirector::end()//暂停运行的场景

voidCCDirector::resume(void)//恢复运行

voidCCDirector::drawScene(void)//绘制场景内容

CCDirector的源代码中,runningScene_标识正在显示的场景,nextScene表示下一个将要显示的场景。而用于存储场景队列的对象则使用一个动态可变数组scenesStack_来实现。

下面来总结导演类的主要作用:

·管理、显示场景

·持有Cocos2D-X引擎的配置细节

·维持于设备窗口、OpenGL视窗对象的联系

·反馈来自操作系统中应用响应。比如暂停、恢复和结束。

·引擎世界和OpenGL之间进行转换坐标。

场景类【CCScene

  被导演持有的场景对象,是第一个包含游戏内容的层次。但是就其本身来说,并不包含任何实际的绘制内容。就是简单的把场景看做引擎中游戏画面划分的一个重要的容器,场景通常不包含游戏逻辑,仅仅是作为一个容器,将不同层组合到一起而最终给玩家呈现出一个完整的画面,它往往代表的是一种状态(游戏界面,菜单界面,商店界面等,所以说场景切换来实现游戏状态的跳转),包含的图层是更小一级的容器。图层包含了游戏逻辑、用户响应以及精灵对象【CCSprite】。

//HelloWorldScene.cpp的场景类中

CCScene*HelloWorld::scene()

{

   // 'scene' is an autorelease object,创建一个场景雷,此对象会自动释放的

   CCScene *scene =CCScene::create();

   

   // 'layer' is an autorelease object,创建一个层次对象,同上也会自动释放

   HelloWorld *layer =HelloWorld::create();

 

   // add layer as a child to scene,将层次添加到场景中

   scene->addChild(layer);

 

   // return the scene

   return scene;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cocos2d-x实现流光效果可以使用shader来进行渲染。首先,我们需要创建一个自定义的shader,并将其应用于需要实现流光效果的节点上。 在使用Cocos2d-x的过程,我们可以使用GLSL语言编写shader代码。在实现流光效果的shader,我们可以通过改变像素的颜色和透明度来创建流动的效果。 首先,我们定义一个uniform变量time,用于控制流光的移动速度。然后,在片段着色器,通过改变颜色和透明度的计算公式来实现流动的效果。我们可以使用sin函数或者其他数学函数来计算出每个像素点的颜色和透明度,然后将其应用到节点上。 在节点的渲染流程,我们将这个自定义的shader应用到节点上,然后传入时间参数,即更新uniform变量time的值。随着时间的增加,我们就可以看到节点上的流光效果在不断地移动。 为了实现更加逼真的流光效果,我们可以尝试给流光添加一些额外的效果,比如模糊、叠加等。通过调整shader代码的计算公式和传入的参数,我们可以根据自己的需求来调整流光效果的强度和样式。 总结起来,在Cocos2d-x实现流光效果需要创建一个自定义的shader,并将其应用于需要实现效果的节点上。通过改变颜色和透明度的计算公式、传入时间参数等,我们可以实现一个流光效果,使节点看起来具有流动的动画效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值