Cocos2d-x 基本元素功能分析

本文介绍Cocos2d-x游戏引擎的核心组件,包括导演类CCDirector、场景类CCScene、层类CCLayer及精灵类CCSprite的作用与使用方法。详细解释了如何通过这些组件创建游戏场景,并介绍了节点树的组织方式、定时器机制以及场景切换的API。
CCDirector
导演类。
游戏呈现方面的设定,比如
1. 游戏的显示窗口
2. FPS显示
3. 默认帧率上限
4. 纹理颜色等。
5. 另外一个重要作用就是切换场景。

一段经典实例代码
bool AppDelegate::applicationDidFinishLaunching()
{
    CCDirector *pDirector = CCDirector::sharedDirector();
    pDirector->setOpenGLView(CCEGLView::sharedOpenGLView()); //1

    // enable High Resource Mode(2x, such as iphone4) and maintains low resource on other devices.
    // pDirector->enableRetinaDisplay(true);

    // turn on display FPS
    pDirector->setDisplayStats( true); //2

    // set FPS. the default value is 1.0/60 if you don't call this
    pDirector->setAnimationInterval(1.0 / 60); //3

    // create a scene. it's an autorelease object
    CCScene *pScene = GameScene::create();

    // run
    pDirector->runWithScene(pScene); //5

    return true;
}

切换场景的相关API

runWithScene( CCScene * scene )  首次启动场景
replaceScene( CCScene * scene )   用传入的场景替换当前场景,当前场景被释放
pushScene( CCScene * scene ) 将当前运行的场景暂停并压入执行场景栈中,再将传入的场景设置为当前运行场景
pause 暂停当前运行场景中所有计时器和动作,场景仍然会显示在屏幕上
resume 回复当前场景中的所有计时器和动作,和pause配合使用
end 结束场景,退出应用

CCScene
作为层的容器,它的作用主要为游戏流程控制服务

CCLayer
定义了一个层。 和场景不同的是,层通常表现的是直接呈现在屏幕上的具体内容:我们需要在层中放入精灵,文本标签,或者其他游戏元素。设置这些元素的属性。可见,游戏的大部分时间都用在创建层上。

添加层到场景
void addChild( CCNode * child );
void addChild( CCNode * child, int zOrder );
void addChild( CCNode * child, int zOrder, int tag );

CCLayer的另外一个功能就是可以接受用户输入事件,包括触摸,加速度器和键盘输入等。其实这是因为CCLayer继承了CCTouchDelegate, CCAccelerometerDelegate, CCKeypadDelegate。

CCSprite
代表了游戏中一个最小的可见单位,装载了一个平面纹理,具有丰富的表现力。可以通过多种方式加载。
如果说CCScene和CCLayer代表了宏观的游戏元素管理,那么CCSprite则为微观世界提供了丰富灵活的细节表现。

CCNode
Cocos2d-x把渲染树上的每一个游戏元素抽象为一个节点,就是CCNode一切游戏元素都继承自CCNode,因此它们具有CCNode提供的属性。
CCNode提供了一个可以绘制的通用属性,包括位置,缩放,是否可见,旋转角度等。节点类包含的功能有: 
1. 包含其他CCNode对象
2. 接受各种事件与回调函数,比如定时器事件
3. 运行动作

PS: Position设置的是锚点在父亲节点中坐标值,节点显示位置和锚点有关。其实,锚点改变的是它在其表面纹理上的位置。移动的是纹理表面。所以锚点是一个相对值在0~1之间。

节点树的组织方法是addChild方法
CCNode提供了一组接口来管理节点

addChild(CCNode * child)             把child添加到当前节点中
removeFromParentAndCleanup( bool cleanup ) 将当前节点从父节点删除,如果cleanup为true,则执行clean方法
removeChild( CCNode * child, bool cleanup ) 从当前节点中移除child,如果cleanup为true,则执行child的clean方法
removeChildByTag( int tag, bool cleanup ) 从当前节点中移除标号为tag的节点
removeAllChildrenWithCleanup( bool cleanup ) 移除当前节点的所有子节点 
getChildByTag( int tag ) 返回当前节点中标号为tag的子节点
cleanup 移除此节点的所有动作和计时器


游戏的定时器

游戏的状态会随着时间的流逝而改变,此外,我们还需要定时进行一些逻辑判断。所以,引擎引入了定时器的概念。显然,定时器就是使得游戏动态变化所需的工具。

cocos2d-x 有两种定时机制- 使用update方法和使用schedule方法

1. CCNode的刷新事件update方法,每帧都要调用 
2. CCNode提供的schedule方法,可以实现一定的时间间隔连续调用某个函数 

CCNode 定时器相关方法

isScheduled( SEL_SCHEDULE selector ) 返回一个值,表示selector对应的函数是否被添加为定时器
scheduleUpdate      启用update定时器
scheduleUpdateWithPriority(int priority) 启用update定时器,并设定定时器的优先级
unscheduleUpdate 取消update定时器
schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
scheduleOnce(SEL_SCHEDULE selector, float delay) 只执行一次的普通定时器
unschedule(SEL_SCHEDULE selector) 取消selector所对应函数的定时器
unscheduleAllSelectors 取消该节点所关联的全部定时器
pauseScheduleAndActions 暂停此节点所关联的全部定时器与动作
resumeScheduleAndActions 继续执行此节点所关联的定时器和动作

其他流程相关事件

onEnter
onEnterTransitionDidFinish
onExit
onExitTransitionDidStart

这些事件的默认处理通常是负责定时器和动作的启用和暂停,所以必须在重载时候首先调用父类的方法。


PS: 对应update定时器来说,每一个节点只能注册一个定时器,因此节点中主要保存了注册者和优先级。
对于普通定时器来说,每一个节点可以注册多个定时器,引擎使用回调函数来区分同一个节点下注册的不同的定时器。调度器为每一个定时器创建了一个CCTime对象,它记录了定时器的注册者,回调函数,触发周期,触发次数。

CCTime的update方法累计时间来决定是否引发对应的定时器事件,达到要求后会调用注册的回调函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值