搜档网
当前位置:搜档网 › 基于cocos2D-X游戏的设计与实现毕业论文

基于cocos2D-X游戏的设计与实现毕业论文

题目基于Cocos2D-X的跨平台游戏的设计与实现

姓名学号

系(院)班级

指导教师职称

2014 年5 月20 日

毕业设计(论文)成绩评定表

目录

第一章绪论 (1)

1.1手游背景 (1)

1.2发展趋势 (1)

1.3研究意义 (1)

1.4不足之处............................................ 错误!未定义书签。第二章相关技术. (2)

2.1C++语言 (3)

2.2C OCOS2D-X平台技术介绍 (3)

2.3开发工具 (4)

第三章设计概要 (3)

3.1游戏介绍 (4)

3.2游戏的结构例图 (5)

3.3功能模块分析图 (5)

3.3.1 游戏欢迎页面 (6)

3.3.2 游戏主页面 (6)

3.4游戏失败 (7)

第四章项目设计 (8)

4.1游戏架构设计 (8)

第五章项目实现 (9)

5.1游戏总体实现 (9)

5.2各模块实现 (9)

5.2.1功能的实现依赖 (9)

5.2.2 游戏主欢迎页的实现 (9)

5.2.3游戏主场景 (11)

5.2.4游戏主角类 (11)

5.2.5敌机类 (13)

5.2.6 敌机管理 (15)

5.2.7 触摸事件 (18)

5.2.8 游戏结束场景 (18)

第六章学习心得 (20)

第七章项目总结与展望 (21)

参考文献 (22)

第1章绪论

1.1 手游背景

手游指在手机等各类手持硬件设备上运行的游戏类应用程序,其需要具备一定硬件环境和一定系统级程序作为运行基础。2004年,手机游戏均为WAP游戏,到2005年,图形化手机游戏激增,已经超过40余款。2005年6月,盛大英特尔宣布携手共同开发国内手机游戏市场,手机网游行业阵营开始空前壮大,继盛大、北京掌讯、美通之后,网易、空中,标派等也纷纷加入,目前国内手机游戏厂商已经近30家。手机游戏尚处于市场导入期,在未来几年内,手机游戏将步入快速发展阶段。

1.2 发展趋势

近年来,随着智能机的普及以及3G的覆盖率增加,手机网游日益兴起,现已经有近两千万的手机网游玩家了。2014年,国内移动互联网竞争格局未定,运营商拒绝管道化欲谋更多话语权,转型力度、资源投入日趋加大;在部分细分领域,围绕运营商转型的业务和渠道价值骤然放大,引发产业整合日趋频繁。在此背景下,国内移动互联龙头拓维信息通过多年技术积累及运营商渠道优势,确定以手机动漫与游戏业务为两大核心发展方向之一。

1.3 研究意义

全球在使用的移动电话已经超过10亿部,而且这个数字每天都在不断增加。在除美国外的各个发达国家,手机用户都比计算机用户多。手机游戏潜在的市场比其他任何平台,比如PlayStation和GameBoy都要大。在控制台游戏时代,GameBoy热销的一个原因就是便携性——人们可以随时随地沉浸在自己喜欢的游戏中,还可以随时随地抢购自己喜欢的装备或宠物。和游戏控制台或者PC相比,手机虽然可能不是一个理想的游戏设备,但毕竟人们总是随时随身携带,这样手机游戏很可能成为人们消遣时间的首选。手机便携性、移动性的特征更能满足用户随时随地玩游戏的需求,用户利用排队、等车的时间进行游戏,手机游戏碎片化的特性凸显。调查显示,29.8%的用户在用手机玩游戏以后电脑端玩游戏的时间减少,手机游戏已经开始抢夺电脑游戏时间。22.4%的用户手机游戏时间越来越长,仅有10%的用户时间变短,手机游戏已逐渐成为一种普遍的娱乐方式。因为手机是网络设备,在一定限制因素下可以实现多人在线游戏。随着移动网络的发展,移动游戏也越来越多的被大家接受,对于之前长期通知市场的掌机来说造成了不少的冲击。市场研究公司IDC和App Annie报告显示2013年第一季度iOS和Android

平台游戏业务营收是掌机的3倍。手机游戏市场潜力大,投入资金少,吸引了很多市场进入者,但中小SP在激烈的竞争中生存问题是需要考虑的主要问题。手机游戏开发商、游戏应及服务提供商不重视市场宣传和推广工作,忽视对于游戏产品,用户的体验和习惯培养重要性。手机游戏市场竞争激烈,该竞争涉及国内,也涉及国外游戏开发商。追求低成本和短期利益,现游戏产品的质量粗糙。手机游戏的同质化也越来越严重,创新力不足。

第2章相关设计

2.1 C++语言

C++语言是一种使用非常广泛的计算机编程语言。是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。

C++在一定程度上可以和C语言很好的结合,甚至大多数C语言程序是在C++的集成开发环境中完成的。C++相对众多的面向对象的语言,具有相当高的性能。

C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括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项目可以很容易地建立和运行在IOS,Android,黑莓 Blackberry等操作系统中。Cocos2d-x还支持Windows、Mac和Linux等桌面操作系统,因此,开发者编写的源代码很容易在桌面操作系统中编辑和调试。

Cocos2D-X主要功能:流程控制(Flow control):非常容易地管理不同场景(scenes)之间的流程控制;精灵(Sprites):快速而方便的精灵;动作(Actions):告诉精灵们该做什么。可组合的动作如移动(move)、旋转(rotate)和缩放(scale)等更多;特效(Effects):特效包括波浪(waves)、旋转(twirl)和透镜(lens)等更多;平面地图(Tiled Maps):支持包括矩形和六边形平面地图;转换(Transitions):从一个场景移动到另外一个不同风格的场景;菜单(Menus):创建内部菜单;文本渲染(Text Rendering):支持标签和HTML标签动作;文档(Documents):编程指南 + API参考 + 视频教学 + 很多教用户如何使用的简单测试例子;MIT许可:尽管用就是了;基于Pyglet:没有外部的依赖;基于OpenGL:支持硬件加速;3D对象:MD2模型支持;脚本语言:支持Lua,JavaScript语言。

图2.2 Cocos2D-X引擎架构

2.3开发工具

游戏在Windows XP系统下开发,基于visual studio C++ 2008的开发平台,采用了cocos2d-x技术进行开发。

操作系统:Microsoft Windows 7

程序语言:C++

开发工具:Microsoft Visval Studio 2012,cocos2d-x-2.2.2

Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++等编程语言。Visual C++以拥有“语法高亮”,IntelliSense(自动编译功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加链接著称。这些特征明显缩短程序编辑、编译及链接的时间花费,在大型软件计划上尤其显著。

C++C++

计的人员非常多,Microsoft公司的Visual C++2008 因其强大的功能、非常友好的界面而C++Visual C++提供的集成开发环境、MFC

C++Windows应用程序所需的源代码编写、用户界面设计、消息映射、编译链接和调试运行等工作。

第3章设计概要

3.1 游戏介绍

这是一款飞行射击类游戏,整体环境主要还是围绕太空为主,高保真的音效,为玩家呈现一场不一样射击体验。简单的触屏操作,触屏按住随意一个地方,左右移动,便可自动攻击敌人,上下移动亦可躲避强敌。在飞机的左下角还有两个道具槽,直接点击

就可以发动道具效果,前提是你必须要吃到道具。玩家在游戏中要做的就是驾驶着最新战机,在敌机身前发动攻击。在击毁敌机的同时获得分数,击毁的敌机越多,则相对的获得分数就越高。玩家进行游戏的时候需要注意不能被敌机及敌机子弹碰到,否则玩家控制角色死亡,同时游戏结束。记录玩家获取的积分。

3.2游戏的结构例图

游戏的结构例图如图3.2所示:

图3.2游戏的结构图例图

3.3功能模块分析图

游戏功能模块主体分析:

3.3.1 游戏欢迎页面

游戏欢迎页面主要是预加载游戏进行需要的图片、音乐等资源进行预加载。

3.3.2 游戏主页面

游戏主页面逻辑判断如图3.3所示。

图3.3游戏主页面逻辑判断图

道具使用逻辑图如下:

图3.3道具使用逻辑图3.4游戏失败

游戏失败逻辑图

图3.4游戏失败逻辑图

第4章项目设计

4.1 游戏架构设计

由项目的需求分析可以清晰的对本游戏的具体功能实现进行设计,如下图4.1是本游戏的总体架构设计。

图4.1 游戏总体构架设计

通过对游戏的需求进行分析和细致的归纳,可以认为游戏的主要内容是由游戏进行时和游戏失败两个主要部分所构成。游戏进行时包含了用户对主角的操作以及对主角信息(获得的分数及获取的道具)的管理,用户游戏结束的操作选择,游戏进行为本系统的设计核心。基于这些考虑,本游戏将对游戏进行时的事件作为一个重点的功能模块进行详细设计。

第5章项目实现

前四章是对游戏的逻辑和功能上的设计,而游戏实现阶段就要依据之前的成果将抽象化设计转化为物理实现。

5.1游戏总体实现

游戏的模块结构是对游戏的进行一个总体划分,要真正的实现游戏,还需要进一步的设计用户的功能。

游戏的功能分为十类:游戏主场景、游戏欢迎页、游戏主角类、游戏敌机类、子弹类、游戏场景类、游戏结束场景类、管理类、道具类、触摸事件,针对每一个功能都实现了不同的作用。

5.2各模块实现

本文对货单管理模块、个人信息管理模块、系统信息管理模块中的功能具体实现过程进行论述。

5.2.1功能的实现依赖

项目创建的时候需要添加cocos2d-x的支持项,如图5.2.1,

图5.2.1

搭建好的工程在第一次创建项目的时候会自动把需要的外部依赖项添加到项目下,不需要手动额外添加。

需要注意的是,在开始一个项目的时候,要把需要用到的图片资源以及音乐添加到项目目录下,否则在项目进行的过程中会报错。资源文件尽量不要用中文命名,有时会出现字符编码的错误。

5.2.2 游戏主欢迎页的实现

用户在进去游戏的时候,会首先进入到欢迎页面(图5.2.2.1)。

图5.2.2.1

欢迎页是为了对资源,即图片资源和音乐资源进行预加载,图片资源和音乐资源相对较大,进入游戏后在加载比较慢,对游戏体验会造成一定影响,所以在欢迎页面进行预加载,进入游戏后可以享受较好的体验,不会因为加载资源而造成游戏卡的问题。

加载资源代码如下:

//加载音乐资源

PreloadMusic();

void WelcomeLayer::PreloadMusic()

{

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("so und/game_music.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/bulle t.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/enemy 1_down.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/enemy 2_down.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/enemy 3_down.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/game_ over.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/get_b omb.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/get_d ouble_laser.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/use_b omb.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/big_s paceship_flying.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/achie vement.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/out_p orp.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/butto n.mp3");

CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("sound /game_music.mp3",true);

}

这是做一个检测,可以不添加,但是为了保证代码的健壮性要添加:

bool bRet=false;

do

{

CC_BREAK_IF(!CCLayer::init());

、、、、、、、

bRet=true;

} while (0);

return bRet;

5.2.3游戏主场景

游戏主场景是为添加的精灵提供一个层,所有的精灵都是在这个层上进行添加。

5.2.4游戏主角类

创建游戏主角后,然他在进入游戏后闪烁三次,主角在进行飞行的时候让尾巴的烟火一长一短,显示正在飞行,这里是通过两个图片不断交替显示完成的。

//创建 CCBlink 效果

CCBlink *blink=CCBlink::create(1,3);

//

CCAnimation* animation=CCAnimation::create();

//通过.png 和 .plist文件创建精灵表

//animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->sp riteFrameByName("hero1.png"));

//animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->sp riteFrameByName("hero2.png"));

//从本地文件系统中加载图片文件到CCSpriteFrame中区,然后添加到CCAnimation中for (int i = 1; i < 3; i++)

{

char szImageFileName[128] = {0};

sprintf(szImageFileName, "hero%d.png", i);

animation->addSpriteFrameWithFileName(szImageFileName);

CC_BREAK_IF(!animation);

}

animation->setDelayPerUnit(0.1f);

CCAnimate* animate=CCAnimate::create(animation);

plane->runAction(blink);

plane->runAction(CCRepeatForever::create(animate));

主角在飞行的时候会发射子弹,所以要添加子弹,同时发射子弹的时候还有子弹的音效CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("sound/bullet.m p3");

CCSprite* bullet=CCSprite::createWithSpriteFrameName("bullet1.png"); bulletBatchNode->addChild(bullet);

//this->addChild(bullet);

this->m_pAllBullet->addObject(bullet);

CCPoint

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()->getWinSize().height+bullet->getContentS ize().height/2-bulletPosition.y;

float velocity=320/1;//320pixel/sec

float realMoveDuration=length/velocity;

CCFiniteTimeAction*

actionMove=CCMoveTo::create(realMoveDuration,ccp(bulletPosition.x,CCDirector ::sharedDirector()->getWinSize().height+bullet->getContentSize().height/2)); CCFiniteTimeAction*

actionDone=CCCallFuncN::create(this,callfuncN_selector(BulletLayer::bulletMo veFinished));

CCSequence* sequence=CCSequence::create(actionMove,actionDone,NULL);

bullet->runAction(sequence);

由于子弹的发射是有间隔的,设置一个schedule,有规律的调用AddBullet函数,是子弹发射;

void BulletLayer::StartShoot(float delay)

{

this->schedule(schedule_selector(BulletLayer::AddBullet),0.20f,kCCRepeatFore ver,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,Receiver* 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();

}

}

//更新创建敌人时间

bool CWXEnemyManager::IsCreate()

{

if (m_nCD==0)

{

m_nCD = m_nCDTime;

return true;

}

else

{

m_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_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 GameScene::detectionCrash()

{

CCArray* bulletsToDelete = CCArray::create();//创建一个CCArray,用以存放待删除的子弹,也就是此帧中被检测到碰撞的子弹 

bulletsToDelete->retain();//必须调用retain,CCArray内部调用了autoRelease CCObject* bt,*et;

CCArray* enemyToDelete = CCArray::create();//创建一个CCArray,用以存放待删除的敌机,也就是此子弹击中的敌机

enemyToDelete->retain();//调用retain  

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, width, 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().intersectsRect(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::getHightestScore();

if (this->m_totalScore > tempHightScore)

{

GameScene::saveHightestScore(this->m_totalScore);

}

char life[64];

sprintf(life, "%d", this->heroLayer->getHeroLifes());

CCLabelTTF* lbLife = (CCLabelTTF*)this->getChildByTag(tagOfLife);

lbLife->setString(life);

this->heroLayer->heroBomb(0.1f);

if (this->heroLayer->getHeroLifes() == 0)

{

this->scheduleOnce(schedule_selector(GameScene::gameOverCallback), 2.0f); }

else

{

this->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,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   enemyToDelete->addObject(enemy3);//把待删除敌机放入CCArray 

this->m_totalScore += enemy3->getScore();

char str1[20];

sprintf(str1, "%d",(int)this->m_totalScore);

CCLabelTTF* label1 = (CCLabelTTF*)this->getChildByTag(tagOfScore);

label1->setString(str1);

}

}

}

}

CCARRAY_FOREACH(enemyToDelete,et)//遍历所有此帧中碰撞死亡的敌机,必须是死亡{

CCSprite* enemy3 = (CCSprite*)et;

this->enemyLayer->bomb(enemy3);//执行爆炸

}

enemyToDelete->release();//release

CCARRAY_FOREACH(bulletsToDelete,bt)//遍历所有此帧中碰撞的子弹

{

CCSprite* bullet = (CCSprite*)bt;

this->heroLayer->getBullets()->removeBullet(bullet);//执行移除

}

bulletsToDelete->release();//release

}

相关主题