黄金矿工实验报告Word下载.docx
《黄金矿工实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《黄金矿工实验报告Word下载.docx(19页珍藏版)》请在冰点文库上搜索。
11、g_fHookStartPosY存储钩子的初始Y位置
算法描述:
游戏状态g_iGameState分为三种状态0,1,2,其中0表示游戏结束状态,1表示游戏初始化,2则表示游戏运行状态;
0→1的转换为“空格开始”;
1→2的转换自然发生,即游戏初始化函数后会自动将游戏状态从1置为2;
2表示游戏运行状态,在该状态,按下↓键可以抓取金子;
2→0的转换为当金子全被抓完后会自动将游戏状态从2置为0;
金子精灵的初始化:
1、创建金子精灵的对象;
2、生成大小为4的小金块10个、大小为6的中金块6个、大小为8的大金块4个,并保存tmpName数组中,随机获取每个金子的坐标;
3、隐藏“空格开始”精灵;
4、设置屏幕中剩下的金子数目为20,每当被抓走的一块金子消失后屏幕中剩下的金子数目减1;
5、当屏幕中剩下的金子数目为0时,一局游戏结束,返回初始界面,“空格开始”精灵出现;
6、重新进行金子精灵的初始化;
dOnKeyDown(constintiKey,constboolbAltPress,constboolbShiftPress,constboolbCtrlPress)
游戏开始和控制按钮:
1、游戏还未开始,即游戏状态为0,如果空格按被下,则将游戏状态改为1,此时对程序的数据进行初始化,“空格开始”精灵消失,金子出现,钩子转动;
2、游戏状态为0时并按下空格键后,,如果按下↓键,钩子开始下放抓金子,当抓到金子后,游戏的状态变为2游戏正式开始运行;
3、游戏状态为2时,钩子抓住金子后,按照金子的大小设置金子的速度,金子越大,回拉速度越小;
4、当钩子和金子回到初始位置后,被抓的金子消失;
源代码:
在Main.cpp文件中
//-----------------------------------------------------------------------------
//
#include"
CommonAPI.h"
stdio.h"
string.h"
voidDrawHookLine();
intg_fGoldBornMinX=0;
intg_fGoldBornMaxX=0;
intg_fGoldBornMinY=0;
intg_fGoldBornMaxY=0;
intg_iGoldCount=20;
intg_iGameState=2;
intflag=1;
intflagnum=0;
charszGotGoldName[20];
//当前抓到金子的名称
floatg_fHookRotation=0.f;
floatg_fEmptyHookSpeed=35.f;
floatfTimeDelta;
floatg_fHookStartPosX;
//存储钩子的初始X位置
floatg_fHookStartPosY;
//存储钩子的初始Y位置
///////////////////////////////////////////////////////////////////////////////////////////
//主函数入口
//////////////////////////////////////////////////////////////////////////////////////////
intPASCALWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
{
//初始化游戏引擎
if(!
dInitGameEngine(hInstance,lpCmdLine))
return0;
//游戏初始化代码
dSetWindowTitle("
黄金矿工"
);
g_fGoldBornMinX=dGetScreenLeft()+5;
//金子左边界
g_fGoldBornMaxX=dGetScreenRight()-5;
//金子右边界
g_fGoldBornMinY=dGetScreenTop()+20;
//金子上边界
g_fGoldBornMaxY=dGetScreenBottom()-5;
//金子下边界
g_fHookStartPosX=dGetSpritePositionX("
GoldHook"
//获取钩子的初始X坐标
g_fHookStartPosY=dGetSpritePositionY("
//获取钩子的初始Y坐标
dSetSpriteCollisionSend("
goldHook"
1);
dSetSpriteCollisionReceive("
goldTemplate"
constfloatfRotateSpeed=45.f;
//摇摆速度,单位度/秒
intiHookRotToLeft=1;
//钩子摆动的方向:
1←;
0→
floatfTimeDelta=dGetTimeDelta();
//引擎主循环,处理屏幕图像刷新等工作
while(dEngineMainLoop())
{
//获取两次调用之间的时间差,传递给游戏逻辑处理
floatfTimeDelta=dGetTimeDelta();
DrawHookLine();
//执行游戏主循环
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("
g_fHookRotation);
}
elseif(g_iGameState==1)
{
dAnimateSpritePlayAnimation("
goldMan"
"
GolderManAnimation3"
1);
//播放拉金块的动作
//获取钩子X方向的速度
floatfSpeedX=dGetSpriteLinearVelocityX("
//获取钩子Y方向的速度
floatfSpeedY=dGetSpriteLinearVelocityY("
//当速度接近为0时,即可判定其已到达初始点
if(fSpeedX<
0.00001f&
&
fSpeedX>
-0.00001f&
fSpeedY<
fSpeedY>
-0.00001f)
//解除金块与钩子的锚定
dSpriteDismount(szGotGoldName);
//删除获取的金块
dDeleteSprite(szGotGoldName);
//回拉结束,设定状态为0
g_iGameState=0;
//播放矿工的动画,即准备拉金子的动画
if(flagnum)
{g_iGoldCount--;
}
//播放挖金者的动作(恢复初始守候动作)
dAnimateSpritePlayAnimation("
"
GolderManAnimation2"
if(g_iGoldCount==0)
dSetSpriteVisible("
GameBegin"
1);
g_iGoldCount=20;
flag=1;
};
dAnimateSpritePlayAnimation("
//关闭游戏引擎
dShutdownGameEngine();
return0;
}
//==========================================================================
//引擎捕捉鼠标移动消息后,将调用到本函数
voiddOnMouseMove(constfloatfMouseX,constfloatfMouseY)
//可以在此添加游戏需要的响应函数
//引擎捕捉鼠标点击消息后,将调用到本函数
voiddOnMouseClick(constintiMouseType,constfloatfMouseX,constfloatfMouseY)
//引擎捕捉键盘按下消息后,将调用到本函数
//iAltPressiShiftPressiCtrlPress分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。
比如可以判断Ctrl+E组合键
voiddOnKeyDown(constintiKey,constintiAltPress,constintiShiftPress,constintiCtrlPress)
if(iKey==KEY_SPACE)
g_iGameState=1;
//初始化之后,将游戏状态设置为进行中
dSetSpriteVisible("
0);
//生成金子
intiLoop=0;
//循环变量控制
intiSize=4,iPosX=0,iPosY=0;
//iSize表示金块大小的变量
if(flag)
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("
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);
flag=0;
if(g_iGoldCount==0)
flag=1;
g_iGoldCount=20;
if(iKey==KEY_DOWN&
g_iGameState==0)
{//按下↓并且游戏状态为"
0"
g_iGameState=2;
//置游戏状态为2,可用于控制钩子是否摆动
//以当前朝向给钩子一个向前的速度
dSetSpriteLinearVelocityPolar("
g_fEmptyHookSpeed,g_fHookRotation);
//播放挖金者的动作(一个胳膊往下压的动作)
GolderManAnimation1"
0);
//0表示播放一次,这里胳膊往下压就是一次
}
//引擎捕捉键盘弹起消息后,将调用到本函数
voiddOnKeyUp(constintiKey)
//===========================================================================
//引擎捕捉到精灵与精灵碰撞之后,调用此函数
voiddOnSpriteColSprite(constchar*szSrcName,constchar*szTarName)
//发起者为GoldHook,接受者含有GoldBlock字段
if(strcmp(szSrcName,"
)==1&
strstr(szTarName,"
)!
=NULL)
dSpriteMountToSpriteLinkPoint(szTarName,"
2);
//将金块锚定在钩子上
dSpriteMoveTo("
g_fHookStartPosX,g_fHookStartPosY,g_fEmptyHookSpeed,1);
//使钩子向初始位置移动,即会拉
strcpy(szGotGoldName,szTarName);
//复制并保存当前抓取到金块的名称
//发起者为GoldHook,接受者含有GoldBlock字段
//根据金子大小,计算钩子的往回收的速度,越大的越慢。
//算法:
之前设置的金子大小为4,6,8,用10减去该大小再除以10,得到3个小//数:
0.6,0.4,0.2.该小数乘以空钩子的速度即得到挂接不同金子后的实际速度
floatfWidth=dGetSpriteWidth(szTarName);
floatfSpeed=((10.f-fWidth)/10.f)*g_fEmptyHookSpeed;
//钩子往初始位置移动
dSpriteMoveTo("
goldhook"
g_fHookStartPosX,g_fHookStartPosY,fSpeed,1);
0);
g_iGameState=1;
flagnum=1;
//引擎捕捉到精灵与世界边界碰撞之后,调用此函数.
//iColSide:
0左边,1右边,2上边,3下边
voiddOnSpriteColWorldLimit(constchar*szName,constintiColSide)
if(strcmp(szName,"
=0)
{
//碰到边界的为钩子时
dSpriteMoveTo(szName,g_fHookStartPosX,g_fHookStartPosY,g_fEmptyHookSpeed,1);
//同样设置为回拉,只是没有碰到金子
flagnum=0;
}
voidDrawHookLine()
//首先,从矿工精灵上获取一个缆绳链接点作为绳子的起始点(该链接点在编//辑器里编辑好)
floatfStartX=dGetSpriteLinkPointPosX("
GoldMan"
floatfStartY=dGetSpriteLinkPointPosY("
//绳子终点在钩子精灵上获取(该链接点在编辑器里编辑好)
floatfEndX=dGetSpriteLinkPointPosX("
floatfEndY=dGetSpriteLinkPointPosY("
//在这两点之间划线.线的颜色红绿蓝值都为50,即灰色
dDrawLine(fStartX,fStartY,fEndX,fEndY,2.f,0,50,50,50,255);
8、游戏运行,初试界面出现‘空格开始’的提示。
学号
姓名
任务
成绩
解决程序结构布局问题;
解决画线函数问题;
写实验报告;
解决捕捉到精灵与精灵碰撞问题;
解决捕捉到精灵与世界边界碰撞问题;
解决捕捉键盘按下消息问题;
同一个问题可以用不同的代码解决,如该程序中的画线部分;
部分程序代码在程序中不能实现,可能是该软件的bug;
编程过程中加深了对全局变量和局部变量的了解;
要理解函数的意义,不然会弄乱;
程序要写清晰明快,不然在检查的时候会很麻烦;
随着对该软件的理解,对C语言中的结构函数有了更深的了解;
评阅教师签名