游戏“黄金矿工”设计思路_第1页
游戏“黄金矿工”设计思路_第2页
游戏“黄金矿工”设计思路_第3页
游戏“黄金矿工”设计思路_第4页
游戏“黄金矿工”设计思路_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、word实验:黄金矿工完本钱实验后,可以实现矿工抓金子并计分的效果,如下所示:复制金块学习目标学习应用dGetScreenLeft,dGetScreenRight,dGetScreenTop,dGetScreenBottom学习应用srand函数。这节我们实现黄金矿工的金块随机分布,并设置不同金块的大小,为后续的抓取金块做好准备。Stepl:图片资源导入新建一个新的项目,取名为GoldenManDemo。添加如下列图资源到环境中:口美的窗口时秆放国片费函玷用低配置叽GunRcotlniageMapBeginfriiageMspminiufoal(liiiagel>lap1miniufoa

2、ltlinagEhyiap?GunFcot2lrnageMapGunSody2lmageMapGolderB时邮mag邮叶GokleiManlmagef.lapGakJerTocIlmsgeMapPictureDlYl£airiplelmageMa|>PicrureDIYIImageMapPicrureDIYSImageMap口iciuieDtY31m3geMapPicturftDl<4lmageMepPiclureDiP5tmagel.'lapPidureDlVfilniageldapPicrureDiY7lmageMapPicrureDIYSInisg期叩Pi

3、ctureDiYSimageWBpPiclureDIY1OlmageMaD并按如下所示布置图片位置:并为金子取名为goldTemplateStep2:本实验用到的API/*dGetScreenLeft:获取世界边界之左边X坐标* 返回值:左边界X坐标* /externfloatdGetScreenLeft();/*dGetScreenTop:获取世界边界之上边Y坐标* 返回值:上边界Y坐标* /externfloatdGetScreenTop();/*dGetScreenRight:获取世界边界之右边X坐标* 返回值:右边界X坐标* /externfloatdGetScreenRight();

4、/*dGetScreenBottom:获取世界边界之下边Y坐标* 返回值:下边界Y坐标* /externfloatdGetScreenBottom();/*dSetSpriteWidth:设置精灵外形宽度* 参数szName:精灵名字* 参数fWidth:宽度值,大于0* /externvoiddSetSpriteWidth(constchar*szName,constfloatfWidth);/*dGetSpriteWidth:获取精灵外形宽度* 参数szName:精灵名字* 返回值:精灵宽度值* /externfloatdGetSpriteWidth(constchar*szName);*

5、 *dRandomRange:获取一个位于参数1到参数2之间的随机数* 返回值:int,X围iMin-iMax* 参数iMin:小于iMax的整数* 参数iMax:大于iMin的整数* /externintdRandomRange(constintiMin,constintiMax);Step3:思路阐述要实现金块的随机分布,首先需要利用模板复制一定数量的金块,然后将他们随机布置在窗口中,可以通过dSetSpritePosition来设置金块的横纵坐标。接下来要面临的问题就是,如何获取窗口中不同位置的坐标。禾1J用dGetScreenLeft,dGetScreenRight,dGetScree

6、nBottom,dGetScreenTop来获取窗口的X围,然后使用dRandomRange在tX围中随机一个新的坐标。对于金块的大小设置,可以利用dSetSpriteHeight和dSetSpriteWidth来实现。Step4:代码详解首先定义全局变量,定义如下全局变量:intgfGoldBornMinX=0;intgfGoldBornMaxX=0;intgfGoldBornMinY=0;intgfGoldBornMaxY=0;intgiGoldCount=0;金块布置属于初始化工作,在WinMain的初始化局部添加如下代码:dSetWindowTitle("黄金矿工"

7、);giGoldCount=20;/金子数量gfGoldBornMinX=dGetScreenLeft()+5;/金子左边界gfGoldBornMaxX=dGetScreenRight()-5;/金子右边界gfGoldBornMinY=dGetScreenTop()+20;/金子上边界gfGoldBornMaxY=dGetScreenBottom()5;/金子下边界利用循环生成20个金子,以goldTemplate为模板intiLoop=0;/循环变量控制intiSize=4,iPosX=0,iPosY=0;/iSize表示金块大小的变量for(iLoop=0;iLoop<g_iGold

8、Count;iLoop+)if(iLoop<10)生成10个小金块,大小为4iSize=4;elseif(iLoop>=10&&iLoop<16)/生成6个中金块,大小为6iSize=6;else/生成4个大金块,大小为8iSize=8;/初始化金子精灵实例char*tmpName;tmpName=dMakeSpriteName("GoldBlock",iLoop);/生成金块名字dCloneSprite("goldTemplate",tmpName);dSetSpriteWidth(tmpName,(float)iSi

9、ze);/设置金块的宽度dSetSpriteHeight(tmpName,(float)iSize);/设置金块的高度/设置金子精灵位置iPosX=dRandomRange(gfGoldBornMinX,gfGoldBornMaxX);iPosY=dRandomRange(gfGoldBornMinY,gfGoldBornMaxY);dSetSpritePosition(tmpName,(float)iPosX,(float)iPosY);编译运行,可得到如下所示的效果:练习:1.自定义金子的大小和数量;旋转钩子学习目标学习应用dSetSpriteRotation函数学会利用屏幕刷新时间fTi

10、meDelta来实现一些复杂的操作。这节我们实现黄金矿工的钩子180度来回转动,这样矿工就可以控制抓取X围了,也为后面的抓取金子做好准备。Stepl:图片资源导入点击添加一个新的动画亘Q画画回国画22 / 21添力口GolderManAnimationl,GolderManAnimation2,GolderManAnimation3到环境中,添加完后效果如图:将GolderManAnimation2拖进屏幕,并取名为GoldMan,如如下图所示:同理,将静态精灵中的钩子,拖进屏幕,按初始界面排放。并在右侧的“编辑中设置名称如下:布置好后的效果如下:Step2:本实验用到的API/*dSetSp

11、riteRotation:设置精灵的旋转角度参数szName:精灵名字参数fRot:旋转角度,X围0-360*/externvoiddSetSpriteRotation(constchar*szName,constfloatfRot);0180度不断Step3:思路阐述实现钩子的180度来回摆动,其实就是不断地设置钩子与地面的夹角从地变化,可以利用dSetSpriteRotation来进展设置。为了使钩子以恒定的速度来回摆动,我们可以自定义一个初始化速度speed,然后利用游戏屏幕刷新的时间fTimeDelta来实现,即speed*fTimeDelta即为当前钩子所在的角度位置。Step4:代

12、码与注释首先定义全局变量,定义如下全局变量:/钩子与地面的夹角在WinMain的初始化局部,即金块分布的for循环下方添加:const floatfRotateSpeed = 45.f;/ 摇摆速度,单位 度/秒intiHookRotToLeft=1;钩子摆动白方向:1一;0一由于钩子摆动在游戏过程中一直进展,所以应该将摆动的代码置于while循环中,在floatfTimeDelta=dGetTimeDelta();下方添加如下代码:floatfThisRotate=fRotateSpeed*fTimeDelta;/本次旋转的角度if(iHookRotToLeft)/向左转,度数不断变大gfH

13、ookRotation+=fThisRotate;if(g_fHookRotation>=180.f)/大于180,置为向右转,即0gfHookRotation=180.f;iHookRotToLeft=0;Else/向右转,度数不断变小gfHookRotation-=fThisRotate;/小于0,置为向左转,即1if(gfHookRotation<=0.f)gfHookRotation=0.f;iHookRotToLeft=1;dSetSpriteRotation("GoldHook",gfHookRotation);/设置钩子的当前角度编译运行,可得到如

14、下所示的效果:练习:1.使钩子从左往右进展旋转释放绳索学习目标学习应用dSetSpriteLinearVelocityPolar,dAnimateSpritePlayAnimation函数学会利用全局变量来控制游戏的运行状态。这节我们实现黄金矿工在某一角度放下绳索的操作,为之后的真正抓取金子做好准备Stepl:图片资源编辑打开funcode,单击地图上的矿工精灵图像,在显示框的上面五个选择左数第二个"编辑此精灵的点",如下列图按如下列图依次单击这位置显示0,保存即可。同上,点击地图上的钩子精灵,选择“编辑此精灵的点,依次单击这个位置显示0,最后保存即可。Step2:本实验用

15、到的API/*dSetSpriteLinearVelocityPolar:按角度朝向设置精灵移动速度* 参数szName:精灵名字* 参数fSpeed:移动速度* 参数fPolar:角度朝向* /externvoiddSetSpriteLinearVelocityPolar(constchar*szName,constfloatfSpeed,constfloatfPolar);/*dAnimateSpritePlayAnimation:动画精灵播放动画* 参数szName:精灵名字* 参数szAnim:动画名字* 参数iRestore:播放完毕后是否恢复当前动画.1恢复0不恢复* 返回值:是否

16、播放成功,1:成功0:不成功* /externintdAnimateSpritePlayAnimation(constchar*szName,constchar*szAnim,constintiRestore);/*dGetSpriteLinkPointPosX:获取精灵点X坐标。点是依附于精灵的一个坐标点,*可以在编辑器里增加或者删除*参数szName:精灵名字*参数iId:点序号,第一个为1,后面依次递加*/externfloatdGetSpriteLinkPointPosX(constchar*szName,constintild);/*dGetSpriteLinkPointPosY:获

17、取精灵点Y坐标。点是依附于精灵的一个坐标点,*可以在编辑器里增加或者删除* 参数szName:精灵名字* 参数ild:点序号,第一个为1,后面依次递加* /externfloatdGetSpriteLinkPointPosY(constchar*szName,constintiId);/*dDrawLine:在两点之间画一条线* 参数fStartX:起始坐标X* 参数fStartY:起始坐标Y* 参数fEndX:终点坐标X* 参数fEndY:终点坐标Y* 参数fLineWidth:线的粗细,大于等于1* 参数iLayer:该线所在的层,与编辑器里设置的精灵的层级是同一个概念。X围0-31。*

18、参数iRed,iGreen,iBlue:红绿蓝三原色的颜色值,X围0-255* 参数iAlpha:线的透明度,X围0-255.0为全透明,255为不透明* /externvoiddDrawLine(constfloatfStartX,constfloatfStartY,constfloatfEndX,constfloatfEndY,constfloatfLineWidth,constintiLayer,constintiRed,constintiGreen,constintiBlue,constintiAlpha);Step3:思路阐述利用dSetSpriteLinearVelocityPol

19、ar即可实现钩子在某一角度放线,另外可以通过dAnimateSpritePlayAnimation来播放放线时矿工的动作,所以放线问题不大。但要注意三个问题:何时放线,放线的时候钩子停止旋转,在钩子和矿工之间画一条线表示绳索。下面来解决这三个问题:何时放线:我们不妨利用键盘上的方向键中的J来控制放线,在dOnKeyDown添加响应释放绳索的操作,这和海底世界中的WSAD控制鱼的方向原理类似;放线的时候钩子停止旋转:与海底世界中鼠标控制鱼游动一样,可以添加一个全局变量,当该变量为0时,钩子旋转当释放绳索时,置其为1,这样钩子就不会旋转了。绳索的展现:在step1中已经设置了点,其中矿工的0和钩子

20、的0已经设置好,通过dGetSpriteLinkPointPosX和dGetSpriteLinkPointPosY获取这两个的位置,然后利用dDrawLine函数在两点之间画线即可。Step4:代码与注释首先定义钩子旋转的全局变量:intgiGameState=0;游戏状态,0表示钩子旋转,1表示释放绳索,后面还会定义其他状态在定义一个释放绳索速度的全局变量floatgfEmptyHookSpeed=15.f;在dOnKeyDown添力口响应J按键的代码:if(KEYDOWN=iKey&&giGameState=0)/按下J并且游戏状态为"1”giGameState=

21、1;/置游戏状态为1,可用于控制钩子是否摆动/以当前朝向给钩子一个向前的速度dSetSpriteLinearVelocityPolar("GoldHook",g_fEmptyHookSpeed,g_fHookRotation);/播放挖金者的动作(一个胳膊往下压的动作)dAnimateSpritePlayAnimation("GoldMan","GolderManAnimation1",0);/0表示播放一次,这里胳膊往下压就是一次在WinMain中,修改钩子摆动的代码,以控制摆动状态,即参加了if判断。if(giGameState=

22、0)floatfThisRotate=fRotateSpeed*fTimeDelta;if(iHookRotToLeft)gfHookRotation+=fThisRotate;if(gfHookRotation>=180.f)gfHookRotation=180.f;iHookRotToLeft=0;elsegfHookRotation-=fThisRotate;if(gfHookRotation<=0.f)gfHookRotation=0.f;iHookRotToLeft=1;dSetSpriteRotation("GoldHook",gfHookRotat

23、ion);最后,还是在while循环中,添加画线连接的操作:/首先,从矿工精灵上获取一个缆绳点作为绳子的起始点(该点在编辑器里编辑好)floatfStartX=dGetSpriteLinkPointPosX("GoldMan",1);floatfStartY=dGetSpriteLinkPointPosY("GoldMan",1);/绳子终点在钩子精灵上获取(该点在编辑器里编辑好)floatfEndX=dGetSpriteLinkPointPosX("GoldHook",1);floatfEndY=dGetSpriteLinkPoin

24、tPosY("GoldHook",1);/在这两点之间划线.线的颜色红名表蓝值都为50,即灰色;255表示不透明,2.0f表示线的粗细,0表示所在的层dDrawLine(fStartX,fStartY,fEndX,fEndY,2.f,0,50,50,50,255);编译运行,在适当的位置按J,可以发现钩子跟着绳索一起释放,如图:练习:1.使钩子在抓到金块时以初始速度0.8倍的速度返回,碰到边界时如此以两倍的速度返回。抓取金子学习目标学习应用dSetSpriteLinearVelocityPolar,dAnimateSpritePlayAnimationdGetSpriteP

25、ositionXdGetSpAtePositionY函数学习strcpy函数有了前面的根底,我们可以顺利的释放绳索了,然而当钩子在碰到金块时会穿过去而不会将其抓住并拉回来。这节我们就来实现黄金矿工抓取金块并拖回的操作。Step1:图片资源编辑点击地图上的钩子精灵,选择“编辑此精灵的点,如下列图添加1点,保存即可。在WinMain的复制金子前给钩子加上发送碰撞属性:dSetSpriteCollisionSend("goldHook",1);在WinMain的复制金子前给金块加上承受碰撞属性:funcode会自己处理碰撞dSetSpriteCollisionReceive(&q

26、uot;goldTemplate",1);注意:不要勾上承受物理碰撞与发送物理碰撞,否如此Step2:Funcode接口介绍/*dOnSpriteColSprite:精灵与精灵碰撞后将被调用的函数,可在此函数体里(Main.cpp)* 增加自己的响应代码* 精灵之间要产生碰撞,必须在编辑器或者代码里设置精灵发送与承受碰撞* 参数szSrame:发起碰撞的精灵名字* 参数szTarName:被碰撞的精灵名字* /externvoiddOnSpriteColSprite(constchar*szSrame,constchar*szTarName);/*dSpriteMountToSpri

27、teLinkPoint:将一个精灵绑定到另一个精灵上,绑定位置为指定*的点,暂时的成为另一个精灵的一局部,跟随其运动等* 参数szSramec要绑定的精灵名字* 参数szDstName:承载绑定的母体精灵名字* 参数iPointId:点序号* 返回值:返回一个绑定ID* /externintdSpriteMountToSpriteLinkPoint(constchar*szSrame,constchar*szDstName,constintiPointId);/*dGetSpritePositionX:获取精灵X坐标* 参数szName:精灵名字* 返回值:精灵的X坐标* /externflo

28、atdGetSpritePositionX(constchar*szName);/*dGetSpritePositionY:获取精灵Y坐标* 参数szName:精灵名字* 返回值:精灵的Y坐标* /externfloatdGetSpritePositionY(constchar*szName);Step3:思路阐述钩子抓取金块实际上就是精灵与精灵碰撞的过程,所以应该在dOnSpriteColSprite中做文章。dOnSpriteColSprite中的szSrame,szTarName可以判定碰撞的对象是否是金块和钩子。假如是,如此将金块绑定在钩子精灵上,利用dSpriteMountToSpr

29、iteLinkPoint函数,将金块锚定在前面设定的钩子精灵点“1。继而就是把金块往回拉的过程,事先利用之后利dGetSpritePositionX,dGetSpritePositionY获取钩子的起始位置并保存在全局变量中,用dSpriteMoveTo移回初始位置。Step4:代码详解定义全局变量来存放钩子的初始位置floatgfHookStartPosX;/存储钩子的初始XB置floatgfHookStartPosY;/存储钩子的初始YB置charszGotGoldName20;/当前抓到金子的名称在WinMain的初始化中,添加:gfHookStartPosX=dGetSpritePos

30、itionX("GoldHook");/获取钩子的初始/标fHookStartPosY=dGetSpritePositionY("GoldHook");/获取钩子的初始丫坐标在dOnSpriteColSprite中添加处理金块与钩子碰撞的代码:/发起者为GoldHook,承受者含有GoldBlock字段if(strcmp(szSrame,"GoldHook")=0&&strstr(szTarName,"GoldBlock")!=NULL)dSpriteMountToSpriteLinkPoint(s

31、zTarName,"GoldHook",2);/将金块锚定在钩子上dSpriteMoveTo("GoldHook",gfHookStartPosX,gfHookStartPosY,gfEmptyHookSpeed,1);/使钩子向初始位置移动,即会拉dAnimateSpritePlayAnimation("GoldMan","GolderManAnimation3",1);/播放拉金块的动作strcpy(szGotGoldName,szTarName);/复制并保存当前抓取到金块的名称编译运行,在适当的位置按可以发

32、现当钩子碰到金子后,可以拖着金子一起回拉,如图:删除金子与边界处理学习目标学习应用dDeleteSprite,dSpriteDismount,dGetSpriteLinearVelocityX,dGetSpriteLinearVelocityY函数学会利用全局变量来分类控制游戏的运行状态学会判断精灵是否静止不动有了前面的根底,我们可以抓取金子并回拉到初始位置。然而当拉到初始处后金子依旧存在而且不能在继续抓取了,另外如果钩子没有碰到金块,那么钩子会不断往边界外面移动。这节我们就来实现抓取金子后删除,以与添加钩子的边界处理,来完成黄金矿工的最后一步。Stepl:设置钩子与世界边界碰撞的模式为NUL

33、L在WinMain的初始化中初始化钩子与世界边界碰撞的模式为NULL,代码如下:/*dSpriteDismount:将已经绑定的精灵进展解绑* 参数szName:精灵名字* /externvoiddSpriteDismount(constchar*szName);/*dGetSpriteLinearVelocityX:获取精灵X方向速度* 参数szName:精灵名字* 返回值:X方向速度* /externfloatdGetSpriteLinearVelocityX(constchar*szName);/*dGetSpriteLinearVelocityY:获取精灵Y方向速度* 参数szName

34、:精灵名字* 返回值:Y方向速度* /externfloatdGetSpriteLinearVelocityY(constchar*szName);Step3:思路阐述同海底世界一样,我们在g_iGameState中添加状态2,用于表示钩子的回拉状态。在回拉状态下,我们才会有删除金块的可能性。当金块拉回到初始位置时,我们删除金块,那么我们如何判断金块在初始位置呢?可以通过钩子的速度来实现。如果钩子的速度为0,说明钩子不再移动,即已经拉回到了初始位置,利用dGetSpriteLinearVelocityX,dGetSpriteLinearVelocityY来获取钩子速度进而进展判定。钩子的边界处

35、理,我们让钩子在碰到世界边界时,向初始位置X围即可,只要在dOnSpriteColWorldLimit中利用dSpriteMoveTo即可。Step4:代码详解在dOnSpriteColSprite中处理金块与钩子碰撞的代码中添加:giGameState=2;表示绳索回拉即:/发起者为GoldHook,承受者含有GoldBlock字段if(strcmp(szSrame,"GoldHook")=0&&strstr(szTarName,"GoldBlock")!=NULL)/将金块锚定在钩子上dSpriteMountToSpriteLinkP

36、oint(szTarName,"GoldHook",2);/使钩子向初始位置移动,即回拉dSpriteMoveTo("GoldHook",g_fHookStartPosX,g_fHookStartPosY,g_fEmptyHookSpeed,1);/播放拉金块的动作dAnimateSpritePlayAnimation("GoldMan","GolderManAnimation3",1);/复制并保存当前抓取到金块的名称strcpy(szGotGoldName,szTarName);在WinMain中添加的if(g_iGameState=0)floatfThisRotate=fRotateSpeed*fTimeDelta;if(iHookRotToLeft)g_fHookRotation+=fThisRotate;if(g_fHookRotation>=180.f)g_fHookRotation=180.f;iHookRotToLeft=0;elseg_fHookRotation-=fThisRotate;if(g_fHookR

温馨提示

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

评论

0/150

提交评论