(完整版)“黄金矿工”实验报告_第1页
(完整版)“黄金矿工”实验报告_第2页
(完整版)“黄金矿工”实验报告_第3页
(完整版)“黄金矿工”实验报告_第4页
(完整版)“黄金矿工”实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、中国石油大学(华东)程序设计实训报告 “黄金矿工”实验报告游戏截图图一:开始游戏图二:按下空格键开始游戏,出现金块,钩子转动图三:按下键,钩子停止转动,开始下放,抓取金块图四:抓完金块后返回初始界面功能描述1、 游戏运行,初始界面出现“空格开始”的提示。2、 玩家按下空格键,开始游戏。3、 游戏开始后,界面随机出现20个大小不同的金子,并且钩子开始转动。4、 按下键,钩子停止转动,下放,抓取金子。5、 抓到金子后,返回到初始位置,被抓到的金子消失。6、 用户继续按下键,继续抓取金子,直到金子被抓取完,这样一局游戏完成。7、 一局游戏完成后,屏幕重新出现“空格开始”的标志,用户按下空格可以继续游

2、戏,如此往复。流程图:数据结构:1、g_fGoldBornMinX 金子左边界2、g_fGoldBornMaxX 金子右边界3、g_fGoldBornMinY 金子上边界4、g_fGoldBornMaxY 金子下边界5、g_iGoldCount 屏幕中金子数目6、g_iGameState 设置游戏状态7、szGotGoldName20 当前抓到金子的名称8、g_fHookRotation 钩子的转动的角速度9、 g_fEmptyHookSpeed 钩子的下放的初始速度10、g_fHookStartPosX 存储钩子的初始X位置11、g_fHookStartPosY 存储钩子的初始Y位置算法描述

3、:游戏状态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,每当被抓走的一块金子消失后屏幕中剩

4、下的金子数目减1;5、当屏幕中剩下的金子数目为0时,一局游戏结束,返回初始界面,“空格开始”精灵出现;6、重新进行金子精灵的初始化;dOnKeyDown(const intiKey, const boolbAltPress, const boolbShiftPress, const boolbCtrlPress )游戏开始和控制按钮:1、 游戏还未开始,即游戏状态为0,如果空格按被下,则将游戏状态改为1,此时对程序的数据进行初始化,“空格开始”精灵消失,金子出现,钩子转动;2、 游戏状态为0时并按下空格键后,如果按下键,钩子开始下放抓金子,当抓到金子后,游戏的状态变为2游戏正式开始运行;3、

5、游戏状态为2时,钩子抓住金子后,按照金子的大小设置金子的速度,金子越大,回拉速度越小;4、 当钩子和金子回到初始位置后,被抓的金子消失;源代码:在Main.cpp文件中/-/-#include CommonAPI.h#include stdio.h#include string.hvoidDrawHookLine();int g_fGoldBornMinX=0;intg_fGoldBornMaxX=0;intg_fGoldBornMinY=0;intg_fGoldBornMaxY=0;int g_iGoldCount= 20;intg_iGameState=2;int flag=1;int f

6、lagnum=0;char szGotGoldName20;/当前抓到金子的名称float g_fHookRotation = 0.f;float g_fEmptyHookSpeed=35.f;float fTimeDelta;float g_fHookStartPosX;/存储钩子的初始X位置float g_fHookStartPosY;/存储钩子的初始Y位置/ 主函数入口/int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)/ 初始化游戏引擎if( !d

7、InitGameEngine( hInstance, lpCmdLine ) )return 0;/ 游戏初始化代码 dSetWindowTitle(黄金矿工);g_fGoldBornMinX=dGetScreenLeft() + 5;/金子左边界g_fGoldBornMaxX=dGetScreenRight() - 5;/金子右边界g_fGoldBornMinY=dGetScreenTop() + 20;/金子上边界g_fGoldBornMaxY=dGetScreenBottom() - 5;/金子下边界g_fHookStartPosX = dGetSpritePositionX(GoldH

8、ook);/获取钩子的初始X坐标g_fHookStartPosY = dGetSpritePositionY(GoldHook);/获取钩子的初始Y坐标 dSetSpriteCollisionSend(goldHook, 1);dSetSpriteCollisionReceive(goldTemplate, 1);const floatfRotateSpeed = 45.f; / 摇摆速度,单位 度/秒int iHookRotToLeft = 1;/钩子摆动的方向:1 ;0 floatfTimeDelta=dGetTimeDelta(); / 引擎主循环,处理屏幕图像刷新等工作while( d

9、EngineMainLoop() )/ 获取两次调用之间的时间差,传递给游戏逻辑处理floatfTimeDelta=dGetTimeDelta();DrawHookLine(); / 执行游戏主循环if(g_iGameState = 0) float fThisRotate =fRotateSpeed * fTimeDelta; if( iHookRotToLeft )g_fHookRotation+= fThisRotate;if( g_fHookRotation = 180.f )g_fHookRotation=180.f;iHookRotToLeft=0; else g_fHookRot

10、ation-= fThisRotate; if( g_fHookRotation = 0.f )g_fHookRotation=0.f;iHookRotToLeft=1; dSetSpriteRotation(GoldHook,g_fHookRotation);else if(g_iGameState = 1)dAnimateSpritePlayAnimation(goldMan,GolderManAnimation3, 1 );/播放拉金块的动作 /获取钩子X方向的速度 floatfSpeedX=dGetSpriteLinearVelocityX(GoldHook); /获取钩子Y方向的速度

11、 floatfSpeedY=dGetSpriteLinearVelocityY(GoldHook); /当速度接近为0时,即可判定其已到达初始点 if( fSpeedX -0.00001f & fSpeedY -0.00001f ) /解除金块与钩子的锚定dSpriteDismount(szGotGoldName); /删除获取的金块dDeleteSprite(szGotGoldName); /回拉结束,设定状态为0g_iGameState = 0; /播放矿工的动画,即准备拉金子的动画 if(flagnum)g_iGoldCount-;/ 播放挖金者的动作(恢复初始守候动作)dAnimate

12、SpritePlayAnimation(goldMan, GolderManAnimation2, 1);if(g_iGoldCount=0)g_iGameState=0; dSetSpriteVisible(GameBegin,1); g_iGoldCount= 20;flag=1;dAnimateSpritePlayAnimation(goldMan, GolderManAnimation2, 1); / 关闭游戏引擎dShutdownGameEngine();return 0;/=/ 引擎捕捉鼠标移动消息后,将调用到本函数void dOnMouseMove( const float fM

13、ouseX, const float fMouseY )/ 可以在此添加游戏需要的响应函数/=/ 引擎捕捉鼠标点击消息后,将调用到本函数void dOnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY )/ 可以在此添加游戏需要的响应函数/=/ 引擎捕捉键盘按下消息后,将调用到本函数/ iAltPress iShiftPress iCtrlPress 分别为判断Shift,Alt,Ctrl当前是否也处于按下状态。比如可以判断Ctrl+E组合键void dOnKeyDown( const int

14、iKey, const int iAltPress, const int iShiftPress, const int iCtrlPress )/ 可以在此添加游戏需要的响应函数if(iKey=KEY_SPACE) g_iGameState=1; / 初始化之后,将游戏状态设置为进行中 dSetSpriteVisible(GameBegin,0); /生成金子 intiLoop=0;/循环变量控制 intiSize=4, iPosX = 0, iPosY = 0; /iSize表示金块大小的变量 if(flag) for( iLoop = 0; iLoop g_iGoldCount; iLoo

15、p+ ) if( 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);/设置金块的高度/设置金子精灵位置 iPos

16、X=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,可用于控制钩子是否摆动 / 以当

17、前朝向给钩子一个向前的速度 dSetSpriteLinearVelocityPolar(GoldHook,g_fEmptyHookSpeed, g_fHookRotation); / 播放挖金者的动作(一个胳膊往下压的动作) dAnimateSpritePlayAnimation(goldMan,GolderManAnimation1, 0); /0 表示播放一次,这里胳膊往下压就是一次/=/ 引擎捕捉键盘弹起消息后,将调用到本函数void dOnKeyUp( const int iKey )/ 可以在此添加游戏需要的响应函数/=/ 引擎捕捉到精灵与精灵碰撞之后,调用此函数void dOnSp

18、riteColSprite( const char *szSrcName, const char *szTarName )/ 发起者为GoldHook,接受者含有GoldBlock字段if(strcmp(szSrcName,GoldHook)= 1 & strstr(szTarName,GoldBlock)!=NULL ) dSpriteMountToSpriteLinkPoint( szTarName, GoldHook, 2 );/将金块锚定在钩子上 dSpriteMoveTo(GoldHook,g_fHookStartPosX, g_fHookStartPosY, g_fEmptyHoo

19、kSpeed, 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_

20、fEmptyHookSpeed; / 钩子往初始位置移动 dSpriteMoveTo( goldhook, g_fHookStartPosX, g_fHookStartPosY, fSpeed, 1); dAnimateSpritePlayAnimation(goldMan,GolderManAnimation1, 0 );/播放拉金块的动作g_iGameState = 1;flagnum=1;/=/ 引擎捕捉到精灵与世界边界碰撞之后,调用此函数./ iColSide : 0 左边,1 右边,2 上边,3 下边void dOnSpriteColWorldLimit( const char *szName, const int iColSide )if(strcmp(szName,GoldHook)!=0) /碰到边界的为钩子时dSpriteMoveTo(szName,g_fHookStartPosX, g_fHookStartPosY, g_fEmptyHookSpeed, 1); dAnimateSpritePlayAnimation(goldMan,GolderManAnimation3, 0);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论