游戏黄金矿工设计思路讲课教案Word文件下载.docx
《游戏黄金矿工设计思路讲课教案Word文件下载.docx》由会员分享,可在线阅读,更多相关《游戏黄金矿工设计思路讲课教案Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
/*dSetSpriteWidth:
设置精灵外形宽度
*参数szName:
精灵名字
*参数fWidth:
宽度值,大于0
externvoiddSetSpriteWidth(constchar*szName,constfloatfWidth);
/*dGetSpriteWidth:
获取精灵外形宽度
精灵宽度值
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<
g_iGoldCount;
iLoop++)
{
if(iLoop<
10)//生成10个小金块,大小为4
{
iSize=4;
}
elseif(iLoop>
=10&
&
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度来回转动,这样矿工就可以控制抓取范围了,也为后面的抓取金子做好准备。
点击添加一个新的动画
添加GolderManAnimation1,GolderManAnimation2,GolderManAnimation3到环境中,添加完后效果如图:
将GolderManAnimation2拖进屏幕,并取名为GoldMan,如下图所示:
同理,将静态精灵中的钩子,拖进屏幕,按初始界面排放。
并在右侧的“编辑”中设置名称如下:
钩子
布置好后的效果如下:
/*dSetSpriteRotation:
设置精灵的旋转角度
*参数fRot:
旋转角度,范围0-360
externvoiddSetSpriteRotation(constchar*szName,constfloatfRot);
实现钩子的180度来回摆动,其实就是不断地设置钩子与地面的夹角从0—180度不断地变化,可以利用dSetSpriteRotation来进行设置。
为了使钩子以恒定的速度来回摆动,我们可以自定义一个初始化速度speed,然后利用游戏屏幕刷新的时间fTimeDelta来实现,即speed*fTimeDelta即为当前钩子所在的角度位置。
代码及注释
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函数
学会利用全局变量来控制游戏的运行状态。
这节我们实现黄金矿工在某一角度放下绳索的操作,为之后的真正抓取金子做好准备
图片资源编辑
打开funcode,单击地图上的矿工精灵图像,在显示框的上面五个选择左数第二个“编辑此精灵的链接点”,如图所示
按如图所示依次单击这位置显示0,保存即可。
同上,点击地图上的钩子精灵,选择“编辑此精灵的链接点”,依次单击这个位置显示0,最后保存即可。
/*dSetSpriteLinearVelocityPolar:
按角度朝向设置精灵移动速度
*参数fSpeed:
移动速度
*参数fPolar:
角度朝向
externvoiddSetSpriteLinearVelocityPolar(constchar*szName,constfloatfSpeed,constfloatfPolar);
/*dAnimateSpritePlayAnimation:
动画精灵播放动画
*参数szAnim:
动画名字
*参数iRestore:
播放完毕后是否恢复当前动画.1恢复0不恢复
是否播放成功,1:
成功0:
不成功
externintdAnimateSpritePlayAnimation(constchar*szName,constchar*szAnim,constintiRestore);
/*dGetSpriteLinkPointPosX:
获取精灵链接点X坐标。
链接点是依附于精灵的一个坐标点,*可以在编辑器里增加或者删除
*参数iId:
链接点序号,第一个为1,后面依次递加
externfloatdGetSpriteLinkPointPosX(constchar*szName,constintiId);
/*dGetSpriteLinkPointPosY:
获取精灵链接点Y坐标。
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);
利用dSetSpriteLinearVelocityPolar即可实现钩子在某一角度放线,另外可以通过dAnimateSpritePlayAnimation来播放放线时矿工的动作,所以放线问题不大。
但要注意三个问题:
何时放线,放线的时候钩子停止旋转,在钩子和矿工之间画一条线表示绳索。
下面来解决这三个问题:
何时放线:
我们不妨利用键盘上的方向键中的↓来控制放线,在dOnKeyDown添加响应释放绳索的操作,这和海底世界中的WSAD控制鱼的方向原理类似;
放线的时候钩子停止旋转:
与海底世界中鼠标控制鱼游动一样,可以添加一个全局变量,当该变量为0时,钩子旋转当释放绳索时,置其为1,这样钩子就不会旋转了。
绳索的展现:
在step1中已经设置了链接点,其中矿工的0和钩子的0已经设置好,通过dGetSpriteLinkPointPosX和dGetSpriteLinkPointPosY获取这两个链接的位置,然后利用
dDrawLine函数在两点之间画线即可。
首先定义钩子旋转的全局变量:
intg_iGameState=0;
//游戏状态,0表示钩子旋转,1表示释放绳索,后面还会定义其他状态
在定义一个释放绳索速度的全局变量
floatg_fEmptyHookSpeed=15.f;
在dOnKeyDown中添加响应↓按键的代码:
if(KEY_DOWN==iKey&
g_iGameState==0)
{
//按下↓并且游戏状态为“1”
g_iGameState=1;
//置游戏状态为1,可用于控制钩子是否摆动
//以当前朝向给钩子一个向前的速度
dSetSpriteLinearVelocityPolar("
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>
g_fHookRotation=180.f;
iHookRotToLeft=0;
}
else
g_fHookRotation=0.f;
iHookRotToLeft=1;
最后,还是在while循环中,添加画线连接的操作:
//首先,从矿工精灵上获取一个缆绳链接点作为绳子的起始点(该链接点在编辑器里编辑好)
floatfStartX=dGetSpriteLinkPointPosX("
1);
floatfStartY=dGetSpriteLinkPointPosY("
//绳子终点在钩子精灵上获取(该链接点在编辑器里编辑好)
floatfEndX=dGetSpriteLinkPointPosX("
floatfEndY=dGetSpriteLinkPointPosY("
//在这两点之间划线.线的颜色红绿蓝值都为50,即灰色;
255表示不透明,2.0f表示线的粗细,0表示所在的层
dDrawLine(fStartX,fStartY,fEndX,fEndY,2.f,0,50,50,50,255);
编译运行,在适当的位置按↓,可以发现钩子跟着绳索一起释放,如图:
1.使钩子在抓到金块时以初始速度0.8倍的速度返回,碰到边界时则以两倍的速度返回。
抓取金子
学习应用dSetSpriteLinearVelocityPolar,dAnimateSpritePlayAnimation,dGetSpritePositionXdGetSpritePositionY函数
学习strcpy函数
有了前面的基础,我们可以顺利的释放绳索了,然而当钩子在碰到金块时会穿过去而不会将其抓住并拉回来。
这节我们就来实现黄金矿工抓取金块并拖回的操作。
点击地图上的钩子精灵,选择“编辑此精灵的链接点”,如图所示添加1链接点,保存即可。
在WinMain的复制金子前给钩子加上发送碰撞属性:
dSetSpriteCollisionSend("
goldHook"
1);
在WinMain的复制金子前给金块加上接受碰撞属性:
dSetSpriteCollisionReceive("
注意:
不要勾上接受物理碰撞与发送物理碰撞,否则funcode会自己处理碰撞
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坐标
精灵的Y坐标
externfloatdGetSpritePositionY(constchar*szName);
钩子抓取金块实际上就是精灵与精灵碰撞的过程,所以应该在dOnSpriteColSprite中做文章。
dOnSpriteColSprite中的szSrcName,szTarName可以判定碰撞的对象是否是金块和钩子。
若是,则将金块绑定在钩子精灵上,利用dSpriteMountToSpriteLinkPoint函数,将金块锚定在前面设定的钩子精灵链接点“1”。
继而就是把金块往回拉的过程,事先利用dGetSpritePositionX,dGetSpritePositionY获取钩子的起始位置并保存在全局变量中,之后利用dSpriteMoveTo移回初始位置。
定义全局变量来存放钩子的初始位置
floatg_fHookStartPosX;
//存储钩子的初始X位置
floatg_fHookStartPosY;
//存储钩子的初始Y位置
charszGotGoldName[20];
//当前抓到金子的名称
在WinMain的初始化中,添加:
g_fHookStartPosX=dGetSpritePositionX("
//获取钩子的初始X坐标
g_fHookStartPosY=dGetSpritePositionY("
//获取钩子的初始Y坐标
在dOnSpriteColSprite中添加处理金块与钩子碰撞的代码:
//发起者为GoldHook,接受者含有GoldBlock字段
if(strcmp(szSrcName,"
)==0&
strstr(szTarName,"
)!
=NULL){
dSpriteMountToSpriteLinkPoint(szTarName,"
2);
//将金块锚定在钩子上
dSpriteMoveTo("