最新游戏黄金矿工设计思路.docx
- 文档编号:9421387
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:30
- 大小:2.03MB
最新游戏黄金矿工设计思路.docx
《最新游戏黄金矿工设计思路.docx》由会员分享,可在线阅读,更多相关《最新游戏黄金矿工设计思路.docx(30页珍藏版)》请在冰豆网上搜索。
最新游戏黄金矿工设计思路
实验:
黄金矿工
完成本实验后,可以实现矿工抓金子并计分的效果,如下所示:
复制金块
学习目标
学习应用dGetScreenLeft,dGetScreenRight,dGetScreenTop,dGetScreenBottom
学习应用srand函数。
这节我们实现黄金矿工的金块随机分布,并设置不同金块的大小,为后续的抓取金块做好准备。
Step1:
图片资源导入
新建一个新的项目,取名为GoldenManDemo。
添加如图所示资源到环境中:
并按如下所示布置图片位置:
并为金子取名为goldTemplate
Step2:
本实验用到的API
/*dGetScreenLeft:
获取世界边界之左边X坐标
*返回值:
左边界X坐标
*/
externfloatdGetScreenLeft();
/*dGetScreenTop:
获取世界边界之上边Y坐标
*返回值:
上边界Y坐标
*/
externfloatdGetScreenTop();
/*dGetScreenRight:
获取世界边界之右边X坐标
*返回值:
右边界X坐标
*/
externfloatdGetScreenRight();
/*dGetScreenBottom:
获取世界边界之下边Y坐标
*返回值:
下边界Y坐标
*/
externfloatdGetScreenBottom();
/*dSetSpriteWidth:
设置精灵外形宽度
*参数szName:
精灵名字
*参数fWidth:
宽度值,大于0
*/
externvoiddSetSpriteWidth(constchar*szName,constfloatfWidth);
/*dGetSpriteWidth:
获取精灵外形宽度
*参数szName:
精灵名字
*返回值:
精灵宽度值
*/
externfloatdGetSpriteWidth(constchar*szName);
/*dRandomRange:
获取一个位于参数1到参数2之间的随机数
*返回值:
int,范围iMin-iMax
*参数iMin:
小于iMax的整数
*参数iMax:
大于iMin的整数
*/
externintdRandomRange(constintiMin,constintiMax);
Step3:
思路阐述
要实现金块的随机分布,首先需要利用模板复制一定数量的金块,然后将他们随机布置在窗口中,可以通过dSetSpritePosition来设置金块的横纵坐标。
接下来要面临的问题就是,如何获取窗口中不同位置的坐标。
利用dGetScreenLeft,dGetScreenRight,dGetScreenBottom,dGetScreenTop来获取窗口的范围,然后使用dRandomRange在该范围中随机一个新的坐标。
对于金块的大小设置,可以利用dSetSpriteHeight和dSetSpriteWidth来实现。
Step4:
代码详解
首先定义全局变量,定义如下全局变量:
intg_fGoldBornMinX=0;
intg_fGoldBornMaxX=0;
intg_fGoldBornMinY=0;
intg_fGoldBornMaxY=0;
intg_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为模板
intiLoop=0;//循环变量控制
intiSize=4,iPosX=0,iPosY=0;//iSize表示金块大小的变量
for(iLoop=0;iLoop { if(iLoop<10)//生成10个小金块,大小为4 { iSize=4; } elseif(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 */ externvoiddSetSpriteRotation(constchar*szName,constfloatfRot); Step3: 思路阐述 实现钩子的180度来回摆动,其实就是不断地设置钩子与地面的夹角从0—180度不断地变化,可以利用dSetSpriteRotation来进行设置。 为了使钩子以恒定的速度来回摆动,我们可以自定义一个初始化速度speed,然后利用游戏屏幕刷新的时间fTimeDelta来实现,即speed*fTimeDelta即为当前钩子所在的角度位置。 Step4: 代码及注释 首先定义全局变量,定义如下全局变量: floatg_fHookRotation=0.f;//钩子与地面的夹角; 在WinMain的初始化部分,即金块分布的for循环下方添加: constfloatfRotateSpeed=45.f;//摇摆速度,单位度/秒 intiHookRotToLeft=1;//钩子摆动的方向: 1←;0→ 由于钩子摆动在游戏过程中一直进行,所以应该将摆动的代码置于while循环中,在 floatfTimeDelta=dGetTimeDelta(); 下方添加如下代码: floatfThisRotate=fRotateSpeed*fTimeDelta;//本次旋转的角度 if(iHookRotToLeft) {//向左转,度数不断变大 g_fHookRotation+=fThisRotate; if(g_fHookRotation>=180.f) {//大于180,置为向右转,即0 g_fHookRotation=180.f; iHookRotToLeft=0; } } Else {//向右转,度数不断变小 g_fHookRotation-=fThisRotate;//小于0,置为向左转,即1 if(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: 角度朝向 */ externvoiddSetSpriteLinearVelocityPolar(constchar*szName,constfloatfSpeed,constfloatfPolar); /*dAnimateSpritePlayAnimation: 动画精灵播放动画 *参数szName: 精灵名字 *参数szAnim: 动画名字 *参数iRestore: 播放完毕后是否恢复当前动画.1恢复0不恢复 *返回值: 是否播放成功,1: 成功0: 不成功 */ externintdAnimateSpritePlayAnimation(constchar*szName,constchar*szAnim,constintiRestore); /*dGetSpriteLinkPointPosX: 获取精灵链接点X坐标。 链接点是依附于精灵的一个坐标点,*可以在编辑器里增加或者删除 *参数szName: 精灵名字 *参数iId: 链接点序号,第一个为1,后面依次递加 */ externfloatdGetSpriteLinkPointPosX(constchar*szName,constintiId); /*dGetSpriteLinkPointPosY: 获取精灵链接点Y坐标。 链接点是依附于精灵的一个坐标点,*可以在编辑器里增加或者删除 *参数szName: 精灵名字 *参数iId: 链接点序号,第一个为1,后面依次递加 */ externfloatdGetSpriteLinkPointPosY(constchar*szName,constintiId); /*dDrawLine: 在两点之间画一条线 *参数fStartX: 起始坐标X *参数fStartY: 起始坐标Y *参数fEndX: 终点坐标X *参数fEndY: 终点坐标Y *参数fLineWidth: 线的粗细,大于等于1 *参数iLayer: 该线所在的层,与编辑器里设置的精灵的层级是同一个概念。 范围0-31。 *参数iRed,iGreen,iBlue: 红绿蓝三原色的颜色值,范围0-255 *参数iAlpha: 线的透明度,范围0-255.0为全透明,255为不透明 */ externvoiddDrawLine(constfloatfStartX,constfloatfStartY,constfloatfEndX,constfloatfEndY,constfloatfLineWidth,constintiLayer,constintiRed,constintiGreen,constintiBlue,constintiAlpha); Step3: 思路阐述 利用dSetSpriteLinearVelocityPolar即可实现钩子在某一角度放线,另外可以通过dAnimateSpritePlayAnimation来播放放线时矿工的动作,所以放线问题不大。 但要注意三个问题: 何时放线,放线的时候钩子停止旋转,在钩子和矿工之间画一条线表示绳索。 下面来解决这三个问题: 何时放线: 我们不妨利用键盘上的方向键中的↓来控制放线,在dOnKeyDown添加响应释放绳索的操作,这和海底世界中的WSAD控制鱼的方向原理类似; 放线的时候钩子停止旋转: 与海底世界中鼠标控制鱼游动一样,可以添加一个全局变量,当该变量为0时,钩子旋转当释放绳索时,置其为1,这样钩子就不会旋转了。 绳索的展现: 在step1中已经设置了链接点,其中矿工的0和钩子的0已经设置好,通过dGetSpriteLinkPointPosX和dGetSpriteLinkPointPosY获取这两个链接的位置,然后利用 dDrawLine函数在两点之间画线即可。 Step4: 代码及注释 首先定义钩子旋转的全局变量: intg_iGameState=0;//游戏状态,0表示钩子旋转,1表示释放绳索,后面还会定义其他状态 在定义一个释放绳索速度的全局变量 floatg_fEmptyHookSpeed=15.f; 在dOnKeyDown中添加响应↓按键的代码: if(KEY_DOWN==iKey&&g_iGameState==0) { //按下↓并且游戏状态为“1” g_iGameState=1;//置游戏状态为1,可用于控制钩子是否摆动 //以当前朝向给钩子一个向前的速度 dSetSpriteLinearVelocityPolar("GoldHook",g_fEmptyHookSpeed,g_fHookRotation); //播放挖金者的动作(一个胳膊往下压的动作) dAnimateSpritePlayAnimation("GoldMan","GolderManAnimation1",0); //0表示播放一次,这里胳膊往下压就是一次 } 在WinMain中,修改钩子摆动的代码,以控制摆动状态,即加入了if判断。 if(g_iGameState==0) { floatfThisRotate=fRotateSpeed*fTimeDelta; if(iHookRotToLeft) { g_fHookRotation+=fThisRotate; if(g_fHookRotation>=180.f) { g_fHookRotation=180.f; iHookRotToLeft=0; } } else { g_fHookRotation-=fThisRotate; if(g_fHookRotation<=0.f) { g_fHookRotation=0.f; iHookRotToLeft=1; } } dSetSpriteRotation("GoldHook",g_fHookRotation); } 最后,还是在while循环中,添加画线连接的操作: //首先,从矿工精灵上获取一个缆绳链接点作为绳子的起始点(该链接点在编辑器里编辑好) floatfStartX=dGetSpriteLinkPointPosX("GoldMan",1); floatfStartY=dGetSpriteLinkPointPosY("GoldMan",1); //绳子终点在钩子精灵上获取(该链接点在编辑器里编辑好) floatfEndX=dGetSpriteLinkPointPosX("GoldHook",1); floatfEndY=dGetSpriteLinkPointPosY("GoldHook",1); //在这两点之间划线.线的颜色红绿蓝值都为50,即灰色;255表示不透明,2.0f表示线的粗细,0表示所在的层 dDrawLine(fStartX,fStartY,fEndX,fEndY,2.f,0,50,50,50,255); 编译运行,在适当的位置按↓,可以发现钩子跟着绳索一起释放,如图: 练习: 1.使钩子在抓到金块时以初始速度0.8倍的速度返回,碰到边界时则以两倍的速度返回。 抓取金子 学习目标 学习应用dSetSpriteLinearVelocityPolar,dAnimateSpritePlayAnimation,dGetSpritePositionXdGetSpritePositionY函数 学习strcpy函数 有了前面的基础,我们可以顺利的释放绳索了,然而当钩子在碰到金块时会穿过去而不会将其抓住并拉回来。 这节我们就来实现黄金矿工抓取金块并拖回的操作。 Step1: 图片资源编辑 点击地图上的钩子精灵,选择“编辑此精灵的链接点”,如图所示添加1链接点,保存即可。 在WinMain的复制金子前给钩子加上发送碰撞属性: dSetSpriteCollisionSend("goldHook",1); 在WinMain的复制金子前给金块加上接受碰撞属性: dSetSpriteCollisionReceive("goldTemplate",1); 注意: 不要勾上接受物理碰撞与发送物理碰撞,否则funcode会自己处理碰撞 Step2: Funcode接口介绍 /*dOnSpriteColSprite: 精灵与精灵碰撞后将被调用的函数,可在此函数体里(Main.cpp) *增加自己的响应代码 *精灵之间要产生碰撞,必须在编辑器或者代码里设置精灵发送及接受碰撞 *参数szSrcName: 发起碰撞的精灵名字 *参数szTarName: 被碰撞的精灵名字 */ externvoiddOnSpriteColSprite(constchar*szSrcName,constchar*szTarName); /*dSpriteMountToSpriteLinkPoint: 将一个精灵绑定到另一个精灵上,绑定位置为指定*的链接点,暂时的成为另一个精灵的一部分,跟随其运动等 *参数szSrcName: 要绑定的精灵名字 *参数szDstName: 承载绑定的母体精灵名字 *参数iPointId: 链接点序号 *返回值: 返回一个绑定ID */ externintdSpriteMountToSpriteLinkPoint(constchar*szSrcName,constchar*szDstName,constintiPointId); /*dGetSpritePositionX: 获取精灵X坐标 *参数szName: 精灵名字 *返回值: 精灵的X坐标 */ externfloatdGetSpritePositionX(constchar*szName); /*dGetSpritePositionY: 获取精灵Y坐标 *参数szName: 精灵名字 *返回值: 精灵的Y坐标 */ externfloatdGetSpritePositionY(constchar*szName); Step3: 思路阐述 钩子抓取金块实际上就是精灵与精灵碰撞的过程,所以应该在dOnSpriteColSprite中做文章。 dOnSpriteColSprite中的szSrcName,szTarName可以判定碰撞的对象是否是金块和钩子。 若是,则将金块绑定在钩子精灵上,利用dSpriteMountToSpriteLinkPoint函数,将金块锚定在前面设定的钩子精灵链接点“1”。 继而就是把金块往回拉的过程,事先利用dGetSpritePositionX,dGetSpritePositionY获取钩子的起始位置并保存在全局变量中,之后利用dSpriteMoveTo移回初始位置。 Step4: 代码详解 定义全局变量来存放钩子的初始位置 floatg_fHookStartPosX;//存储钩子的初始X位置 floatg_fHookStartPosY;//存储钩子的初始Y位置 charszGotGoldName[20];//当前抓到金子的名称 在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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 游戏 黄金矿工 设计 思路
![提示](https://static.bdocx.com/images/bang_tan.gif)