《基于cocos2d-x的跨平台游戏的设计与实现本科学位论文.doc》由会员分享,可在线阅读,更多相关《基于cocos2d-x的跨平台游戏的设计与实现本科学位论文.doc(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、淄博职业学院信息工程系毕业设计 毕 业 设 计题目基于Cocos2D-X的跨平台游戏的设计与实现姓 名 学 号 系(院) 班 级 指导教师 职 称 二O一四 年 五 月 二十 日 目 录第一章绪论41.1 手游背景41.2 发展趋势41.3 研究意义41.4 不足之处5第二章相关技术62.1 C+语言62.2 Cocos2D-X平台技术介绍62.3开发工具7第三章设计概要83.1 游戏介绍83.2游戏的结构例图83.3功能模块分析图103.3.1 游戏欢迎页面103.3.2 游戏主页面103.4游戏失败11第四章项目设计124.1 游戏架构设计12第五章项目实现135.1游戏总体实现135.2
2、各模块实现135.2.1功能的实现依赖135.2.2 游戏主欢迎页的实现135.2.3游戏主场景155.2.4游戏主角类165.2.5敌机类175.2.6 敌机管理195.2.7 触摸事件225.2.8 游戏结束场景23第六章学习心得24第七章项目总结与展望25参考文献26第1章 绪论1.1 手游背景手游指在手机等各类手持硬件设备上运行的游戏类应用程序,其需要具备一定硬件环境和一定系统级程序作为运行基础。2004年,手机游戏均为WAP游戏,到2005年,图形化手机游戏激增,已经超过40余 款。2005年6月,盛大英特尔宣布携手共同开发国内手机游戏市场,手机网游行业阵营开始空前壮大,继盛大、北京
3、掌讯、美通之后,网易、空中,标派等也纷 纷加入,目前国内手机游戏厂商已经近30家。手机游戏尚处于市场导入期,在未来几年内,手机游戏将步入快速发展阶段。1.2 发展趋势近年来,随着智能机的普及以及3G的覆盖率增加,手机网游日益兴起,现已经有近两千万的手机网游玩家了。2014年,国内移动互联网竞争格局未定,运营商拒绝管道化欲谋更多话语权,转型力度、资源投入日趋加大;在部分细分领域,围绕运营商转型的业务和渠道价 值骤然放大,引发产业整合日趋频繁。在此背景下,国内移动互联龙头拓维信息通过多年技术积累及运营商渠道优势,确定以手机动漫与游戏业务为两大核心发展方 向之一。1.3 研究意义全球在使用的移动电话
4、已经超过10亿部,而且这个数字每天都在不断增加。在除美国外的各个发达国家,手机用户都比计算机用户多。手机游戏潜在的市场比其他任何平台,比如PlayStation和GameBoy都要大。在控制台游戏时代,GameBoy热销的一个原因就是便携性人们可以随时随 地沉浸在自己喜欢的游戏中,还可以随时随地抢购自己喜欢的装备或宠物。和游戏控制台或者PC相比,手机虽然可能不是一个理想的游戏设备,但毕竟人们总是随 时随身携带,这样手机游戏很可能成为人们消遣时间的首选。手机便携性、移动性的特征更能满足用户随时随地玩游戏的需求,用户利用排队、等车的时间进行游 戏,手机游戏碎片化的特性凸显。调查显示,29.8%的用
5、户在用手机玩游戏以后电脑端玩游戏的时间减少,手机游戏已经开始抢夺电脑游戏时间。22.4%的 用户手机游戏时间越来越长,仅有10%的用户时间变短,手机游戏已逐渐成为一种普遍的娱乐方式。因为手机是网络设备,在一定限制因素下可以实现多人在线游戏。随着移动网络的发展,移 动游戏也越来越多的被大家接受,对于之前长期通知市场的掌机来说造成了不少的冲击。市场研究公司IDC和App Annie报告显示2013年第一季度iOS和Android平台游戏业务营收是掌机的3倍。手机游戏市场潜力大,投入资金少,吸引了很多市场进入者,但中小SP在激烈的竞争中生存问题是需要考虑的主要问题。手机游戏开发商、游戏应及服务提供商
6、不重视市场宣传和推广工作,忽视对于游戏产品,用户的体验和习惯培养重要性。手机游戏市场竞争激烈,该竞争涉及国内,也涉及国外游戏开发商。追求低成本和短期利益,现游戏产品的质量粗糙。手机游戏的同质化也越来越严重,创新力不足。 第2章 相关设计2.1 C+语言C+语言是一种使用非常广泛的计算机编程语言。是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。C+在一定程度上可以和C语言很好的结合,甚至大多数C语言程序是在C+的集成开发环境中完成的。C+相对众多的面向对象的语言,具有相当高的性能。C+引入了面向对象的
7、概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括MFC、QT就是使用的C+。C+避免平台限定或没有普遍用途的特性。C+不使用会带来额外开销的特性。C+设计成无需复杂的程序设计环境。2.2 Cocos2D-X平台技术介绍cocos2d是一个基于MIT协议的开源框架,用于构建游戏、应用程序和其他图形界面交互应用。这是一个C+ Cocos2d-iPhone项目的版本。Cocos2d-X发展的重点是围绕Cocos2d跨平台,Cocos2d-x提供的框架。手机游戏,可以写在 C+或者Lua中,使用API是Cocos2d-iPhone完全兼容。Cocos2d-x项目可以很容易地建
8、立和运行在IOS,Android,黑莓 Blackberry等操作系统中。Cocos2d-x还支持Windows、Mac和Linux等桌面操作系统,因此,开发者编写的源代码很容易在桌面操作系统中编辑和调试。Cocos2D-X主要功能:流程控制(Flow control):非常容易地管理不同场景(scenes)之间的流程控制;精灵(Sprites):快速而方便的精灵;动作(Actions):告诉精灵们该做什么。可组合的动作如移动(move)、旋转(rotate)和缩放(scale)等更多;特效(Effects):特效包括波浪(waves)、旋转(twirl)和透镜(lens)等更多;平面地图(T
9、iled Maps):支持包括矩形和六边形平面地图;转换(Transitions):从一个场景移动到另外一个不同风格的场景;菜单(Menus):创建内部菜单;文本渲染(Text Rendering):支持标签和HTML标签动作;文档(Documents):编程指南 + API参考 + 视频教学 + 很多教用户如何使用的简单测试例子;MIT许可:尽管用就是了;基于Pyglet:没有外部的依赖;基于OpenGL:支持硬件加速;3D对象:MD2模型支持;脚本语言:支持Lua,JavaScript语言。图2.2 Cocos2D-X引擎架构2.3开发工具游戏在WindowsXP系统下开发,基于visua
10、l studioC+2008的开发平台,采用了cocos2d-x技术进行开发。操作系统:MicrosoftWindows7程序语言:C+开发工具:Microsoft VisvalStudio2012,cocos2d-x-2.2.2MicrosoftVisualC+,(简称VisualC+、MSVC、VC+或VC)微软公司的C+开发工具,具有集成开发环境,可提供编辑C语言,C+以及C+等编程语言。VisualC+以拥有“语法高亮”,IntelliSense(自动编译功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正
11、在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加链接著称。这些特征明显缩短程序编辑、编译及链接的时间花费,在大型软件计划上尤其显著。C+语言是目前面向对象编程的首选语言,学习、使用C+语言并进行应用程序设计的人员非常多,Microsoft公司的VisualC+2008因其强大的功能、非常友好的界面而成为当前最为热门C+语言开发环境。VisualC+提供的集成开发环境、MFC类库和应用程序框架极大地便利了用C+语言开发Windows应用程序所需的源代码编写、用户界面设计、消息映射、编译链接和调试运行等工作。第3章 设计概要3.1 游戏介绍这是一款飞行射击类游戏,整体环境主要还是围
12、绕太空为主,高保真的音效,为玩家呈现一场不一样射击体验。简单的触屏操 作,触屏按住随意一个地方,左右移动,便可自动攻击敌人,上下移动亦可躲避强敌。在飞机的左下角还有两个道具槽,直接点击就可以发动道具效果,前提是你必 须要吃到道具。玩家在游戏中要做的就是驾驶着最新战机,在敌机身前发动攻击。在击毁敌机的同时获得分数,击毁的敌机越多,则相对的获得分数就越高。玩家进行游戏的时候需要注意不能被敌机及敌机子弹碰到,否则玩家控制角色死亡,同时游戏结束。记录玩家获取的积分。3.2游戏的结构例图游戏的结构例图如图3.2所示:图3.2游戏的结构图例图3.3功能模块分析图游戏功能模块主体分析:3.3.1 游戏欢迎页
13、面游戏欢迎页面主要是预加载游戏进行需要的图片、音乐等资源进行预加载。3.3.2 游戏主页面游戏主页面逻辑判断如图3.3所示。图3.3游戏主页面逻辑判断图道具使用逻辑图如下:图3.3道具使用逻辑图3.4游戏失败游戏失败逻辑图图3.4游戏失败逻辑图第4章 项目设计4.1 游戏架构设计由项目的需求分析可以清晰的对本游戏的具体功能实现进行设计,如下图4.1是本游戏的总体架构设计。图4.1 游戏总体构架设计通过对游戏的需求进行分析和细致的归纳,可以认为游戏的主要内容是由游戏进行时和游戏失败两个主要部分所构成。游戏进行时包含了用户对主角的操作以及对主角信息(获得的分数及获取的道具)的管理,用户游戏结束的操
14、作选择,游戏进行为本系统的设计核心。基于这些考虑,本游戏将对游戏进行时的事件作为一个重点的功能模块进行详细设计。第5章 项目实现前四章是对游戏的逻辑和功能上的设计,而游戏实现阶段就要依据之前的成果将抽象化设计转化为物理实现。5.1游戏总体实现游戏的模块结构是对游戏的进行一个总体划分,要真正的实现游戏,还需要进一步的设计用户的功能。游戏的功能分为十类:游戏主场景、游戏欢迎页、游戏主角类、游戏敌机类、子弹类、游戏场景类、游戏结束场景类、管理类、道具类、触摸事件,针对每一个功能都实现了不同的作用。5.2各模块实现本文对货单管理模块、个人信息管理模块、系统信息管理模块中的功能具体实现过程进行论述。5.
15、2.1功能的实现依赖项目创建的时候需要添加cocos2d-x的支持项,如图5.2.1,图5.2.1搭建好的工程在第一次创建项目的时候会自动把需要的外部依赖项添加到项目下,不需要手动额外添加。需要注意的是,在开始一个项目的时候,要把需要用到的图片资源以及音乐添加到项目目录下,否则在项目进行的过程中会报错。资源文件尽量不要用中文命名,有时会出现字符编码的错误。5.2.2 游戏主欢迎页的实现用户在进去游戏的时候,会首先进入到欢迎页面(图5.2.2.1)。图5.2.2.1欢迎页是为了对资源,即图片资源和音乐资源进行预加载,图片资源和音乐资源相对较大,进入游戏后在加载比较慢,对游戏体验会造成一定影响,所
16、以在欢迎页面进行预加载,进入游戏后可以享受较好的体验,不会因为加载资源而造成游戏卡的问题。加载资源代码如下:/加载音乐资源PreloadMusic();void WelcomeLayer:PreloadMusic()CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadBackgroundMusic(sound/game_music.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/bullet.mp3);CocosDenshion:SimpleA
17、udioEngine:sharedEngine()-preloadEffect(sound/enemy1_down.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/enemy2_down.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/enemy3_down.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/ga
18、me_over.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/get_bomb.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/get_double_laser.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/use_bomb.mp3);CocosDenshion:SimpleAudioEngine:shar
19、edEngine()-preloadEffect(sound/big_spaceship_flying.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/achievement.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/out_porp.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/button.mp3)
20、;CocosDenshion:SimpleAudioEngine:sharedEngine()-playBackgroundMusic(sound/game_music.mp3,true);这是做一个检测,可以不添加,但是为了保证代码的健壮性要添加:bool bRet=false;doCC_BREAK_IF(!CCLayer:init();、bRet=true; while (0);return bRet;5.2.3游戏主场景游戏主场景是为添加的精灵提供一个层,所有的精灵都是在这个层上进行添加。5.2.4游戏主角类创建游戏主角后,然他在进入游戏后闪烁三次,主角在进行飞行的时候让尾巴的烟火一长一
21、短,显示正在飞行,这里是通过两个图片不断交替显示完成的。/创建 CCBlink 效果CCBlink *blink=CCBlink:create(1,3);/CCAnimation* animation=CCAnimation:create();/通过.png 和 .plist文件创建精灵表/animation-addSpriteFrame(CCSpriteFrameCache:sharedSpriteFrameCache()-spriteFrameByName(hero1.png);/animation-addSpriteFrame(CCSpriteFrameCache:sharedSprit
22、eFrameCache()-spriteFrameByName(hero2.png);/从本地文件系统中加载图片文件到CCSpriteFrame中区,然后添加到CCAnimation中for (int i = 1; i addSpriteFrameWithFileName(szImageFileName);CC_BREAK_IF(!animation);animation-setDelayPerUnit(0.1f);CCAnimate* animate=CCAnimate:create(animation);plane-runAction(blink);plane-runAction(CCRe
23、peatForever:create(animate);主角在飞行的时候会发射子弹,所以要添加子弹,同时发射子弹的时候还有子弹的音效CocosDenshion:SimpleAudioEngine:sharedEngine()-playEffect(sound/bullet.mp3);CCSprite* bullet=CCSprite:createWithSpriteFrameName(bullet1.png);bulletBatchNode-addChild(bullet);/this-addChild(bullet);this-m_pAllBullet-addObject(bullet);C
24、CPoint planePosition=PlaneLayer:sharedPlane-getChildByTag(AIRPLANE)-getPosition();CCPoint bulletPosition=ccp(planePosition.x,planePosition.y+PlaneLayer:sharedPlane-getChildByTag(AIRPLANE)-getContentSize().height/2);bullet-setPosition(bulletPosition);float length=CCDirector:sharedDirector()-getWinSiz
25、e().height+bullet-getContentSize().height/2-bulletPosition.y;float velocity=320/1;/320pixel/secfloat realMoveDuration=length/velocity;CCFiniteTimeAction* actionMove=CCMoveTo:create(realMoveDuration,ccp(bulletPosition.x,CCDirector:sharedDirector()-getWinSize().height+bullet-getContentSize().height/2)
26、;CCFiniteTimeAction* actionDone=CCCallFuncN:create(this,callfuncN_selector(BulletLayer:bulletMoveFinished);CCSequence* sequence=CCSequence:create(actionMove,actionDone,NULL);bullet-runAction(sequence);由于子弹的发射是有间隔的,设置一个schedule,有规律的调用AddBullet函数,是子弹发射;void BulletLayer:StartShoot(float delay)this-sche
27、dule(schedule_selector(BulletLayer:AddBullet),0.20f,kCCRepeatForever,delay);void BulletLayer:StopShoot()this-unschedule(schedule_selector(BulletLayer:AddBullet);5.2.5敌机类游戏里要有敌人,添加敌机,敌机要根据时间添加,防止出现一大群敌机同时出现/初始化bool CWXEnemyManager:Init( CCTexture2D* pTexture,float fSpeed,int nCD,int nScore,int nHp,Re
28、ceiver* pReceiver )do/对敌人的属性赋值m_nScore = nScore;m_nHp = nHp;m_pReceiver = pReceiver;m_nCD = nCD;m_nCDTime = m_nCD;m_pTexture = pTexture;m_fSpeed = fSpeed;return true; while (false);CCLog(Fun EnemyManager:Init Error!);return false;/判断是否创建敌人void CWXEnemyManager:EnemyManagerLoop()if (IsCreate()Create()
29、;/更新创建敌人时间bool CWXEnemyManager:IsCreate()if (m_nCD=0)m_nCD = m_nCDTime;return true;elsem_nCD-;return false;/根据敌人属性创建敌人void CWXEnemyManager:Create()CCSize PlaneSize = m_pTexture-getContentSize();EnemyForCreateMsg Info;Info.nScore = m_nScore;Info.nHp = m_nHp;Info.pTexture = m_pTexture;Info.fSpeed = m_
30、fSpeed;/为了不让敌机产生一半在屏幕外的情况。Info.pStartPoint = CCPointMake(rand()%(int)(_SCREEN_WIDTH_ - PlaneSize.width)+ PlaneSize.width*0.5,_SCREEN_HEIGHT_-1.f);/发消息创建敌人this-SendMsg(enMsgEnemyForCreate,&Info,sizeof(Info);5.2.6 敌机管理敌机与主角子弹碰撞后,要做碰撞检测。同时发送消息消除敌机,将发生了碰撞的敌机进行回收,把碰撞的子弹和敌机存入CCArray中,移除碰撞的子弹和敌机void GameSc
31、ene:detectionCrash()CCArray* bulletsToDelete = CCArray:create();/创建一个CCArray,用以存放待删除的子弹,也就是此帧中被检测到碰撞的子弹 bulletsToDelete-retain();/必须调用retain,CCArray内部调用了autoReleaseCCObject* bt,*et;CCArray* enemyToDelete = CCArray:create();/创建一个CCArray,用以存放待删除的敌机,也就是此子弹击中的敌机enemyToDelete-retain();/调用retain &nbs
32、p;CCRect rectHero = this-heroLayer-getHero()-boundingBox();float x = rectHero.origin.x + rectHero.size.width * 0.3;float y = rectHero.origin.y + rectHero.size.height * 0.4;float width = rectHero.size.width * 0.3;float height = rectHero.size.height * 0.6;CCRect rect_HeroForCrash = CCRectMake(x, y, wi
33、dth, height);/检测敌机和hero是否相撞CCARRAY_FOREACH(this-enemyLayer-m_enemys,et)/遍历所有敌机/break;Enemy* enemy = (Enemy*)et;if (enemy-getLife() = 0)break;/ CCPoint rect1 = this-heroLayer-getHero()-getPosition();/boundingBox 获取的是相对于父节点的左下角为原点的一个rect,所以要比较两个精灵是否相交,他们的父节点的坐标原点和大小应该一样if(enemy-boundingBox().intersect
34、sRect(rect_HeroForCrash)this-heroLayer-setIsHeroLive(false);this-heroLayer-setHeroLifes(this-heroLayer-getHeroLifes() - 1);enemyLayer-stopTakeEnemy();enemyLayer-bomb(enemy);enemyLayer-removeAllEnmeys();SimpleAudioEngine:sharedEngine()-pauseBackgroundMusic();int tempHightScore = GameScene:getHightest
35、Score();if (this-m_totalScore tempHightScore)GameScene:saveHightestScore(this-m_totalScore);char life64;sprintf(life, %d, this-heroLayer-getHeroLifes();CCLabelTTF* lbLife = (CCLabelTTF*)this-getChildByTag(tagOfLife);lbLife-setString(life);this-heroLayer-heroBomb(0.1f);if (this-heroLayer-getHeroLifes
36、() = 0)this-scheduleOnce(schedule_selector(GameScene:gameOverCallback), 2.0f);elsethis-scheduleOnce(schedule_selector(GameScene:newLife), 2.0f);return;/检测敌机和子弹是否相撞CCARRAY_FOREACH(this-heroLayer-getBullets()-m_bullets,bt)/遍历所有子弹CCSprite* bullet = (CCSprite*)bt;CCARRAY_FOREACH(this-enemyLayer-m_enemys
37、,et)/遍历所有敌机Enemy* enemy3 = (Enemy*)et;if(enemy3-boundingBox().intersectsRect(bullet-boundingBox()if (enemy3-getLife() 1)enemy3-loseLife();bulletsToDelete-addObject(bullet);/把待删除子弹放入CCArray else if (enemy3-getLife() = 1)enemy3-loseLife();bulletsToDelete-addObject(bullet);/把待删除子弹放入CCArray
38、enemyToDelete-addObject(enemy3);/把待删除敌机放入CCArray this-m_totalScore += enemy3-getScore();char str120;sprintf(str1, %d,(int)this-m_totalScore);CCLabelTTF* label1 = (CCLabelTTF*)this-getChildByTag(tagOfScore);label1-setString(str1);CCARRAY_FOREACH(enemyToDelete,et)/遍历所有此帧中碰撞死亡的敌机,必须是死亡CCSprite* en
39、emy3 = (CCSprite*)et;this-enemyLayer-bomb(enemy3);/执行爆炸enemyToDelete-release();/releaseCCARRAY_FOREACH(bulletsToDelete,bt)/遍历所有此帧中碰撞的子弹CCSprite* bullet = (CCSprite*)bt;this-heroLayer-getBullets()-removeBullet(bullet);/执行移除bulletsToDelete-release();/releasebullet是加到 ccspriteBatchNode 上的,ccspriteBatch
40、Node是加到 BulletLayer上面的,ccspriteBatchNode和bulletLayer都是铺满屏幕的。所以子弹调用 boundingbox 获得的矩形是以屏幕左下角为原点的。敌机的原理也是如此。hero是直接加到 herolayer 上的,父节点同样是铺满屏幕的,所以他们的父节点的左下角的坐标都一样的,这就是通过 boundingbox 检测他们是否碰撞的前提。有些纹理周围有比较大的空白地方,这就会造成两个节点看起来还没有接触就会发生碰撞,这就需要对碰撞进行更精确的判断,可以通过什么像素判断法之类的。我这里采取最简单的处理方法,就是通过节点的boundingbox获取到一个r
41、ect,然后对这个rect加工一下,这样子可以获取节点 boundingbox 里面的某一部分来作为碰撞的检测部分。CCRect rectHero = this-heroLayer-getHero()-boundingBox();float x = rectHero.origin.x + rectHero.size.width * 0.3;float y = rectHero.origin.y + rectHero.size.height * 0.4;float width = rectHero.size.width * 0.3;float height = rectHero.size.hei
42、ght * 0.6;CCRect rect_HeroForCrash = CCRectMake(x, y, width, height);5.2.7 触摸事件virtual bool ccTouchBegan (cocos2d:CCTouch *pTouch, cocos2d:CCEvent *pEvent);virtual void ccTouchMoved (cocos2d:CCTouch *pTouch, cocos2d:CCEvent *pEvent);virtual void ccTouchEnded (cocos2d:CCTouch *pTouch, cocos2d:CCEvent
43、 *pEvent);触摸事件;5.2.8 游戏结束场景游戏最后结束需要保存分数并退出,退出界面如图5.2.8:图5.2.8/退出按钮CCMenuItemImage *pExitItem=CCMenuItemImage:create(exit_game_n.png,exit_game_d.png,this,menu_selector(CWXBeginSceneLayer:menuExitCallback);CC_BREAK_IF(!pExitItem);pExitItem-setPosition(ccp(_SCREEN_WIDTH_/2,_SCREEN_HEIGHT_/2-260.f);第6章
44、学习心得学习cocos以后对于内存有了一些自己的见解,在C+中,在堆上分配动态内存和释放动态内存的方法是 new 和 delete,在申请内存之后,如果不使用了就需要delete掉,不然就会造成内存的溢出。附录:new的动态内存,只要在程序结束之前delete就 行,这样在程序结束之前就可以把申请到的堆内存返还给系统,但是在实际的编程过程中,一般为了及时释放不用的空间提高内存的使用率而在不需要的位置调用 delete来释放,以免造成内存占用过高和程序结束之前忘掉,从而造成的内存溢出。在cosos2d-x中,对于引擎本身而言,自带了autorelease 方法,可以将对象的指针加入push到自动释放池中。在每一帧结束的时候调用pop对池中的对象指针执行 退出自动释放池,并且根据引用计数来实现自动释放。cocos2d-x官方推荐的生成对象方式 是使用CREATE_FUNC宏,宏中已经有一个autorelease(