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