ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:31.23KB ,
资源ID:25774907      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25774907.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Cocos2dx制作太空射击游戏.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Cocos2dx制作太空射击游戏.docx

1、Cocos2dx制作太空射击游戏Cocos2d-x制作太空射击游戏在这篇教程里,我将向你展示如何利用 How to Makea Space Shooter iPhone Game里创建的工程制作一个太空游戏。这里有一个主要的区别这次是用跨平台的cocs2d-x开发。这就意味在教程里开发的游戏可以在你的iphone和andorid上运行。当然,再稍微做修改,你可以让它在Windows、Linux或者Mac下运行。深吸一口气,我们就要开始啦!Getting Started第一件事情就是下载并解压 space game resources ZIP file。就像我们在之前教程里面添加两个项目里都可以

2、使用的C+类一样,我们需要以同样的方式来添加这些资源文件使ios和andriod项目都可以引用同样的资源。我们把这些文件添加到Android工程的Resource目录下面,然后在ios项目里面引用这个目录。为了方便添加图片和其它资源到我们的工程里,我们需要把它们添加到 $PROJECT_HOMEResources目录(请记住 $PROJECT_HOME是你AndriodCocosd-X project-samplecocos2dxandroid的位置)。然而,我们的Eclipse工程只会显示$PROJECT_HOMEandroid目录下的文件,所以这确实是一个问题!幸运的是这里有一个简单的变通

3、方案:我们在$PROJECT_HOMEResources 目录下面建立一个符号链接,指向$PROJECT_HOMEandroidResources目录,这样Eclipse就可以看到它们了。接着,打开终端,在$PROJECT_HOMEandroid目录下运行如下的命令:1 ln-s./Resources./Resources.现在拷贝文件到Resources文件夹。请注意,由于跨平台可移植性的原因,你需要避免使用层级式的子目录。尽管子目录在iOS下运行起来很好,但是它们不一定在Android上运行地很好。举例来说,如果你有一个Sprites.pvr.ccz文件在一个SpriteSheet子目录里

4、,在Android里面使用CCSpriteBatchNode:bathNodeWithFile方法将会调用失败并返回一个空指针。所以,从 space game resources ZIP file里面把单个的文件拷贝到Resource文件夹下去,请记得不要创建任何子目录,仅仅拷贝一个个的文件过来就可以了。在资源文件里存在一个字体的子文件夹,从字体文件夹里把所有的文件拷贝到Resources里时,直接替换就可以了。此外,在压缩文件里有个Classes子文件夹,你不必把它添加到Resources目录下,把它删除就行了。接下来,让我们在iOS工程里引用这些文件,打开你的Xcode工程,创建一个新的G

5、roup叫做SharedResources。选择新的Group,在Inspector里点击按钮选择路径,然后把你在Android工程里的资源文件夹选择上。右键点击SharedResources组,选择添加文件,从Android文件夹里添加所有的文件。目前,你完成所有的项目配置了!增加一个太空飞船让我们试试,看是否工作!打开ClassesHelloWorldScene.h,在HelloWorld类开头加入下面代码(在已有public:行的上面)2 private:3 cocos2d:CCSpriteBatchNode*_batchNode;4 cocos2d:CCSprite*_ship;上面的

6、代码创建了两个私有实例变量 一个是sprite batch node,一个是太空飞船精灵现在切换到HelloWorldScene.cpp,在init方法里,删除从注释“2. add a menu item”到方法最后的所有代码,加入下面代码:5 _batchNode=CCSpriteBatchNode:batchNodeWithFile(Sprites.pvr.ccz);6 this-addChild(_batchNode);7 CCSpriteFrameCache:sharedSpriteFrameCache()-addSpriteFramesWithFile(Sprites.plist);

7、8 _ship=CCSprite:spriteWithSpriteFrameName(SpaceFlier_sm_1.png);9 CCSizewinSize=CCDirector:sharedDirector()-getWinSize();10 _ship-setPosition(ccp(winSize.width*0.1,winSize.height*0.5);11 _batchNode-addChild(_ship,1);12 returntrue;注意这些代码和你过去使用的Objective-C版的cocos2d 非常类似。API是有很多相同的地方的,仅仅是有一些和C+的语法不同。在A

8、ndroid模拟器中编译运行,你应该可以看到你的船出现在屏幕上。最妙的事情是在iOS上也能运行。增加视差滚动接下来,我们会加入宇宙背景,使它以视差滚动这种很酷的方式来滚动。首先,我们不得不在所有的类名前面加上cocos2d:这个名字空间,这太烦人了!所以在HelloWorldScene.h类声明前加入下面行:13 USING_NS_CC;接着在HelloWorld的private部分加入一些新的变量(注意我们不再需要加cocos2d前缀):14 CCParallaxNode*_backgroundNode;15 CCSprite*_spacedust1;16 CCSprite*_spacedu

9、st2;17 CCSprite*_planetsunrise;18 CCSprite*_galaxy;19 CCSprite*_spacialanomaly;20 CCSprite*_spacialanomaly2;然后,在HelloWorldScene.cpp的init方法中,return语句前加入下面代码:21 /1)CreatetheCCParallaxNode22 _backgroundNode=CCParallaxNode:node();/123 this-addChild(_backgroundNode,-1);24 /2)CreatethespriteswelladdtotheC

10、CParallaxNode25 _spacedust1=CCSprite:spriteWithFile(bg_front_spacedust.png);26 _spacedust2=CCSprite:spriteWithFile(bg_front_spacedust.png);27 _planetsunrise=CCSprite:spriteWithFile(bg_planetsunrise.png);28 _galaxy=CCSprite:spriteWithFile(bg_galaxy.png);29 _spacialanomaly=CCSprite:spriteWithFile(bg_s

11、pacialanomaly.png);30 _spacialanomaly2=CCSprite:spriteWithFile(bg_spacialanomaly2.png);31 /3)Determinerelativemovementspeedsforspacedustandbackground32 CCPointdustSpeed=ccp(0.1,0.1);33 CCPointbgSpeed=ccp(0.05,0.05);34 /4)AddchildrentoCCParallaxNode35 _backgroundNode-addChild(_spacedust1,0,dustSpeed,

12、ccp(0,winSize.height/2);/236 _backgroundNode-addChild(_spacedust2,0,dustSpeed,ccp(_spacedust1-getContentSize().width,winSize.height/2);37 _backgroundNode-addChild(_galaxy,-1,bgSpeed,ccp(0,winSize.height*0.7);38 _backgroundNode-addChild(_planetsunrise,-1,bgSpeed,ccp(600,winSize.height*0);39 _backgrou

13、ndNode-addChild(_spacialanomaly,-1,bgSpeed,ccp(900,winSize.height*0.3);40 _backgroundNode-addChild(_spacialanomaly2,-1,bgSpeed,ccp(1500,winSize.height*0.9);再一次说明,这段代码和我们的如何使用cocos2d制作一个太空射击游戏非常类似,只是有些小的句法变化。你可以比较一下2个教程在句法上的不同。Android模拟器中编译运行,你应该可以看到一个宇宙场景的启动,同样的,也能在iphone上运行。现在使背景滚动,在HelloWorldScene

14、.h中预先声明update方法 你可以在private或public部分加入下面代码,但是既然update方法是内部使用的,所以作为一个private方法更恰当:41 /scheduledUpdate42 voidupdate(cocos2d:ccTimedt);然后在HelloWorldScene.cpp 最后加入下面的方法实现43 voidHelloWorld:update(ccTimedt)44 CCPointbackgroundScrollVert=ccp(-1000,0);45 _backgroundNode-setPosition(ccpAdd(_backgroundNode-ge

15、tPosition(),ccpMult(backgroundScrollVert,dt);46 最后,在init方法末尾(但是在最后的return语句前)调用scheduleUpdate方法47 this-scheduleUpdate();编译运行,你将会看到背景滚动!持续滚动这时,你应该注意到了背景滚出屏幕后没有循环,那么我们来修这个bug在我们的 如何使用cocos2d制作一个太空射击游戏教程中,我们通过Objective-c的分类(category)扩展了CCParallaxNode类来实现。不幸的是,C+中是不存在分类的,所以我们需要借助继承来实现之。我们将去定义一个CCParalla

16、xNode扩展类来扩展标准的CCParallaNode。这样做虽然不如Objective-C优雅,但是有时我们需要为软件可移植性做一些牺牲。在Xcode中,在Glasses group上单击右键,选择New File。选择iOSC and C+C+文件末尾,点击Next,为他命名为CCParallaxNodeExtras.cpp,存储到$PROJECT_HOMEClasses,然后点击创建。然后重复上述过程,但要选择iOSC and C+Header文件模板,来创建CCParallaxNodeExtras.h用下面的代码替换CCParallaxNodeExtras.h中的内容48 #ifnde

17、f49 Cocos2DxFirstIosSample_CCParallaxNodeExtras_h#define50 Cocos2DxFirstIosSample_CCParallaxNodeExtras_h#include“cocos2d.h”USING_NS_CC;classCCParallaxNodeExtras:publicCCParallaxNode51 public:/NeedtoprovideourownconstructorCCParallaxNodeExtras();/justtoavoiduglylatercastandalsoforsafety52 staticCCPar

18、allaxNodeExtras*node();/Facilitymethod(weexpecttohaveitsooninCOCOS2DX)voidincrementOffset(CCPoint53 offset,CCNode*node);#endif这里我们为CCParallaxNode添加一个新的方法(incrementOffset),我们用它来更新parallax node 每个 child 的位置。当背景移动出屏幕左端的时候我们会使用它来将背景放到屏幕的右端,来实现持续的滚动。 将下面的代码替换到CCParallaxNodeExtras.cpp54 #includeCCParallax

19、NodeExtras.h55 /HacktoaccessCCPointObject(whichisnotapublicclass)56 classCCPointObject:CCObject57 CC_SYNTHESIZE(CCPoint,m_tRatio,Ratio)58 CC_SYNTHESIZE(CCPoint,m_tOffset,Offset)59 CC_SYNTHESIZE(CCNode*,m_pChild,Child)/weakref60 ;61 /Needtoprovideourownconstructor62 CCParallaxNodeExtras:CCParallaxNod

20、eExtras()63 CCParallaxNode:CCParallaxNode();/callparentconstructor64 65 CCParallaxNodeExtras*CCParallaxNodeExtras:node()66 returnnewCCParallaxNodeExtras();67 68 voidCCParallaxNodeExtras:incrementOffset(CCPointoffset,CCNode*node)69 for(unsignedinti=0;inum;i+)70 CCPointObject*point=(CCPointObject*)m_p

21、ParallaxArray-arri;71 CCNode*curNode=point-getChild();72 if(curNode-isEqual(node)73 point-setOffset(ccpAdd(point-getOffset(),offset);74 break;75 76 77 注意,很不幸的是CCPointObject在Cocos2d中并不是公共的类,所以我们需要借住一些小手段来hack。(重定义它为我们的类,并具有相同的签名)。虽然它能工作的很好,但是他的缺点是,如果CCPointObject改动了,你这里也要跟着改动,否则程序会崩溃。代码的重点是incrementO

22、ffset方法,他和 如何使用cocos2d制作一个太空射击游戏中的实现相同,只是用了不同的语言。下一步,选择HelloWorldScene.h,在文件顶部的#include 语句之后添加这些代码:78 #includeCCParallaxNodeExtras.h然后像下面的代码一样,将private区域中_backgroundNode定义由CCParallaNode改为CCParallaxNodeExtras79 CCParallaxNodeExtras*_backgroundNode;然后选择HelloWorldScene.cpp 用下面的代码替换掉section #1(_backgrou

23、ndNode创建的地方)的第一行。80 _backgroundNode=CCParallaxNodeExtras:node();最后,添加下面的代码,到update 方法的底部。81 CCArray*spaceDusts=CCArray:arrayWithCapacity(2);82 spaceDusts-addObject(_spacedust1);83 spaceDusts-addObject(_spacedust2);84 for(intii=0;iicount();ii+)85 CCSprite*spaceDust=(CCSprite*)(spaceDusts-objectAtInde

24、x(ii);86 floatxPosition=_backgroundNode-convertToWorldSpace(spaceDust-getPosition().x;87 floatsize=spaceDust-getContentSize().width;88 if(xPositionincrementOffset(ccp(spaceDust-getContentSize().width*2,0),spaceDust);89 90 91 CCArray*backGrounds=CCArray:arrayWithCapacity(4);92 backGrounds-addObject(_

25、galaxy);93 backGrounds-addObject(_planetsunrise);94 backGrounds-addObject(_spacialanomaly);95 backGrounds-addObject(_spacialanomaly2);96 for(intii=0;iicount();ii+)97 CCSprite*background=(CCSprite*)(backGrounds-objectAtIndex(ii);98 floatxPosition=_backgroundNode-convertToWorldSpace(background-getPosi

26、tion().x;99 floatsize=background-getContentSize().width;100 if(xPositionincrementOffset(ccp(2000,0),background);101 102 你可以看到,NSArray的替代品是基于STL (C+标准库) 实现的CCArray。我们用可以帮我们自动释放对象的arrayWithCapacity构造函数。注意这里同样也有一个更先进的CCMutableArray来用于存储集合元素。最后的修改-因为你添加了新文件,你需要把它添加到android工程的Makefile来让他编译正确。于是用Eclipse打开

27、ClassesAndroid.mk然后改动行LOCAL_SRC_FILES为下面的代码。103 LOCAL_SRC_FILES:=AppDelegate.cpp104 HelloWorldScene.cpp105 CCParallaxNodeExtras.cpp编译运行,现在背景可以无限滚动了!添加星星添加星星是非常简单的,只是添加下面的代码到HelloWorldScene.cpp的init方法的return之前。106 HelloWorld:addChild(CCParticleSystemQuad:particleWithFile(Stars1.plist);107 HelloWorld:

28、addChild(CCParticleSystemQuad:particleWithFile(Stars2.plist);108 HelloWorld:addChild(CCParticleSystemQuad:particleWithFile(Stars3.plist);编译运行,漂亮!他已经开始看起来像一个太空游戏了。使用加速计来移动飞船在之前的Cocos2D space shooter tutorial里面,我们使用ios的加速计api来检测加速计输入。很明显,ios下面的加速计api是不可以跨平台的,那么我们怎么办呢?幸运的是,cocos2d-x对加速计进行了封装,我们可以不用关心具体

29、平台api,直接使用抽象后的加速计api就可以了。让我们看看它是怎么工作的吧。首先,在HelloWorldScnee.H头文件里面添加一个新的私有成员变量:109 float_shipPointsPerSecY;然后,添加一个新的public方法声明:110 virtualvoiddidAccelerate(CCAcceleration*pAccelerationValue);然后在HelloWorldScene.cpp的init方法的return语句之前添加下列代码:111 this-setIsAccelerometerEnabled(true);接下来,在HelloWorldScene.C

30、PP文件底部添加下面这些新方法定义:112 voidHelloWorld:didAccelerate(CCAcceleration*pAccelerationValue)113 #defineKFILTERINGFACTOR0.1114 #defineKRESTACCELX-0.6115 #defineKSHIPMAXPOINTSPERSEC(winSize.height*0.5)116 #defineKMAXDIFFX0.2117 doublerollingX;118 /Cocos2DXinvertsXandYaccelerometerdependingondeviceorientation

31、119 /inlandscapemoderightx=-yandy=x!(Strangeandconfusingchoice)120 pAccelerationValue-x=pAccelerationValue-y;121 rollingX=(pAccelerationValue-x*KFILTERINGFACTOR)+(rollingX*(1.0-KFILTERINGFACTOR);122 floataccelX=pAccelerationValue-x-rollingX;123 CCSizewinSize=CCDirector:sharedDirector()-getWinSize();124 floataccelDiff=accelX-KRESTACCELX;125 floatac

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1