黄金矿工实验报告Word下载.docx

上传人:b****4 文档编号:7819327 上传时间:2023-05-09 格式:DOCX 页数:19 大小:724.71KB
下载 相关 举报
黄金矿工实验报告Word下载.docx_第1页
第1页 / 共19页
黄金矿工实验报告Word下载.docx_第2页
第2页 / 共19页
黄金矿工实验报告Word下载.docx_第3页
第3页 / 共19页
黄金矿工实验报告Word下载.docx_第4页
第4页 / 共19页
黄金矿工实验报告Word下载.docx_第5页
第5页 / 共19页
黄金矿工实验报告Word下载.docx_第6页
第6页 / 共19页
黄金矿工实验报告Word下载.docx_第7页
第7页 / 共19页
黄金矿工实验报告Word下载.docx_第8页
第8页 / 共19页
黄金矿工实验报告Word下载.docx_第9页
第9页 / 共19页
黄金矿工实验报告Word下载.docx_第10页
第10页 / 共19页
黄金矿工实验报告Word下载.docx_第11页
第11页 / 共19页
黄金矿工实验报告Word下载.docx_第12页
第12页 / 共19页
黄金矿工实验报告Word下载.docx_第13页
第13页 / 共19页
黄金矿工实验报告Word下载.docx_第14页
第14页 / 共19页
黄金矿工实验报告Word下载.docx_第15页
第15页 / 共19页
黄金矿工实验报告Word下载.docx_第16页
第16页 / 共19页
黄金矿工实验报告Word下载.docx_第17页
第17页 / 共19页
黄金矿工实验报告Word下载.docx_第18页
第18页 / 共19页
黄金矿工实验报告Word下载.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

黄金矿工实验报告Word下载.docx

《黄金矿工实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《黄金矿工实验报告Word下载.docx(19页珍藏版)》请在冰点文库上搜索。

黄金矿工实验报告Word下载.docx

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语言中的结构函数有了更深的了解;

评阅教师签名

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

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2