cocos2d-x 基本概念的学习

本文介绍了Cocos2d-x的基本概念和技术细节,包括场景、层、精灵、节点、渲染树、动作与动画等内容,并深入探讨了Cocos2d-x的智能内存管理技术。

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

cocos2d-x 基本概念的学习

基本元素

  • 我们把内容相对不变的游戏元素成为场景,游戏在场景之间的切换称为流程控制CCScene
  • 是场景之下的游戏元素。CCLayer
  • 精灵属于层,是场景中的课件图形。如主角。CCSprite
  • 节点渲染树CCNode

一旦建立起渲染树,组织复杂的场景就变得十分简单。我们赋予每个节点一系列属性,包括节点相对于父节点的位置、旋转角度、缩放比例、和变形参数等。我们只需要考虑节点相对于父节点的属性,就可以创建复杂的对象或者动作。(这么说的话,实现血条也就可以用这个方法)

  • 动作动画。动作:CCAction CCActionInterval CCActionInstant。动画:帧。使用多个动画帧创建动画序列。 CCAnimation, 用帧动画序列创建可作用于精灵的帧动画。 CCAnimate

###命名空间和类名称### 我们可以发现USING_NS_CC-----<code>#define USING_NS_CC using namespace cocos2d</code>

###构造函数和初始化### Cocos2d-x中和C++有点区别:

  1. Cocos2d-x它所有的对象都创建在堆上,然后通过指针引用
  2. 创建Cocos2d-x对象通常有两种方法,一种是首先使用new操作符创建一个未初始化的对象,然后调用init系列方法来初始化。第二种是使用静态的工厂方法直接创建以恶对象。

使用构造函数创建的对象有使用者负责释放。使用工厂方法创建的对象则不需要。

// example 
CCSprite *sprite = new CCSprite();
sprite->initWithFile("*.jpg");
// 第二种使用工厂方法
// example
CCSprite* sprite = CCSprite::spriteWithFile("HelloWorld.png");//旧版本引擎
CCSprite* sprite = CCSprite::create("HelloWorld.png");//新版本引擎
  1. 选择器

<pre><code> shedule_selector(SELECTOR); menu_selector(SELECTOR); //usage CCMenuItemImage *pCloseItem = CCMenuItemImage::Create( "CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback) ); </code></pre>

###单例### Cocos2d-x的游戏控制器CCDirector是一个独一无二的控制器,用于切换游戏场景。不可能同时存在CCDirector的实例。

<pre><code> static CCDisplayLinkDirector s_SharedDirector; CCDirector* CCDirector::sharedDirector(void) { static bool s_bFirstUseDirector = true; if (s_bFirstUseDirector) { s_bFirstUseDirector = false; s_ShareDirector.init(); } return &s_ShareDirector; } CCDirector::sharedDirector()->replaceScene(newScene);//通过调用replaceScene()来切换到新场景。 </code></pre>

##Cocos2d-x的只能内存管理技术##

实际上这跟Objective-c的风格一致

  1. 引用计数

通过给每个对象维护一个 引用计数器,记录该对象当前被引用的次数。对象增加一次引用时,计数器加1。当引用计数为0时,标志着该对象的生命周期结束,自动触发对象的回收释放。(但是必须注意维护计数)

通过retainCount()方法获得对象当前的引用计数值。在对象通过构造函数创建的时候,该引用值被赋值为1。在其它地方需要引用对象时,我们会调用retain()方法,令其引用计数+1,表示获取该对象的引用权;在引用结束的时候调用release()方法,令其引用计数-1,表示释放该对象的引用权。

还有一个方法是autorelease(),起作用时将对象放入自动回收池(CCAutore-leasePool)。当回收池自身被释放的视乎,他就会对池中的所有对象执行一次release()方法,再循环结束后释放回收池。*所以,即使我们没有手工创建和释放回收池,每一帧结束的时候,自动回收池中的对象也都会被执行一次release()方法。

<pre><code> fish = new CCSprite(); fish->init(); // 1 // CCLog("%d", fish->retainCount()); // 可以得到当前计数的值 fish->retain(); // 2 fish->release(); // 1 fish->autorelease(); // 1 </code></pre>

回收池管理器 CCPoolManager* 的push(),pop()操作:创建和释放回收池。

<pre><code> CCPoolManage::sharedPoolManage()->push(); for(int i=0; i<n; i++) { CCString *dataItem = CCString::createWithFormat("%d", Data[i]); stringArray->addObject(dataItem); } CCPoolManage::sharedPoolManage()->pop(); </code></pre>

  1. 垃圾回收

转载于:https://my.oschina.net/zjuysw/blog/197022

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值