游戏黄金矿工设计思路.docx

上传人:b****8 文档编号:29628533 上传时间:2023-07-25 格式:DOCX 页数:29 大小:2.01MB
下载 相关 举报
游戏黄金矿工设计思路.docx_第1页
第1页 / 共29页
游戏黄金矿工设计思路.docx_第2页
第2页 / 共29页
游戏黄金矿工设计思路.docx_第3页
第3页 / 共29页
游戏黄金矿工设计思路.docx_第4页
第4页 / 共29页
游戏黄金矿工设计思路.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

游戏黄金矿工设计思路.docx

《游戏黄金矿工设计思路.docx》由会员分享,可在线阅读,更多相关《游戏黄金矿工设计思路.docx(29页珍藏版)》请在冰豆网上搜索。

游戏黄金矿工设计思路.docx

游戏黄金矿工设计思路

实验:

黄金矿工

完成本实验后,可以实现矿工抓金子并计分的效果,如下所示:

复制金块

学习目标

学习应用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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1