Cocos2D-X_SimpleGame_%26_初学者教程

上传人:沈*** 文档编号:157323452 上传时间:2022-09-29 格式:DOC 页数:32 大小:91.50KB
收藏 版权申诉 举报 下载
Cocos2D-X_SimpleGame_%26_初学者教程_第1页
第1页 / 共32页
Cocos2D-X_SimpleGame_%26_初学者教程_第2页
第2页 / 共32页
Cocos2D-X_SimpleGame_%26_初学者教程_第3页
第3页 / 共32页
资源描述:

《Cocos2D-X_SimpleGame_%26_初学者教程》由会员分享,可在线阅读,更多相关《Cocos2D-X_SimpleGame_%26_初学者教程(32页珍藏版)》请在装配图网上搜索。

1、第一章 如何在多种平台上创建新的cocos2d-x项目 第一章 如何在多种平台上创建新的cocos2d-x项目今天我们将开始学习如何把著名的Cocos2dSimpleGame从objc 移植到c+,通过使用cocos2d-x引擎,在win32/iPhone/android/沃Phone这些平台上运行它。Cocos2dSimpleGame是由Ray Wenderlich编写。几乎所有的cocos2d-iphone初学者都曾读过他写的系列教程。首先,你需要在http:/download.cocos2d-x.org/ 下载最新稳定版的cocos2d-x。在我写这篇文章时,该版本还是cocos2d-0

2、.99.5-x-0.8.2,之后更新游戏资源到0.9.1。其中0.99.5标记表示这一c+接口是基于它的母版本cocos2d-iphone 0.99.5的,而后缀0.8.2则表示为我们的cocos2d-x接口的版本号。Cocos2dxSimpleGame的源码在这里下载:http:/www.cocos2d-x.org/attachments/535/Cocos2dxSimpleGame-0.9.1.rar这个源码我已经在cocos2d-1.0.1-x-0.9.1上测试过了。让我们开始吧。你可以从下面的目录直接跳到你所用的平台。第一章 如何在多种平台上创建新的cocos2d-x项目1 从win3

3、2开始1.2在VisualStudio上安装Wizard1.3 创建一个新的cocos2d-win32 项目1.4 编译并运行1.5 运气差的人可以参考这里2 从沃Phone开始3 从iPhone开始4 从Android开始4.1 Windows下4.1.1 创建项目4.1.2 编译原生代码4.1.3 把项目移入eclipse4.1.4 编译java代码并运行4.2 Linux下1.从win32 开始Cocos2d-win32 接口已在WinXp+VistualStudio2008/2010下测试正常。但在vista/win7下,我无法保证它运行良好。如果你根据教程,还是无法正常运行cocos

4、2d-win32接口,这里有篇参考。1.2在VisualStudio上安装Wizard在你下载并解压完源码包之后,找到cocos2d-x 文件夹,点击“build-win32.bat”来编译整个项目,之后点击“install-templates-msvc.bat”来安装wizard。bat脚本会自动对应vs2008或者2010。更多细节,请参考这篇文档Coscos2d-x Application Wizard for Visual Studio 用户指导1.3 创建一个新的cocos2d-win32 项目现在你可以通过VS2008打开cocos2d-x/cocos2d-win32.vs2008

5、.sln,我们可以从这看到库文件。右键点击“Solution cocos2d-win32.vc2008”,之后选择“Add-New Project”,选择“cocos2d-x - cocos2d-win32 Application”,在Name一栏写上“Cocos2dxSimpleGame”,并使用默认的路径设置。备注:在win32&沃Phone接口,游戏的路径必须放下cocos2d-x的根目录下。点击“OK-Next”,不勾选 Box2D,因为Cocos2dSimpleGame不使用物理系统。请确保“SimpleAudioEngine in CocosDenshion”是勾选的,之后点“Fi

6、nished”。1.4 编译并运行现在我们可以看到“Cocos2dSimpleGame.win32”已经创建好了,我们的游戏现在依赖于libcocos2d & libCocosDenshion这两个库。好,编译并运行,通常情况下,如果你不是运气那么差的话,你会看到下面这张图。1.5 运气差的人可以参考这里或许有些人不能成功地在win32上运行这个HelloWorld模板,这是因为cocos2d-win32接口基于PowerVR OpenGL ES 1.1 SDK for PC Emulation(Windows vista/XP 版)我们把PowerVR的库集成到了路径cocos2d-x-ro

7、ot/cocos2dx/platform/win32/third_party/libraries里因此: 对于win7用户:PowerVR还没有发布Windows 7的接口。但你依然可以试一试。许多论坛里的win7 用户成功运行过这个例子。l 对于winxp/vista 用户:如果HelloWorld因为任何glXXX或者eglXXX函数而崩溃,请更新你的显卡驱动,去NVIDIA/ATI/INTEL的网站找到最新的驱动。l 对于运气差的用户:你可以动手在Xcode里创建cocos2d-x 项目,或者去教堂/庙里拜拜找点运气:Pl2.从沃Phone开始如果你是一位沃Phone开发者,以上的win

8、32步骤同样适用于你。仅有3处不同:1. 你必须把cocos2d-x-root设置到D:/Work7目录里,沃Phone有严格的app 路径要求。2. 请用VS2008打开D:/Work7/cocos2d-x/cocos2d-wophone.sln,而不是cocos2d-win323. 请在“Add New Project”对话框里选择“cocos2d-wophone application”,如下所示而cocos2d-wophone的 HelloWorld编译运行后的结果如下3.从iPhone开始我们从0.8.2版开始就有了对应Xcode的模板。你可以像创建cocos2d-iphone项目那

9、样简单地来创建cocos2d-x项目。首先,找到cocos2d-x的根目录,之后在mac的shell下运行install-templates.sh./install-templates-xcode.sh -u -f你可以在这里选择你的Xcode版本,xcode3或是xcode4。安装完成之后,你就可以打开Xcode,之后点击“Creat a new Xcode project”。你会看到这个对话框选择“cocos2d-x application”,之后点“choose”,输入项目的名称。Xcode将会帮你创建好cocos2d-x的项目。请注意,iOS的cocos2d-x项目可以在任何你想要的地

10、方被创建。Xcode里的wizard会复制所有cocos2dx、CocosDenshion等库到项目的文件夹里。这和VisualStudio上win32&沃Phone的wizard不同。好了,之后编译运行,你会看到如下的HelloWorld效果图4.从Android开始Ndk中Android的项目有两部分,一个对应的是java,另一个对应c+。我们将会运行creat-android-project.bat(或者在linux下运行create-android-project.sh)来创建Android ndk项目。4.1 Windows下4.1.1创建项目“create-android-proj

11、ect.bat”在cocos2d-x的根目录里。你应该根据你的环境做一些改动。为了适应我的配置环境,我在create-android-project.bat里改动一些设置。 set_CYGBIN=C:cygwinbinlCygwin bin的路径 set_ANDROIDTOOLS=D:androidandroid-sdk-windowstoolslandroid sdk tools的路径 set_NDKROOT=D:androidandroid-ndk-r5blndk的根目录现在你就可以运行“create-android-project.bat”来创建一个android项目:进入cocos2d

12、-x的根目录,双击create-android-project.bat,输入项目的名称以及target id,如下所示在版本0.8.2之后,你可能会被要求键入package的路径,路径的格式为:org.cocos2dx.Cocos2dxSimpleGame。target id 根据不同的环境有不同的区别,你应当确保输入有效的target id。目前cocos2dx支持2.1-update1和Android2.2,其他版本还未测试过。4.1.2编译原生代码现在你可以在cocos2d-x的根目录下看到一个命名为“Cocos2dxSimpleGame”的文件夹,运行你的cygwin,之后进去“Coc

13、os2dxSimpleGame/android”,之后运行“build_native.sh”。4.1.3把项目移入到eclipse运行你的eclipse,点击 File-New-Project-Android Project,之后像下面这样移入项目4.1.4编译java代码并运行右击项目并选“Build Project”,之后右击项目并选“Run As”-“Android Application”。之后你就会看到如下结果:4.2 Linux下你应该运行“creat-android-project.sh”来创建Android项目,其他步骤同windows下一样。你应该在你的环境下定义一些环境变量

14、来运行“create-android-project.sh”。初始化一些环境变量。 NDK_ROOTlndk的根目录 ANDROID_SDK_ROOTlandroid sdk的根目录http:/www.cocos2d-x.org/projects/cocos2d-x/wiki/Chapter_1_-_How_to_Create_a_New_cocos2d-x_project_on_multi-platforms第二章 如何添加一个精灵1.1 在iPhone上添加资源1.2 在Android上添加资源1.3 在win32上添加资源1.4 在沃Phone上添加资源2. 添加一个精灵要点1要点2教程

15、中的源码可以在这下载:你可以自己按照文章一步步来完成游戏,或者直接下载完整的代码,简单地编译运行。1.加入图片资源这里有三张由Ray Wenderlich的妻子所做的图片,它们将会用在Cocos2dSimpleGame里。学完第一章在多种平台上创建新的cocos2d-x项目后,你现在应该有一个cocos2d-x/Cocos2dxSimpleGame文件夹。请下载这些图片,并把它们复制到cocos2d-x/Cocos2dxSimpleGame/Resources文件夹里。之后回到各种平台上的IDE上来。1.1在iPhone上添加资源非常简单,打开Xcode,然后点击Add-Existing Fi

16、les from the context menu of Cocos2dxSimpleGame/Resources group,添加上面的三张图片。请注意,你应当在“Add To Targets”一栏里勾选Cocos2dxSimpleGame1.2在Android上添加资源如果你是运行build_native.sh 来编译的话,你应该把图片复制到Resources文件夹,否则就把图片文件复制到“assets”文件夹。1.3在win32上添加资源Win32的可执行文件会在它的相关路径中寻找资源。因此我们必须手动的把图片文件从cocos2d-x/Cocos2dxSimpleGame/Resourc

17、es 文件夹复制到cocos2d-x/Debug.win32 文件夹。但像我这样的懒人,总能找到偷懒的办法。把这行写入Post-Build Event- Command Linexcopy /Y /E .Resources*.* $(OutDir)每次编译完成时,VistualStudio会复制资源到可执行的路径。1.4在沃Phone上添加资源在沃Phone 游戏里使用zip格式的资源包是非常推荐的。如果你仍然对此不太清楚,请阅读How to use ZIP resource package on cocos2d-uphone2.添加一个精灵你现在会发现把cocos2d 游戏从objc移植到c

18、+是多么的简单。打开HelloWorldScene.cpp,替换init方法如下所示:1bool HelloWorld:init()23 bool bRet = false;4 do 5 6 /7 / super init first8 /910 CC_BREAK_IF(! CCLayer:init();1112 /13 / add your codes below.14 /1516 / 1. Add a menu item with X image, which is clicked to quit the program.1718 / Create a close menu item wi

19、th close icon, its an auto release object.19 CCMenuItemImage *pCloseItem = CCMenuItemImage:itemFromNormalImage(20 CloseNormal.png,21 CloseSelected.png,22 this,23 menu_selector(HelloWorld:menuCloseCallback);24 CC_BREAK_IF(! pCloseItem);2526 / Place the menu item bottom-right conner.27 pCloseItem-setP

20、osition(ccp(CCDirector:sharedDirector()-getWinSize().width - 20, 20);2829 / Create a menu with the close menu item, its an auto release object.30 CCMenu* pMenu = CCMenu:menuWithItems(pCloseItem, NULL);31 pMenu-setPosition(CCPointZero);32 CC_BREAK_IF(! pMenu);3334 / Add the menu to HelloWorld layer a

21、s a child layer.35 this-addChild(pMenu, 1);3637 /38 / 2. add your codes below.3940 CCSize winSize = CCDirector:sharedDirector()-getWinSize();41 CCSprite *player = CCSprite:spriteWithFile(Player.png, 42 CCRectMake(0, 0, 27, 40) );43 player-setPosition( ccp(player-getContentSize().width/2, winSize.hei

22、ght/2) );44 this-addChild(player);4546 bRet = true;47 while (0);4849 return bRet;50上面的代码中,我实际上仅添加了“2.Add your codes below”那一节的内容。你可以从下面的对比中,看到如何一行一行地把cocos2d-iphone代码简单地转化为cocos2d-x跨平台的代码。1/ cpp with cocos2d-x2bool HelloWorld:init()34 if ( CCLayer:init() )5 6 CCSize winSize = CCDirector:sharedDirect

23、or()-getWinSize();7 CCSprite *player = CCSprite:spriteWithFile(Player.png, 8 CCRectMake(0, 0, 27, 40) );9 player-setPosition( ccp(player-getContentSize().width/2, 10 winSize.height/2) );11 this-addChild(player);12 13 return true;141/ objc with cocos2d-iphone2-(id) init34 if( (self=super init ) 5 6 C

24、GSize winSize = CCDirector sharedDirector winSize;7 CCSprite *player = CCSprite spriteWithFile:Player.png 8 rect:CGRectMake(0, 0, 27, 40) ;9 player.position = ccp(player.contentSize.width/2, 10 winSize.height/2);11 self addChild:player;12 13 return self;14要点11. 不要使用C+里的_super来替代objc里的super。关键字_super

25、仅能在VC+中被识别,但是无法被GCC给编译。因此你最好调用其父类名称,CCLayer:init()2. 这里没有属性的概念。因此在objc里的属性,我们用get/set方法来代替。例如,如果你想要获取CCSprite的contentSize属性,你必须调用sprite-getContentSize()方法。contentSize的第一个字母应该为大写的“C”,之后为它加上“get”前缀。3. 使用setter来设置属性的值,“player.position=”,应变为player-setPosition()4. 但是访问结构体的成员不遵循这一规则。例如,在winSize结构体中,没有“wid

26、th”&“height”的getter/setter5. 你不需要像objc那样,解释每一个参数的用途。例如,CCSprite spriteWithFile, rect;直接转换为CCSprite:spriteWithFile(, .);6. 我们已经完成了一些常用的CGGeometry函数,诸如CGRectMake, CGPointMake, CGSizeMake, CGPointZero, CGSizeZero, CGRectZero。你可以在cocos2dx/include/CCGemoetry.h中找到它们。它们的用途和iOS一样。仅有一点点不同在于它们的前缀,为了避免命名上的冲突,在

27、cocos2d-x里,前缀为CG、NS、UI的类都统一改成了CC前缀。7. 所有cocos2d-x里的游戏元素,例如sprite、layer、scene、label、action都在heap里被分配了内存。因此我们必须用指针“-”来调用它们的方法。8. 在cpp里,用关键字“this”来代替objc里的“self”9. 现在init方法的返回值是“bool”类型了。在cpp里没有关键字“id”,因此那些返回值为“id”的方法要么替换成对象的指针,要么换成bool。10. 对于Android,由于标题栏占用了一些空间,因此你需要在cpp里这样设置玩家的位置(player.contenSize.w

28、idth/2 + 40, winSize.height/2)。好了,我们可以编译并运行代码了。现在忍者一袭黑衣,躲在黑暗中闪着红眼。要玩游戏的话,我们必须把背景改成白色的。这非常简单,修改HelloWorld,使它继承CCLayerColor,而不是CCLayer。首先,修改HelloWorldScene.h的声明部分1/ cpp with cocos2d-x2class HelloWorld : public cocos2d:CCLayerColor1/ objc with cocos2d-iphone2interface HelloWorld : CCLayerColor之后修改Hello

29、World:init()内的初始部分把1if ( !CCLayer:init() )23 return false;4改成1if ( !CCLayerColor:initWithColor( ccc4(255,255,255,255) ) )23 return false;4这里有些和RayWenderlich的代码不同,因为我偏好防守型的代码风格。正常的代码是,if super init 成功了,then 执行什么什么,我比较偏好if init失败了,先做出错的处理,之后再编写正确的流程。好了,回到正题。让我们来继续比较c+与objc的转换1/ cpp with cocos2d-x2if (

30、 CCLayerColor:initWithColor( ccc4(255,255,255,255) ) )1/ objc with cocos2d-iphone2if ( self = super initWithColor:ccc4(255,255,255,255) )要点21. 在c+里继承默认为private继承,因此需要在CCLayerColor类声明前加上“public”。2. Cocos2d-iphone的主要作者RicardoQuesada建议我们在cocos2d-x中使用命名空间。检查你所调用的cocos2d-x类是在“cocos2d”命名空间还是在“CocosDenshio

31、n”命名空间是非常重要的。编译并运行,之后你就会看到小英雄孤单地站在白色的背景里。iPhone:Android:沃Phone:Win32:http:/www.cocos2d-x.org/projects/cocos2d-x/wiki/Chapter_2_-_How_to_Add_a_sprite第三章如何移动精灵我们在第二章如何添加一个精灵中,为游戏场景添加了一个精灵。但一个英雄或许太过孤单,我们应该加入一些敌人,让他来打败。void addTarget()函数将会帮我们完成这一工作,敌人将会以随机的速度,从游戏场景左移动到右。在HelloWorldScence.h里声明void addTar

32、get(),并在HelloWorldScene.cpp里添加以下的代码,(请不要忘记在HelloWorldScene.cpp的开头加入using namespace cocos2d)1/ cpp with cocos2d-x2void HelloWorld:addTarget()34 CCSprite *target = CCSprite:spriteWithFile(Target.png, 5 CCRectMake(0,0,27,40) );67 / Determine where to spawn the target along the Y axis8 CCSize winSize =

33、CCDirector:sharedDirector()-getWinSize();9 int minY = target-getContentSize().height/2;10 int maxY = winSize.height11 - target-getContentSize().height/2;12 int rangeY = maxY - minY;13 / srand( TimGetTicks() );14 int actualY = ( rand() % rangeY ) + minY;1516 / Create the target slightly off-screen al

34、ong the right edge,17 / and along a random position along the Y axis as calculated18 target-setPosition( 19 ccp(winSize.width + (target-getContentSize().width/2), 20 actualY) );21 this-addChild(target);2223 / Determine speed of the target24 int minDuration = (int)2.0;25 int maxDuration = (int)4.0;26

35、 int rangeDuration = maxDuration - minDuration;27 / srand( TimGetTicks() );28 int actualDuration = ( rand() % rangeDuration )29 + minDuration;3031 / Create the actions32 CCFiniteTimeAction* actionMove = 33 CCMoveTo:actionWithDuration( (ccTime)actualDuration, 34 ccp(0 - target-getContentSize().width/

36、2, actualY) );35 CCFiniteTimeAction* actionMoveDone = 36 CCCallFuncN:actionWithTarget( this, 37 callfuncN_selector(HelloWorld:spriteMoveFinished);38 target-runAction( CCSequence:actions(actionMove, 39 actionMoveDone, NULL) );401/ objc with cocos2d-iphone2-(void)addTarget 34 CCSprite *target = CCSpri

37、te spriteWithFile:Target.png 5 rect:CGRectMake(0, 0, 27, 40);67 / Determine where to spawn the target along the Y axis8 CGSize winSize = CCDirector sharedDirector winSize;9 int minY = target.contentSize.height/2;10 int maxY = winSize.height - target.contentSize.height/2;11 int rangeY = maxY - minY;1

38、213 int actualY = (arc4random() % rangeY) + minY;1415 / Create the target slightly off-screen along the right edge,16 / and along a random position along the Y axis as calculated17 target.position = 18 ccp(winSize.width + (target.contentSize.width/2), 19 actualY);20 self addChild:target;2122 / Deter

39、mine speed of the target23 int minDuration = 2.0;24 int maxDuration = 4.0;25 int rangeDuration = maxDuration - minDuration;2627 int actualDuration = (arc4random() % rangeDuration)28 + minDuration;2930 / Create the actions31 id actionMove = 32 CCMoveTo actionWithDuration:actualDuration33 position:ccp

40、(-target.contentSize.width/2, actualY);34 id actionMoveDone = 35 CCCallFuncN actionWithTarget:self36 selector:selector(spriteMoveFinished:);37 target runAction:CCSequence actions:actionMove, 38 actionMoveDone, nil; 39这里用callfuncN_selector(HelloWorld:spriteMoveFinished)回调了spriteMoveFinished方法,我们需要在He

41、lloWorldScene.h里声明并如下来定义它,1/ cpp with cocos2d-x2void HelloWorld:spriteMoveFinished(CCNode* sender)34 CCSprite *sprite = (CCSprite *)sender;5 this-removeChild(sprite, true);61/ objc with cocos2d-iphone2-(void)spriteMoveFinished:(id)sender 34 CCSprite *sprite = (CCSprite *)sender;5 self removeChild:sp

42、rite cleanup:YES; 6要点1. 关于随机函数。srand和rand是C标准库函数。对于每一个平台来说,你可以先获取毫秒级时间来得到一个随机数。在沃Phone上,这个函数是TimGetTickes(),而在iPhone上,你可以直接通过arc4random()函数来获得随机数。2. Objc中的YES和NO,在cpp中变为true和false。3. 回调函数,在objc中用selector:selector(spriteMoveFinished),但在cpp中实现就比较复杂了,你可以参考cocos2dxincludeselector_protocol.h里的声明。一共有5种回调函

43、数类型 schedule_selectorl callfunc_selectorl callfuncN_selectorl callfuncND_selectorl menu_selectorl如何使用它们,根据所用函数的定义来决定。比如使用CCTimer:initWithTarget函数,它的第二个参数是SEL_SCHEDULE类型,到selector_protocol.h里查一下,可以看到对应的是schedule_selector(_SELECTOR)宏,所以调用时就需要在类里头实现一个void MyClass:MyCallbackFuncName(ccTime)函数,然后把schedul

44、e_selector(MyClass:MyCallbackFuncName)作为CCTimer:initWithTarget的第二个参数传入。之后,我们应该定时地为游戏加入敌人,把以下代码加入到init()函数的返回值前。1/ cpp with cocos2d-x2/ Call game logic about every second3this-schedule( schedule_selector(HelloWorld:gameLogic), 1.0 );1/ objc with cocos2d-iphone2/ Call game logic about every second3sel

45、f schedule:selector(gameLogic:) interval:1.0;然后在HelloWorldScence.cpp里实现gameLogic()。请注意gameLogic()应该声明为pubilc,否则是无法回调的。1/ cpp with cocos2d-x2void HelloWorld:gameLogic(ccTime dt)34 this-addTarget();51/ objc with cocos2d-iphone2-(void)gameLogic:(ccTime)dt34 self addTarget;5好了,所有事情都做完了,编译并运行,好好享用你的成果。iP

46、honeAndroid沃PhoneWin32http:/www.cocos2d-x.org/projects/cocos2d-x/wiki/Chapter_3_-_How_to_Move_a_sprite第四章如何发射子弹现在,我们想让英雄能发射子弹来消灭敌人,添加以下的代码,来设置图层支持触摸。1/ cpp with cocos2d-x2this-setIsTouchEnabled(true);1/ objc with cocos2d-iphone2self.isTouchEnabled = YES;这样我们就能接受到touch event的了。在HelloWorldScene.h里声明回调

47、函数“void ccTouchesEnded(cocos2d:CCSet* touches, cocos2d:CCEvent* event);”,并在HelloWorldScene.cpp实现这个函数。1/ cpp with cocos2d-x2void HelloWorld:ccTouchesEnded(CCSet* touches, CCEvent* event)34 / Choose one of the touches to work with5 CCTouch* touch = (CCTouch*)( touches-anyObject() );6 CCPoint location

48、= touch-locationInView(touch-view();7 location = CCDirector:sharedDirector()-convertToGL(location);89 / Set up initial location of projectile10 CCSize winSize = CCDirector:sharedDirector()-getWinSize();11 CCSprite *projectile = CCSprite:spriteWithFile(Projectile.png, 12 CCRectMake(0, 0, 20, 20);13 p

49、rojectile-setPosition( ccp(20, winSize.height/2) );1415 / Determinie offset of location to projectile16 int offX = location.x - projectile-getPosition().x;17 int offY = location.y - projectile-getPosition().y;1819 / Bail out if we are shooting down or backwards20 if (offX addChild(projectile);2425 /

50、 Determine where we wish to shoot the projectile to26 int realX = winSize.width27 + (projectile-getContentSize().width/2);28 float ratio = (float)offY / (float)offX;29 int realY = (realX * ratio) + projectile-getPosition().y;30 CCPoint realDest = ccp(realX, realY);3132 / Determine the length of how

51、far were shooting33 int offRealX = realX - projectile-getPosition().x;34 int offRealY = realY - projectile-getPosition().y;35 float length = sqrtf(offRealX * offRealX) 36 + (offRealY*offRealY);37 float velocity = 480/1; / 480pixels/1sec38 float realMoveDuration = length/velocity;3940 / Move projecti

52、le to actual endpoint41 projectile-runAction( CCSequence:actions(42 CCMoveTo:actionWithDuration(realMoveDuration, realDest),43 CCCallFuncN:actionWithTarget(this, 4445 callfuncN_selector(HelloWorld:spriteMoveFinished), 46 NULL) );471/ objc with cocos2d-iphone2- (void)ccTouchesEnded:(NSSet *)touches w

53、ithEvent:(UIEvent* event)34 / Choose one of the touches to work with5 UITouch *touch = touches anyObject;6 CGPoint location = touch locationInView:touch view;7 location = CCDirector sharedDirector convertToGL:location;89 / Set up initial location of projectile10 CGSize winSize = CCDirector sharedDir

54、ector winSize;11 CCSprite *projectile = CCSprite spriteWithFile:Projectile.png 12 rect:CGRectMake(0, 0, 20, 20);13 projectile.position = ccp(20, winSize.height/2);1415 / Determine offset of location to projectile16 int offX = location.x - projectile.position.x;17 int offY = location.y - projectile.p

55、osition.y;1819 / Bail out if we are shooting down or backwards20 if (offX = 0) return;2122 / Ok to add now - weve double checked position23 self addChild:projectile;2425 / Determine where we wish to shoot the projectile to26 int realX = winSize.width + (projectile.contentSize.width/2);27 float ratio

56、 = (float) offY / (float) offX;28 int realY = (realX * ratio) + projectile.position.y;29 CGPoint realDest = ccp(realX, realY);3031 / Determine the length of how far were shooting32 int offRealX = realX - projectile.position.x;33 int offRealY = realY - projectile.position.y;34 float length = sqrtf(of

57、fRealX*offRealX)+(offRealY*offRealY);35 float velocity = 480/1; / 480pixels/1sec36 float realMoveDuration = length/velocity;3738 / Move projectile to actual endpoint39 projectile runAction:CCSequence actions:40 CCMoveTo actionWithDuration:realMoveDuration position:realDest,41 CCCallFuncN actionWithT

58、arget:self 4243 selector:selector(spriteMoveFinished:),44 nil; 45好了,编译并运行,触摸屏幕(使用的是模拟器?点击屏幕!),享受一下效果。PS: 为了和Object-C代码保持一致,这里可能会有一些“float”到“int”隐式转换导致的警告,请忽略它们。Win32iPhoneAndroid沃Phonehttp:/www.cocos2d-x.org/projects/cocos2d-x/wiki/Chapter_4_-_How_to_Fire_some_Bullets第五章如何检测碰撞我们的英雄现在可以发射子弹了,但仅仅只是装饰而

59、已,如何才能杀掉怪物呢?在这一章,我们将介绍碰撞检测来实现这一效果。 首先,跟踪怪物和子弹是必需的。 在游戏中,我们为这两种精灵加以不同的tag来区分它们。当tag=1时,表示这是怪物,而tag=2时,则表示这为子弹。由于在CCNode里面有m_nTag这个成员变量,并且有setTag和getTag方法,因此CCSprite就继承了这些方法,我们可以利用之。 在HelloWorldScene.h中,把以下两个成员变量加入到HelloWorld下,这两个成员变量用于缓存现有的怪物和子弹。 1/ cpp with cocos2d-x2protected:3 cocos2d:CCMutableArr

60、ay *_targets;4 cocos2d:CCMutableArray *_projectiles; 1/ objc with cocos2d-iphone2 NSMutableArray *_targets;3 NSMutableArray *_projectiles; 在cocos2d-x里,CCMutableArray相当于iOS SDK中的NSMutableArray,该数组里的成员可以是NSObject或者他们的子类。但不同的是,你必须告诉它里面要放的是哪种具体的类型。 之后构造函数中初始化这两个变量,在init()中new 它们,并在析构函数中release 它们。 1/ cpp with cocos2d-x23/ in init()4/ Initialize arrays5_targets = new CCMutableArray;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!