1、游戏黄金矿工设计思路实验:黄金矿工完成本实验后,可以实现矿工抓金子并计分的效果,如下所示:复制金块学习目标学习应用dGetScreenLeft,dGetScreenRight,dGetScreenTop,dGetScreenBottom学习应用srand函数。这节我们实现黄金矿工的金块随机分布,并设置不同金块的大小,为后续的抓取金块做好准备。Step1:图片资源导入新建一个新的项目,取名为GoldenManDemo。添加如图所示资源到环境中:并按如下所示布置图片位置:并为金子取名为goldTemplateStep2:本实验用到的API/* dGetScreenLeft:获取世界边界之左边X坐标
2、* 返回值:左边界X坐标*/extern float dGetScreenLeft();/* dGetScreenTop:获取世界边界之上边Y坐标* 返回值:上边界Y坐标*/extern float dGetScreenTop();/* dGetScreenRight:获取世界边界之右边X坐标* 返回值:右边界X坐标*/extern float dGetScreenRight();/* dGetScreenBottom:获取世界边界之下边Y坐标* 返回值:下边界Y坐标*/extern float dGetScreenBottom();/* dSetSpriteWidth:设置精灵外形宽度* 参
3、数 szName:精灵名字* 参数 fWidth:宽度值,大于0*/extern void dSetSpriteWidth( const char *szName, const float fWidth );/* dGetSpriteWidth:获取精灵外形宽度* 参数 szName:精灵名字* 返回值:精灵宽度值*/extern float dGetSpriteWidth( const char *szName );/* dRandomRange:获取一个位于参数1到参数2之间的随机数* 返回值:int,范围iMin - iMax* 参数 iMin:小于iMax的整数* 参数 iMax:大于
4、iMin的整数*/extern int dRandomRange( const int iMin, const int iMax );Step 3:思路阐述要实现金块的随机分布,首先需要利用模板复制一定数量的金块,然后将他们随机布置在窗口中,可以通过dSetSpritePosition来设置金块的横纵坐标。接下来要面临的问题就是,如何获取窗口中不同位置的坐标。利用dGetScreenLeft,dGetScreenRight,dGetScreenBottom,dGetScreenTop来获取窗口的范围,然后使用dRandomRange在该范围中随机一个新的坐标。对于金块的大小设置,可以利用dSe
5、tSpriteHeight和dSetSpriteWidth来实现。Step 4:代码详解首先定义全局变量,定义如下全局变量:int g_fGoldBornMinX = 0;int g_fGoldBornMaxX = 0;int g_fGoldBornMinY = 0;int g_fGoldBornMaxY = 0;int g_iGoldCount = 0;金块布置属于初始化工作,在WinMain的初始化部分添加如下代码:dSetWindowTitle(黄金矿工); g_iGoldCount=20; /金子数量 g_fGoldBornMinX = dGetScreenLeft() + 5; /金
6、子左边界 g_fGoldBornMaxX = dGetScreenRight() - 5; /金子右边界 g_fGoldBornMinY = dGetScreenTop() + 20; /金子上边界 g_fGoldBornMaxY = dGetScreenBottom() 5; /金子下边界 利用循环生成20个金子,以goldTemplate为模板int iLoop = 0; /循环变量控制 int iSize = 4, iPosX = 0, iPosY = 0; /iSize表示金块大小的变量 for( iLoop = 0; iLoop g_iGoldCount; iLoop+ ) if(
7、iLoop = 10 & iLoop = 180.f ) /大于180,置为向右转,即0 g_fHookRotation = 180.f; iHookRotToLeft = 0; Else /向右转,度数不断变小 g_fHookRotation -= fThisRotate; /小于0,置为向左转,即 1 if( g_fHookRotation = 180.f ) g_fHookRotation = 180.f; iHookRotToLeft = 0; else g_fHookRotation -= fThisRotate; if( g_fHookRotation = 0.f ) g_fHoo
8、kRotation = 0.f; iHookRotToLeft = 1; dSetSpriteRotation(GoldHook,g_fHookRotation); 最后,还是在while循环中,添加画线连接的操作: / 首先,从矿工精灵上获取一个缆绳链接点作为绳子的起始点(该链接点在编辑器里编辑好) float fStartX = dGetSpriteLinkPointPosX(GoldMan,1); float fStartY = dGetSpriteLinkPointPosY(GoldMan,1); / 绳子终点在钩子精灵上获取(该链接点在编辑器里编辑好) float fEndX = d
9、GetSpriteLinkPointPosX(GoldHook,1); float fEndY = dGetSpriteLinkPointPosY(GoldHook,1); / 在这两点之间划线.线的颜色红绿蓝值都为50,即灰色;255表示不透明,2.0f表示线的粗细, 0表示所在的层 dDrawLine(fStartX, fStartY, fEndX, fEndY, 2.f, 0, 50, 50, 50, 255 ); 编译运行,在适当的位置按,可以发现钩子跟着绳索一起释放,如图:练 习:1. 使钩子在抓到金块时以初始速度0.8倍的速度返回,碰到边界时则以两倍的速度返回。抓取金子学习目标学习
10、应用dSetSpriteLinearVelocityPolar,dAnimateSpritePlayAnimation,dGetSpritePositionX dGetSpritePositionY函数学习strcpy函数有了前面的基础,我们可以顺利的释放绳索了,然而当钩子在碰到金块时会穿过去而不会将其抓住并拉回来。这节我们就来实现黄金矿工抓取金块并拖回的操作。Step1:图片资源编辑点击地图上的钩子精灵,选择“编辑此精灵的链接点”,如图所示添加1链接点,保存即可。 在WinMain的复制金子前给钩子加上发送碰撞属性: dSetSpriteCollisionSend(goldHook, 1);
11、 在WinMain的复制金子前给金块加上接受碰撞属性: dSetSpriteCollisionReceive(goldTemplate, 1); 注意:不要勾上 接受物理碰撞与发送物理碰撞,否则funcode会自己处理碰撞Step2:Funcode接口介绍 /* dOnSpriteColSprite:精灵与精灵碰撞后将被调用的函数,可在此函数体里(Main.cpp)* 增加自己的响应代码* 精灵之间要产生碰撞,必须在编辑器或者代码里设置精灵发送及接受碰撞* 参数 szSrcName:发起碰撞的精灵名字* 参数 szTarName:被碰撞的精灵名字*/extern void dOnSpriteC
12、olSprite( const char *szSrcName, const char *szTarName );/* dSpriteMountToSpriteLinkPoint:将一个精灵绑定到另一个精灵上,绑定位置为指定* 的链接点,暂时的成为另一个精灵的一部分,跟随其运动等* 参数 szSrcName:要绑定的精灵名字* 参数 szDstName:承载绑定的母体精灵名字* 参数 iPointId:链接点序号* 返回值:返回一个绑定ID*/extern int dSpriteMountToSpriteLinkPoint( const char *szSrcName, const char
13、*szDstName, const int iPointId );/* dGetSpritePositionX:获取精灵X坐标* 参数 szName:精灵名字* 返回值:精灵的X坐标*/extern float dGetSpritePositionX( const char *szName );/* dGetSpritePositionY:获取精灵Y坐标* 参数 szName:精灵名字* 返回值:精灵的Y坐标*/extern float dGetSpritePositionY( const char *szName );Step 3:思路阐述钩子抓取金块实际上就是精灵与精灵碰撞的过程,所以应该
14、在dOnSpriteColSprite中做文章。dOnSpriteColSprite中的szSrcName, szTarName可以判定碰撞的对象是否是金块和钩子。若是,则将金块绑定在钩子精灵上,利用dSpriteMountToSpriteLinkPoint函数,将金块锚定在前面设定的钩子精灵链接点“1”。继而就是把金块往回拉的过程,事先利用dGetSpritePositionX,dGetSpritePositionY获取钩子的起始位置并保存在全局变量中,之后利用dSpriteMoveTo移回初始位置。Step 4:代码详解定义全局变量来存放钩子的初始位置float g_fHookStartP
15、osX; /存储钩子的初始X位置float g_fHookStartPosY; /存储钩子的初始Y位置char szGotGoldName20 ; /当前抓到金子的名称 在WinMain的初始化中,添加:g_fHookStartPosX = dGetSpritePositionX(GoldHook); /获取钩子的初始X坐标 g_fHookStartPosY = dGetSpritePositionY(GoldHook); /获取钩子的初始Y坐标 在dOnSpriteColSprite中添加处理金块与钩子碰撞的代码:/ 发起者为GoldHook,接受者含有GoldBlock字段 if(strcmp(szSrcName,GoldHook)= 0 & strstr(szTarName,GoldBlock)!=NULL ) dSpriteMountToSpriteLinkPoint( szTarName, GoldHook, 2 );/将金块锚定在钩子上 dSpriteMoveTo(GoldHook,g_fHo
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1