Cocos2d-x

本文深入解析Cocos2d-x游戏引擎的五个主导类:导演(CCDirector)、场景(CCScene)、布景(CCLayer)、精灵(CCSprite)和动作(CCAction)。详细阐述了它们的功能及相互关系,包括场景切换、事件处理和精灵动作的实现。同时,解释了CCNode、CCLayer、CCMenu、CCSprite之间的区别,以及如何在游戏开发中灵活运用这些组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cocos2d-x 是以Cocos2d-iphone 移植版本,是以我们中国为主导的。
首先先来说明Cocos2d-x的五个主导类。
Cocos2d-x 是以类似拍摄电影的劳动角色来分类的。包含有导演,场景,布景,精灵(演员),动作
CCDirector: <wbr>导演,负责场景的切换以及场景的信息。如宽度,高度,旋转场景内容。</wbr>
CCScene: <wbr><wbr>场景. 场景包含有布景,精灵,每场戏的不同,要切换场景。游戏中可分为主界面, 游戏, 分数榜,结束界面等。</wbr></wbr>
CCLayer: <wbr><wbr>布景. 类似是层的概念,也可来源于PS的层的概念。每一层都带有众多精灵等</wbr></wbr>
CCSprite: <wbr><wbr>精灵。就是演员的,演员就需要加入到层里面去的。有相应的动作。</wbr></wbr>
CCAction: <wbr><wbr>动作。精灵的动作。</wbr></wbr>

CCDirector 包含 多个 <wbr>CCScene</wbr>

CCScene 包含多个 <wbr>CCLayer</wbr>

CCLayer 包含多个 <wbr>CCSprite</wbr>

CCSprite 包含多个 <wbr>CCAction</wbr>

场景切换:
void CMyScene::Show()
{
CCScene* myScene = CCScene::node();
CMyScene* layer = <wbr>CMyScene::node();</wbr>
myScene->addChild(layer);
CCScene* preScene = CCDirector::ShareDirector()->getRunningScene();
if (preScene <wbr>== null)</wbr>
{
CCDirecotr::ShareDirector()->runWithScene(myScene);
}
else
{
CCDirecotr::ShareDirector()->replaceScene(myScene);
}
}

CCNode OnEnter()调用:
Class MyLayer:public CCLayer
{
};
1. <wbr>MyLayer* layer = new <wbr>MyLayer();</wbr></wbr>
此时,会进行会onEnter回调。

2. CCLayer* layer <wbr>= MyLayer::node();</wbr>
此时,不会进行onEnter回调。

两者的区别,这个我也不是特别清楚,有清楚的读者可以补充, 好像是第二种方式会进行自动释放内存。
但是,第一种的话,也是可以autorelease();区别除了调用onEnter(),有待继续研究。


LAYER_NODE_FUNC 定义使用

在初始化类时,则会进行调用生成一个结点,可以查看源码,会进行一次init()的操作。
但是需要的是 类::node();使用才行。
init()与onEnter区别:
init()是类加载时,则可以加载某些资源。
onEnter():则为显示时,可以更新某些数据。
头文件里还有一个奇怪的东西LAYER_NODE_FUNC(CMyFirstScene); 这个宏在引擎内部(CCLayer.h)被定义。主要是为自己建的层增加一个node()函数,node()函数的作用是new一个实例,并将它加入autorelease,也就是所有由node()函数得来的指针,都不需要手动的释放(除非自己想要)。

CCNode、CCLayer中的OnEnter()方法
自己 定义的 CCLayer中 重写了onEnter()方法以后, Layer中的updat e和触摸都失效,后台忘 记调用 了基 的onEnter( ) ,通过 源码发过 ,<wbr></wbr> CCNode和CCLayer中的onEnter做了一些初始化工作。 如果 类似问题,希望能帮上忙!

经测试,的确是如此的。继承了onEnter以后,按键是无法使用的。
CCNode-+ CCScene
       |
       + CCLayer
       |
       + CCSprite
       |
       + CCMenu
任何可画的东西都是CCNode,CCNode的基本特点:
1. 一个CCNode可以包含多个CCNode . CCNode的基本操作:addChild, getChildByTag, removeChild .
2. 可以实现周期性的回调 . schedule, unschedule .
3. CCNode可以执行动作: runAction, stopAction .

我们写一个CCNode的子类意味着什么呢?
- 覆盖初始化init.
- "schedule callbacks" , (我们子类化一个CCNode, 回调函数将有什么影响呢?) 
- 覆盖node的绘制.

CCNode有哪些属性呢?
- position
- scale(x, y) 默认的是x=1, y=1;
- rotation (in degrees, clockwise) 旋转;
- CCCamera (an interface to gluLookAt), 怎么看这个CCNode就由CCCamera来决定. 默认的是CCNode的中心.
- CCGridBase 基本的网格.有什么用呢? 怎么转换呢?
- anchor point 什么叫锚点?
- visible
- size
- z-order
- openGL z position

    可以看出, CCNode是一个共通的类, 它表示一个可画的目标, 它可以旋转,可以放大,有观察视角属性,有位置,可不可见,
有大小,并且可以与OpneGL 关联起来. 其中有3个属性是难以理解的: CCGrideBase, anchor point, z-order.

--------------------------------------------
现在的问题就是: 
CCScene, CCLayer, CCMenu, CCSprite 他们都是CCNode 的子类, 他们在功能上有什么明显的不同?
CCLayer主要是处理 事件接收, 加速响应.
CCMenu 在运行时添加MenuItem.
CCScene与CCNode差不多, 只是在锚点上有点不同.
CCSprite来处理2d的图像.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值