游戏黄金矿工设计思路.docx
《游戏黄金矿工设计思路.docx》由会员分享,可在线阅读,更多相关《游戏黄金矿工设计思路.docx(29页珍藏版)》请在冰豆网上搜索。
游戏黄金矿工设计思路
实验:
黄金矿工
完成本实验后,可以实现矿工抓金子并计分的效果,如下所示:
复制金块
学习目标
学习应用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:
获取精灵外形宽度
精灵宽度值
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,置为向右转,即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:角度朝向*/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
{
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度来回转动,这样矿工就可以控制抓取范围了,也为后面的抓取金子做好准备。
点击添加一个新的动画
添加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("GoldHook",g_fEmptyHookSpeed,g_fHookRotation);
//播放挖金者的动作(一个胳膊往下压的动作)
dAnimateSpritePlayAnimation("GoldMan","GolderManAnimation1",0);
//0表示播放一次,这里胳膊往下压就是一次
在WinMain中,修改钩子摆动的代码,以控制摆动状态,即加入了if判断。
if(g_iGameState==0)
floatfThisRotate=fRotateSpeed*fTimeDelta;
else
g_fHookRotation-=fThisRotate;
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函数
有了前面的基础,我们可以顺利的释放绳索了,然而当钩子在碰到金块时会穿过去而不会将其抓住并拉回来。
这节我们就来实现黄金矿工抓取金块并拖回的操作。
点击地图上的钩子精灵,选择“编辑此精灵的链接点”,如图所示添加1链接点,保存即可。
在WinMain的复制金子前给钩子加上发送碰撞属性:
dSetSpriteCollisionSend("goldHook",1);
在WinMain的复制金子前给金块加上接受碰撞属性:
dSetSpriteCollisionReceive("goldTemplate",1);
注意:
不要勾上接受物理碰撞与发送物理碰撞,否则funcode会自己处理碰撞
Funcode接口介绍
/*dOnSpriteColSprite:
精灵与精灵碰撞后将被调用的函数,可在此函数体里(Main.cpp)
*增加自己的响应代码
*精灵之间要产生碰撞,必须在编辑器或者代码里设置精灵发送及接受碰撞
*参数szSrcName:
发起碰撞的精灵名字
*参数szTarName:
被碰撞的精灵名字
externvoiddOnSpriteColSprite(constchar*szSrcName,constchar*szTarName);
/*dSpriteMountToSpriteLinkPoint:
将一个精灵绑定到另一个精灵上,绑定位置为指定*的链接点,暂时的成为另一个精灵的一部分,跟随其运动等
要绑定的精灵名字
*参数szDstName:
承载绑定的母体精灵名字
*参数iPointId:
链接点序号
返回一个绑定ID
externintdSpriteMountToSpriteLinkPoint(constchar*szSrcName,constchar*szDstName,constintiPointId);
/*dGetSpritePositionX:
获取精灵X坐标
精灵的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("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