您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x制作微信打飞机游戏中的一些技术总结

2014-01-01 10:11 489 查看
1.首先是Cocos2d-x的内存机制

之前这个游戏写完的时候,退出会报内存异常的错误,原因是我把每个create过的对象都在析构函数里面release()了一下,这是没有必要的。因为在cocos2d-x中,每个create过的对象,都默认加了autorelease(),会自动释放。还有一个要注意的问题就是retain()和release()要成对出现,cocos2d-x用了引用计数的方法来管理内存,当retian()一次时候,引用计数加一,release()一次时,引用计数减一,当引用计数为0时,才可以被释放掉。

2.retian()在什么时候用到?

为了保证在每一帧刷新的时候,一些对象不被释放掉,所以要用retian()来持有,把当前对象加入到内存池。有一个retain(),就要有一个release(),必须要成对出现。

例如当前这个项目中的:

void GameLayer::initData()
{
bgHeight = 520;
this->setTouchEnabled(true);
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("game_music.mp3");
wSize = CCDirector::sharedDirector()->getWinSize();
planeArray = CCArray::create();
planeArray->retain();
smallPlaneTime=0;
mediumPlaneTime=0;
bigPlaneTime=0;
scoreInt=0;
propTime=0;
isVisible=false;
}这个planeArray数组用来放敌人飞机的,为了防止在刷新的时候被释放掉,所以用retain()来持续拥有。
在析构函数中又被释放掉。GameLayer::~GameLayer()
{
planeArray->release();

}

3. 中文乱码问题
在做这个游戏的时候,有的时候需要显示中文,但是显示的确实乱码,这主要是因为编码方式不一致的问题,这里我找到了一个方法:

新建一个string.xml文件,建立一个数据字典文件,如下面所示:

<dict>
<key>score</key>
<string>飞机大战分数:</string>
<key>continue</key>
<string>继续</string>
</dict>需要注意的是这个文件一定要保存为utf-8格式,接着读取数据字典里面的内容,代码如下:
CCDictionary *strings = CCDictionary::createWithContentsOfFile("fonts/string.xml");
const char *score = ((CCString *)strings->objectForKey("score"))->getCString();

附上最后的效果图:



最后附上我的源代码,我的开发环境是VS2012+cocos2d-x 2.2.1

代码地址:
http://download.csdn.net/detail/chenbinbin/6795009
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x 游戏