实验:黄金矿工完成本实验后,可以实现矿工抓金子并计分的效果,如下所示:复制金块学习目标学习应用dGetScreenLeft,dGetScreenRight,dGetScreenTop,dGetScreenBottom学习应用srand函数。
这节我们实现黄金矿工的金块随机分布,并设置不同金块的大小,为后续的抓取金块做好准备。
Step1:图片资源导入新建一个新的项目,取名为GoldenManDemo。
添加如图所示资源到环境中:并按如下所示布置图片位置:并为金子取名为goldTemplateStep2:本实验用到的API/* dGetScreenLeft:获取世界边界之左边X坐标* 返回值:左边界X坐标*/extern float dGetScreenLeft();/* dGetScreenTop:获取世界边界之上边Y坐标* 返回值:上边界Y坐标*/extern float dGetScreenTop();/* dGetScreenRight:获取世界边界之右边X坐标* 返回值:右边界X坐标*/extern float dGetScreenRight();/* dGetScreenBottom:获取世界边界之下边Y坐标* 返回值:下边界Y坐标*/extern float dGetScreenBottom();/* dSetSpriteWidth:设置精灵外形宽度* 参数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:大于iMin的整数*/extern int dRandomRange( const int iMin, const int iMax );Step 3:思路阐述要实现金块的随机分布,首先需要利用模板复制一定数量的金块,然后将他们随机布置在窗口中,可以通过dSetSpritePosition来设置金块的横纵坐标。
接下来要面临的问题就是,如何获取窗口中不同位置的坐标。
利用dGetScreenLeft,dGetScreenRight,dGetScreenBottom,dGetScreenTop来获取窗口的范围,然后使用dRandomRange在该范围中随机一个新的坐标。
对于金块的大小设置,可以利用dSetSpriteHeight和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; //金子左边界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( iLoop < 10 ) //生成10个小金块,大小为4{iSize = 4;}else if( iLoop >= 10 && iLoop < 16 ) //生成6个中金块,大小为6 {iSize = 6;}else //生成4个大金块,大小为8{iSize = 8;}//初始化金子精灵实例char* tmpName;tmpName=dMakeSpriteName("GoldBlock",iLoop); //生成金块名字dCloneSprite("goldTemplate",tmpName);dSetSpriteWidth(tmpName,(float)iSize); //设置金块的宽度dSetSpriteHeight(tmpName,(float)iSize); //设置金块的高度//设置金子精灵位置iPosX = dRandomRange(g_fGoldBornMinX, g_fGoldBornMaxX);iPosY = dRandomRange(g_fGoldBornMinY, g_fGoldBornMaxY);dSetSpritePosition(tmpName,(float)iPosX, (float)iPosY);}编译运行,可得到如下所示的效果:练习:1.自定义金子的大小和数量;旋转钩子学习目标学习应用dSetSpriteRotation函数学会利用屏幕刷新时间fTimeDelta来实现一些复杂的操作。
这节我们实现黄金矿工的钩子180度来回转动,这样矿工就可以控制抓取范围了,也为后面的抓取金子做好准备。
Step1:图片资源导入点击添加一个新的动画添加GolderManAnimation1,GolderManAnimation2,GolderManAnimation3到环境中,添加完后效果如图:将GolderManAnimation2拖进屏幕,并取名为GoldMan,如下图所示:同理,将静态精灵中的钩子,拖进屏幕,按初始界面排放。
并在右侧的“编辑”中设置名称如下:钩子布置好后的效果如下:Step2:本实验用到的API/* dSetSpriteRotation:设置精灵的旋转角度* 参数szName:精灵名字* 参数fRot:旋转角度,范围0 - 360*/extern void dSetSpriteRotation( const char *szName, const float fRot );Step 3:思路阐述实现钩子的180度来回摆动,其实就是不断地设置钩子与地面的夹角从0—180度不断地变化,可以利用dSetSpriteRotation来进行设置。
为了使钩子以恒定的速度来回摆动,我们可以自定义一个初始化速度speed,然后利用游戏屏幕刷新的时间fTimeDelta来实现,即speed * fTimeDelta即为当前钩子所在的角度位置。
Step 4:代码及注释首先定义全局变量,定义如下全局变量:float g_fHookRotation = 0.f; //钩子与地面的夹角;在WinMain的初始化部分,即金块分布的for循环下方添加:const float fRotateSpeed = 45.f; // 摇摆速度,单位度/秒int iHookRotToLeft = 1; //钩子摆动的方向:1 ←;0 →由于钩子摆动在游戏过程中一直进行,所以应该将摆动的代码置于while循环中,在float fTimeDelta = dGetTimeDelta();下方添加如下代码:float fThisRotate = fRotateSpeed * fTimeDelta; // 本次旋转的角度if( iHookRotToLeft ){ //向左转,度数不断变大g_fHookRotation += fThisRotate;if( g_fHookRotation >= 180.f ){ //大于180,置为向右转,即0g_fHookRotation = 180.f;iHookRotToLeft = 0;}}Else{ //向右转,度数不断变小g_fHookRotation -= fThisRotate; //小于0,置为向左转,即 1if( g_fHookRotation <= 0.f ){g_fHookRotation = 0.f;iHookRotToLeft = 1;}}dSetSpriteRotation("GoldHook",g_fHookRotation); //设置钩子的当前角度编译运行,可得到如下所示的效果:练习:1.使钩子从左往右进行旋转释放绳索学习目标学习应用dSetSpriteLinearVelocityPolar,dAnimateSpritePlayAnimation函数学会利用全局变量来控制游戏的运行状态。
这节我们实现黄金矿工在某一角度放下绳索的操作,为之后的真正抓取金子做好准备Step1:图片资源编辑打开funcode,单击地图上的矿工精灵图像,在显示框的上面五个选择左数第二个“编辑此精灵的链接点”,如图所示按如图所示依次单击这位置显示0,保存即可。
同上,点击地图上的钩子精灵,选择“编辑此精灵的链接点”,依次单击这个位置显示0,最后保存即可。
Step2:本实验用到的API/* dSetSpriteLinearVelocityPolar:按角度朝向设置精灵移动速度* 参数szName:精灵名字* 参数fSpeed:移动速度* 参数fPolar:角度朝向*/extern void dSetSpriteLinearVelocityPolar( const char *szName, const float fSpeed, const float fPolar );/* dAnimateSpritePlayAnimation:动画精灵播放动画* 参数szName:精灵名字* 参数szAnim:动画名字* 参数iRestore:播放完毕后是否恢复当前动画. 1 恢复0 不恢复* 返回值:是否播放成功, 1 : 成功0 :不成功*/extern int dAnimateSpritePlayAnimation( const char *szName, const char *szAnim, const int iRestore );/* dGetSpriteLinkPointPosX:获取精灵链接点X坐标。