如何用cocos2d-x来开发简单的Uphone游戏:(二) 移动的精灵_第1页
如何用cocos2d-x来开发简单的Uphone游戏:(二) 移动的精灵_第2页
如何用cocos2d-x来开发简单的Uphone游戏:(二) 移动的精灵_第3页
如何用cocos2d-x来开发简单的Uphone游戏:(二) 移动的精灵_第4页
如何用cocos2d-x来开发简单的Uphone游戏:(二) 移动的精灵_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、著作权声明:本文由/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!三、添加一个精灵我们先用个简单的方式,把player, projectile, target三个png文件拷贝到 d:work7newplustda_datauserdata 目录下,这使其可以在模拟器上直接通过文件路径访问到。uphone有其资源打包的方式,图片和音乐都可以打包到动态库文件内,这个另外会有教程描述,我们这里先让事情简单化。 关于cocos2d坐标系统的规则,简而言之就是左下角为原点,向上向右按像素递增,这在wenderlich的原文中有详细描述,

2、我们这里就不再赘述了。直接切入代码现在我们在helloworldscene.cpp里面,找到bool helloworld:init()函数,把它替换成下面代码boolhelloworld:init()/1.superinitfirstif(!cclayer:init()returnfalse;/2.addamenuitemwithximage,whichisclickedtoquittheprogram/youmaymodifyit./addacloseicontoexittheprogress.itsanautoreleaseobjectccmenuitemimage*pcloseitem

3、=ccmenuitemimage:itemfromnormalimage(closenormal.png, closeselected.png, this, menu_selector(helloworld:menuclosecallback);pcloseitem-setposition(ccp(ccdirector:getshareddirector()-getwinsize().width-20,20);/createmenu,itsanautoreleaseobjectccmenu*pmenu=ccmenu:menuwithitems(pcloseitem,null);pmenu-se

4、tposition(cgpointzero);this-addchild(pmenu);/3.addyourcodesbelow.cgsizewinsize=ccdirector:getshareddirector()-getwinsize();ccsprite*player=ccsprite:spritewithfile(player.png, cgrectmake(0,0,27,40);player-setposition(ccp(player-getcontentsize().width/2,winsize.height/2);this-addchild(player);returntr

5、ue;其实我们只修改了 / 3. add your codes below 这段。cocos2d-x和cocos2d-iphone的接口有细微的差别,不过你一旦习惯了这个差别,写起代码来就会很顺手。我们抛开添加x退出按钮的一段,单纯地看一下这两段init函数的差异./cpp with cocos2d-xboolhelloworld:init()if(cclayer:init() cgsizewinsize=ccdirector:getshareddirector()-getwinsize(); ccsprite*player=ccsprite:spritewithfile(player.png

6、, cgrectmake(0,0,27,40); player-setposition(ccp(player-getcontentsize().width/2,winsize.height/2);this-addchild(player);returntrue;/objc with cocos2d-iphone-(id)initif(self=superinit) cgsizewinsize=ccdirectorshareddirectorwinsize; ccsprite*player=ccspritespritewithfile:player.png rect:cgrectmake(0,0

7、,27,40) ; player.position=ccp(player.contentsize.width/2, winsize.height/2); selfaddchild:player;returnself;转换要点 1. 虽然vc+中有super关键字,但linux下用gcc编译时可不认。所以c+中不能用super:init(),而必须老老实实地指定是执行父类cclayer:init()方法2. 由于cpp里没有property的概念,所以在objc里涉及property的地方,我们都用了get/set函数代替。于是,访问ccdirector.shareddirector属性的代码,

8、就变成了ccdirector:getshareddirector()函数调用,shared开头小写的s,也变成了大写的s。同样规则,取得winsize属性的地方,则变成了getwinsize()函数调用。这段代码中还有player-getcontentsize()也受此影响。但访问结构体中的变量,如winsize中的width和height则不需用getter封装。3. 设置类的属性,如player.position = ,也改用setter实现,变成player-setposition(.)4. c+函数调用不需像objc那样在每个参数前面说明这参数是干什么用的,比如rect:cgrectm

9、ake(.),只需直接输入参数即可。另一方面, cocos2d-x仿照ios实现了cggeometry的一些函数,你可以在cocos2dxincludecggeometry.h里看到它们。除了cgrectmake,还有cgpointmake, cgsizemake, cgpointzero, cgsizezero, cgrectzero.5. cocos2d-x所有的游戏元素, sprite,layer,scene,label,action等,都是new在heap上,并且用指针传递的,因此调用其成员函数一定是用-号,而不像objc里的点号6. cpp里用this替代了objc的self关键字7

10、. cocos2d-x里的init函数改成返回bool类型了。由于cpp里没有objc的id关键字,所以cocos2d-iphone里返回id的地方,都改成返回明确的类指针,或者bool型变量好了,我们编译运行一下,可以看到带头大哥一袭黑衣,很猥琐地躲在黑色背景上,只露出一双杀红了的眼睛。为了游戏性,我们需要把背景颜色改成白的。只要简单地修改,使helloworld不是继承cclayer,而是继承cccolorlayer就行了。在helloworldscene.h中,修改helloworld类声明如下。(左边为cpp代码,也就是读者现在应该使用的,右边为cocos2dsimplegame原来使

11、用cocos2d-iphone的objc代码,用以对比参考。本系列后面的行文也都如此)/cpp with cocos2d-xclasshelloworld:publiccocos2d:cccolorlayer/objc with cocos2d-iphoneinterfacehelloworld:cccolorlayer然后在helloworld:init()函数实现中,修改刚开始的if(!cclayer:init()returnfalse;变成if(!cccolorlayer:initwithcolor(ccc4(255,255,255,255)returnfalse;这里小改了一下逻辑,原

12、版objc里是如果super init成功,就bala-bala做后面的工作;我喜欢防御性编程,如果失败则先做出错处理、跳出,然后才继续写正确流程。这么做有两个好处,一是不会写到后面漏掉了错误处理,二是不用做太多层的if嵌套。这个是题外话了。抛开if的逻辑,我们来对比一下这句super init在cpp和objc的区别/cppwithcocos2d-xif(cccolorlayer:initwithcolor(ccc4(255,255,255,255)/objcwithcocos2d-iphoneif(self=superinitwithcolor:ccc4(255,255,255,255)转

13、换要点 1. 首先,cpp的继承默认为private继承,所以类声明的继承处public关键字不可少2. cocos2d-iphone的作者ricardo quesada建议我们采用c+的命名空间把cocos2d整个库包起来。而我们在这里既不想直接到头文件里using namespace cocos2d;感染了所有包含这个头文件的cpp文件,也不想把class helloworld归到cocos2d命名空间内,所以helloworldscene.h头文件里只好在每个cocos2d类前面加上命名空间cocos2d:编译后运行,你就可以看到带头大哥孤独地站在白色背景上了,寂寞得泪流满面四、移动目标

14、有了带头大哥后,我们就需要添加一些虾兵蟹将让大哥砍。英雄人物一般不喜欢砍木桩,所以我们就用void addtarget()方法在屏幕右边创建一些跑龙套的小兵,让他们以随机速度向左移动。先到helloworldscene.h里添加函数声明 void addtarget(); 然后回到helloworldscene.cpp里实现函数/cppwithcocos2d-xvoidhelloworld:addtarget()ccsprite*target=ccsprite:spritewithfile(target.png, cgrectmake(0,0,27,40) );/determinewheret

15、ospawnthetargetalongtheyaxiscgsizewinsize=ccdirector:getshareddirector()-getwinsize();intminy=target-getcontentsize().height/2;intmaxy=winsize.height-target-getcontentsize().height/2;intrangey=maxy-miny;srand(timgetticks();intactualy=(rand()%rangey)+miny;/createthetargetslightlyoff-screenalongtherig

16、htedge,/andalongarandompositionalongtheyaxisascalculatedtarget-setposition( ccp(winsize.width+(target-getcontentsize().width/2), actualy);this-addchild(target);/determinespeedofthetargetintminduration=(int)2.0;intmaxduration=(int)4.0;intrangeduration=maxduration-minduration;srand(timgetticks();intac

17、tualduration=(rand()%rangeduration)+minduration;/createtheactionsccfinitetimeaction*actionmove= ccmoveto:actionwithduration(cctime)actualduration, ccp(0-target-getcontentsize().width/2,actualy);ccfinitetimeaction*actionmovedone= cccallfuncn:actionwithtarget(this, callfuncn_selector(helloworld:sprite

18、movefinished);target-runaction(ccsequence:actions(actionmove, actionmovedone,null);/objcwithcocos2d-iphone-(void)addtargetccsprite*target=ccspritespritewithfile:target.png rect:cgrectmake(0,0,27,40);/determinewheretospawnthetargetalongtheyaxiscgsizewinsize=ccdirectorshareddirectorwinsize;intminy=tar

19、get.contentsize.height/2;intmaxy=winsize.height-target.contentsize.height/2;intrangey=maxy-miny;intactualy=(arc4random()%rangey)+miny;/createthetargetslightlyoff-screenalongtherightedge,/andalongarandompositionalongtheyaxisascalculatedtarget.position= ccp(winsize.width+(target.contentsize.width/2),

20、actualy);selfaddchild:target;/determinespeedofthetargetintminduration=2.0;intmaxduration=4.0;intrangeduration=maxduration-minduration;intactualduration=(arc4random()%rangeduration)+minduration;/createtheactionsidactionmove= ccmovetoactionwithduration:actualduration position:ccp(-target.contentsize.w

21、idth/2,actualy);idactionmovedone= cccallfuncnactionwithtarget:self selector:selector(spritemovefinished:);targetrunaction:ccsequenceactions:actionmove, actionmovedone,nil;这里用callfuncn_selector(helloworld:spritemovefinished)回调了spritemovefinished方法,我们需要实现之。同样别忘记在头文件里加入声明, 然后实现之/cppwithcocos2d-xvoidhel

22、loworld:spritemovefinished(ccnode*sender)ccsprite*sprite=(ccsprite*)sender;this-removechild(sprite,true);/objcwithcocos2d-iphone-(void)spritemovefinished:(id)senderccsprite*sprite=(ccsprite*)sender;selfremovechild:spritecleanup:yes;转换要点 1. 随机函数。在iphone上可以用arc4random()直接生成随机函数,而uphone上还是用传统的方法,先获取毫秒级

23、时间(这个函数在uphone上是timgettickes()),用srand(int)塞进去作为random seed,然后再调用rand()生成随机数。其中srand和rand是c标准库函数2. objc中的yes和no,在cpp中变成true和false,这个容易理解3. 回调函数.在objc中用 selector:selector(spritemovefinished),在cpp中实现就比较复杂了,具体可以看cocos2dxincludeselector_protocol.h里面的声明。总之每种可能出现selector的地方,都有唯一的函数指针类型与之匹配。一共有5种回调函数类型 schedule_selector callfunc_selector callfuncn_selector callfuncnd_selector menu_se

温馨提示

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

评论

0/150

提交评论