cocos2dx box2d 跑酷总 跑酷游戏中的人物是怎样添加的

基于Cocos2d-x移动平台跑酷类游戏的设计与实现--《北京交通大学》2015年硕士论文
基于Cocos2d-x移动平台跑酷类游戏的设计与实现
【摘要】:随着3G时代的普及,中国手游市场也日益繁荣。对于手机单机游戏,不需要太多的时间和精力,打开游戏即可游玩,获得了大部分用户的青睐。纷繁的手机游戏已经成为人们线上不可缺少的娱乐生活。2014下半年中国手机游戏市场规模达到87.6亿元,同比增长63.3%。PC端备受冷落的跑酷类游戏,在移动端找到了自己的舞台,从08年开始,跑酷类游戏得到了井喷式发展。跑酷游戏秉承了跑酷这项极限运动的含义——挑战极限,同时又符合精品游戏的设计特质——易上手,难精通,吸引了大批的玩家。跑酷类手机游戏《喵星忍者》正是基于这种背景下开发的。
《喵星忍者》是一款基于Cocos2d-x引擎,在iOS平台下的跑酷类手机游戏。本人参与了整款游戏的需求分析与设计,并主要负责游戏主场景模块的编写。鉴于各场景模块功能联系的紧密性以及项目的完整性,同时为了使本论文有更好的借鉴价值,本文以整个游戏的角度,以软件工程的思想,对每个场景进行了介绍,并对游戏主场景进行了重点介绍。本人在开发过程中,用到了Cocos2d-x引擎技术,同时为了提高可扩展性,在项目中多次用到了单例模式等设计模式,而在游戏主场景实现过程中,则用到了物理模拟和碰撞检测技术,使游戏效果更加真实。
该游戏目前已在App Store成功上线。现该项目的开发任务已全部完成,进入运维阶段。
【关键词】:
【学位授予单位】:北京交通大学【学位级别】:硕士【学位授予年份】:2015【分类号】:TP317【目录】:
致谢5-6摘要6-7ABSTRACT7-111 绪论11-15 1.1 项目背景介绍11 1.2 跑酷类游戏介绍11-13
1.2.1 发展历程12
1.2.2 未来发展12-13 1.3 论文主要工作13-14 1.4 论文组织结构14 1.5 本章小结14-152 相关技术15-19 2.1 Cocos2D-X引擎研发技术15-18
2.1.1 框架结构15-16
2.1.2 控件介绍16-17
2.1.3 动作功能17
2.1.4 粒子系统17-18 2.2 物理模拟和碰撞检测18 2.3 本章小结18-193 项目需求分析19-26 3.1 游戏介绍19 3.2 功能性需求19-25
3.2.1 游戏开始场景19-20
3.2.2 游戏加载场景20
3.2.3 世界地图场景20-23
3.2.4 游戏主场景23-25
3.2.5 关卡升级场景25 3.3 本章小结25-264 项目概要设计26-29 4.1 世界地图场景26-27 4.2 游戏主场景27-28 4.3 关卡升级场景28 4.4 本章小结28-295 项目详细设计与实现29-64 5.1 游戏开始场景29-31
5.1.1 详细设计29-30
5.1.2 具体实现30-31 5.2 游戏加载场景31-33
5.2.1 详细设计32
5.2.2 具体实现32-33 5.3 世界地图场景33-42
5.3.1 详细设计33-36
5.3.2 具体实现36-42 5.4 游戏主场景42-53
5.4.1 详细设计42-45
5.4.2 具体实现45-53 5.5 关卡升级场景53 5.6 游戏主场景实物53-63
5.6.1 详细设计54-56
5.6.2 具体实现56-63 5.7 本章小结63-646 项目测试64-69 6.1 标识界面测试64 6.2 游戏文字测试64-65 6.3 游戏声音测试65-66 6.4 菜单界面测试66-67 6.5 游戏主场景测试67-68 6.6 本章小结68-697 结论69-70参考文献70-71作者简历及攻读硕士学位期间取得的研究成果71-73学位论文数据集#@@
欢迎:、、)
支持CAJ、PDF文件格式
【共引文献】
中国期刊全文数据库
樊歆;;[J];成才之路;2008年29期
张敏;;[J];电脑编程技巧与维护;2010年16期
冯骏;;[J];电脑开发与应用;2012年01期
张超;陈骁;;[J];飞行器测控学报;2009年03期
蔺淑倩;郭小星;向嫄;;[J];电脑知识与技术;2012年21期
王兰;;[J];电脑知识与技术;2013年23期
陈中;;[J];高等教育研究学报;2014年04期
荣辉桂;陈旭毅;张向荣;;[J];计算机工程;2010年05期
荣辉桂;李玮;郭卫锋;;[J];计算机应用;2008年05期
占济舟;周献中;赵佳宝;;[J];计算机应用与软件;2010年11期
中国博士学位论文全文数据库
唐见兵;[D];国防科学技术大学;2009年
王璇;[D];厦门大学;2014年
中国硕士学位论文全文数据库
张艳丽;[D];郑州大学;2010年
刘德永;[D];中国海洋大学;2010年
黄新星;[D];武汉科技大学;2010年
朱静;[D];吉林大学;2011年
肖魏娜;[D];西南大学;2011年
孙乐平;[D];南京大学;2011年
杨威;[D];复旦大学;2010年
张俊花;[D];江南大学;2011年
郭志敏;[D];郑州大学;2011年
王芳;[D];山东大学;2011年
【相似文献】
中国硕士学位论文全文数据库
李文博;[D];北京交通大学;2015年
霍常伟;[D];北京交通大学;2012年
舒沂;[D];南京大学;2013年
廖雪清;[D];厦门大学;2014年
夏志海;[D];哈尔滨工业大学;2013年
张筱毅;[D];西安电子科技大学;2014年
周飞龙;[D];华中科技大学;2013年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 大众知识服务
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号原创。转载注明出处
前面一节尽管实现了一个跑动的人物,可是他只不过一个精灵在运行一个跑动的帧动画而已。这一节我要实现精灵和物理世界关联。让这个人跟实际的Parkour一样,有实际体积,会碰撞。
一个精灵怎么样和一个物理的body关联起来。使他具有一个刚体的特性。在这篇文章里面,我有简单讲了一下。有人说将一个body的userData设为精灵就能够了,事实上这是不够的。body的userData是一个void型指针,用来存放用户自己定义数据。假设只这样赋值一下,你会发现,精灵和刚体是分开运动的。这个userData是为了存放精灵,在兴许位置迭代的时候方便取出这个精灵,然后将它和刚体的位置同步。看里面的update函数。就知道还须要做位置迭代的。
为了方便,我把引擎自带的物理精灵CCPhysicsSprite改了一下,去掉了chipmunk的代码,保留了box2d的接口。这个就是一个box2d的物理精灵B2Sprite。
然后将Runner里面的成员变量mRunner类型改成B2Sprite,其创建函数也要改动为
然后实现initBody()和initShape()函数
然后跑起来就看到一个带碰撞区域的精灵
阅读(...) 评论()cocos2d-x3.0rc0中如何使视角跟随精灵移动(跑酷类游戏)
[问题点数:20分]
cocos2d-x3.0rc0中如何使视角跟随精灵移动(跑酷类游戏)
[问题点数:20分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。下次自动登录
现在的位置:
& 综合 & 正文
Cocos2d-x 酷跑游戏例子
可以拉到底部看下,鼠标点击屏幕,主角会跳下,遇到间隙或碰上较高建筑就挂了。在空中如果点击鼠标,主角会撑起一把雨伞,会有缓慢降落效果。主角挂的时候,会有主角的帽子升上的动画,不知为什么这个简单的动画看起来是那么的有趣,点睛之笔。
2. cocos2d-x 中菜单的使用
* menuItemOn;
* menuItemO
menuItemOn
= CCSprite::createWithSpriteFrameName("btn_new_on.png");
menuItemOff
= CCSprite::createWithSpriteFrameName("btn_new_off.png");
CCMenuItemSprite
* starGametItem = CCMenuItemSprite::create(
menuItemOff,
menuItemOn,
menu_selector(GameLayer::startGame));
menuItemOn
= CCSprite::createWithSpriteFrameName("btn_howto_on.png");
menuItemOff
= CCSprite::createWithSpriteFrameName("btn_howto_off.png");
CCMenuItemSprite
* howToItem = CCMenuItemSprite::create(
menuItemOff,
menuItemOn,
menu_selector(GameLayer::showTutorial));
= CCMenu::create(howToItem, starGametItem, NULL);
_mainMenu-&alignItemsHorizontallyWithPadding(120);
_mainMenu-&setPosition(ccp(_screenSize.width
* 0.5f, _screenSize.height * 0.54));
this-&addChild(_mainMenu,
kForeground);
3.创建水平移动效果(Parallax)
所谓酷跑游戏,很多时候你会发现主角的位置其实没动,动的都是背景,背景往左移,看起来主角就往右前进了,背景往后退,看起来主角就往前进了,所谓的相对运动。
那么这游戏是如何实现的呢?非常简单。拿背景举例子。下面这会放在update函数里执行。
_background-&setPositionX(_background-&getPosition().x
- _player-&getVector().x * 0.25f);
(_background-&getPositionX() & -_background-&getContentSize().width) {
= fabs(_background-&getPositionX())
- _background-&getContentSize().
_background-&setPositionX(-diffx);
这种方式效率可能比较低,但这种是所有平台通用的方式。查看了Cocos2d-x的示例,发现了一个叫ParallaxTest的例子,是可以混合几种东西一起使用动画。下面是官方的例子。
CCParallaxNode*
voidNode = CCParallaxNode::create();
voidNode-&addChild(background,
-1, ccp(0.4f,0.5f), CCPointZero);
voidNode-&addChild(tilemap,
1, ccp(2.2f,1.0f), ccp(0,-200) );
voidNode-&addChild(cocosImage,
2, ccp(3.0f,2.5f), ccp(200,800) );
CCActionInterval*
goUp = CCMoveBy::create(4, ccp(0,-500) );
CCActionInterval*
goDown = goUp-&reverse();
CCActionInterval*
go = CCMoveBy::create(8, ccp(-1000,0) );
CCActionInterval*
goBack = go-&reverse();
CCSequence*
seq = CCSequence::create(goUp, go, goDown, goBack, NULL);
voidNode-&runAction(
(CCRepeatForever::create(seq) ));
voidNode );
4. 如何随机?
游戏有时候就是需要很多随机情况,看下主角脚下的房子,有不同的颜色,有不同的高度,宽度,房子之间的间隙也不一定地出现。可能随机数是一个解决方案,这里用了一个更加有趣的方案,给定几组数组,然后对这数组进行洗牌。用一个index对数组取数,到尾了再回到0,进行洗牌。这种方式我想了下可以更好的控制难度。下面是建筑物高度的例子。
heights[] = {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3,4};
vector&int&
_blockHeights (heights, heights + sizeof(heights)
/ sizeof(int));
random_shuffle(_blockHeights.begin(),
_blockHeights.end());
blockHeight = _blockHeights[_currentHeightIndex];
_currentHeightIndex++;
(_currentHeightIndex == _blockHeights.size()) {
_currentHeightIndex
random_shuffle(_blockHeights.begin(),
_blockHeights.end());
5.碰撞检测
这没有用到box2d物理引擎,碰撞就需要自己来写了,非常简单,在游戏中主角只有跟下面的房子又碰撞,碰撞又只有分两种:
主角在上面随着重力加速度的存在,自由落体时,跟下面的房子相碰。
主角迎面碰上一个高的房子。
碰撞结果分两种:
主角掉下跟房子相碰时,不再往下降,房子看起来像一个实体。
主角迎面碰上一个高的房子时,主角产生一个向后退的效果。
主角是一个矩形,房子也是一个矩形,两种相碰就容易了。
(i = 0; i & i++) {
= (Block *) _blocks-&objectAtIndex(i);
(block-&getType() == kBlockGap) continue;
(player-&right() &= this-&getPositionX()
+ block-&left()
player-&left() &= this-&getPositionX()
+ block-&right()) {
(player-&bottom() &= block-&top() && player-&next_bottom() &= block-&top()
player-&top() & block-&top()) {
player-&setNextPosition(ccp(player-&getNextPosition().x,
block-&top() + player-&getHeight()));
player-&setVector
( ccp(player-&getVector().x, 0) );
player-&setRotation(0.0);
(i = 0; i & i++) {
= (Block *) _blocks-&objectAtIndex(i);
(block-&getType() == kBlockGap) continue;
((player-&bottom() & block-&top() && player-&top() & block-&bottom())
(player-&next_bottom() & block-&top() && player-&next_top() & block-&bottom())) {
(player-&right() &= this-&getPositionX()
+ block-&getPositionX()
player-&left() & this-&getPositionX()
+ block-&getPositionX()) {
player-&setPositionX(
this-&getPositionX()
+ block-&getPositionX() - player-&getWidth() * 0.5f );
player-&setNextPosition(ccp(this-&getPositionX()
+ block-&getPositionX() - player-&getWidth() * 0.5f, player-&getNextPosition().y));
player-&setVector
( ccp(player-&getVector().x * -0.5f, player-&getVector().y) );
(player-&bottom() + player-&getHeight() * 0.2f & block-&top()) {
player-&setState(kPlayerDying);
7.代码下载(请用7z解压)
8.参考书目
《Cocos2d-X by Example Beginner’s Guide》
猜你还喜欢:
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 quick cocos 跑酷 的文章

 

随机推荐