C++语言课程设计-桌球(11页).doc
《C++语言课程设计-桌球(11页).doc》由会员分享,可在线阅读,更多相关《C++语言课程设计-桌球(11页).doc(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-C+语言课程设计-桌球-第 11 页C+语言课程设计一桌球一、实验内容玩家通过移动球杆到单一的桌球处碰撞桌球运动,当桌球于一定速度通过桌面右方的同样颜色的球洞后,则该球进洞,在桌面左边重新分配新球开始游戏。要求如下:1. 游戏的初始界面如下,其中左边有一个体积较小的桌球,其x方向位置固定,y方向位置随机。右边有八个颜色不一样,体积较大的球洞,游戏的目的是使用左边的桌球以一定小的速度穿过右边同样颜色的球洞就算桌球进洞,然后重新分配新球。2. 球杆随鼠标运动而运动,单击球杆,桌球获取一个前进的速度同时往前有运动。桌球的前进方向有一段指示球运动方向的虚线。3. 右侧的球洞以移动的频率不断更换位置。
2、球洞的x左边不变,更换的是y坐标的位置,即每一轮中每一个球洞移动到下一个球洞的位置,最下边的球洞则移动到第一个球洞位置。所以的这些动作都要在一个频率的时间里面完成。因此当游戏一某一个频率进行的时候,右侧的球洞就能实现循环变化的效果。4. 球碰撞到桌面边沿的时候以发射角的角度弹走。5. 球进洞的判断是球以一定的速度通过同样颜色的球洞时,桌球消失,表明球进洞了,此时左侧随机生成新球。球运动到球洞的速度不能太大,太大则球直接运动过球洞,如果速度太小,则球同样不进洞。二、实验指南实验一开始实验【实验任务】步骤一、打开FunCode,创建一个的C+语言项目;步骤二、导入snooker模板。【实验思路】按
3、实验指导完成。【实验指导】1、 打开FunCode,点击“项目”菜单,选择“创建C+工程”注意:工程名名称要求字母开头,只能包含字母和数字,且名字中间不能有空格。2、 点击菜单“项目”中的“导入地图模块”,如图一。跳出一个对话框,选中“snooker”模板,点击“导入到工程”按钮,如图二。 图 一 图 二3、导入成功后的,界面如下图所示:实验二初始化桌球和球杆同时在球的前进方向画虚线【实验内容】步骤一、设置球的初始位置,球杆的初始朝向步骤二、设置球杆随鼠标移动步骤三、在球的前进方向上画虚线【实验思路】在设置初始球的时候要考虑随机本局的球数字,如果和上一局的不一致,则将上局的球拉到屏幕外,将本局
4、的球拉到屏幕内,在Y向上随机摆放球的出生位置,只随机Y方向坐标,不动X方向。对于球杆则通过系统的OnMouseMove函数获取到鼠标移动时的坐标位置,然后使用SetSpritePosition函数同步设置桌球精灵的位置。通过获取球的X和Y坐标,并求两个坐标平方和的平方根来得到球运动方向向量的大小,利用循环调用系统画线函数画虚线。【实验指导】1. 进入LessonX.h,添加CGameMain的成员变量,前面几个实验之后我们知道了类的成员变量一般设置访问属性为private,代码如下:int m_iPlayState;/ 操作状态,0 - 可以点击鼠标打球;1 - 球在运动中,等待下次打球机会i
5、nt m_iBallNumber;/ 每局从0-7随机一个颜色图片,作为本局的球floatm_fOldRotation;/ 球杆的初始朝向,用于球杆复位CSprite*m_spBall8;/ 8个球的精灵CSprite*m_spBallCue;/球杆精灵2. 进入LessonX.cpp中,在构造函数里面先把m_iGameState的值由0改为1。然后填写初始化代码:m_iPlayState=0;m_iBallNumber=0;m_fOldRotation=0.f;/初始化球杆精灵m_spBallCue=new CSprite(BallCue);/初始化球和球洞精灵char* tmpName=;
6、for(int iLoop = 0; iLoop SetSpritePositionY(50.f);/ 新球,移动到屏幕中m_iBallNumber=iNewBallNumber;m_spBallm_iBallNumber-SetSpritePositionX(-30.f);在Y向上随机摆放球的初始位置,只随机Y方向坐标,不动X方向intiPosY=CSystem:RandomRange( -25, 25 );m_spBallm_iBallNumber-SetSpritePositionY(float)iPosY);获取球拍的初始朝向,只做一次static int iInited = 0;if
7、( !iInited )iInited=1;m_fOldRotation=m_spBallCue-GetSpriteRotation();4. 设置球杆随鼠标移动而移动。首先通过系统的OnMouseMove函数实时获取到鼠标移动的坐标位置参数,然后将该参数传给球杆精灵的SetSpritePosition函数,这样就能让球杆随鼠标移动了。由于鼠标在地图中有自己的图标,因此我们需要调用系统的隐藏鼠标的函数ShowCursor将鼠标隐藏掉。实现步骤如下:1) 在LessonX.h中添加我们自己定义的OnMouseMove函数的声明:voidOnMouseMove( const float fMous
8、eX, const float fMouseY );/参数即为鼠标X,Y坐标的值2) 在LessonX.cpp中填写该函数的定义:void CGameMain:OnMouseMove( const float fMouseX, const float fMouseY )3) 调用球杆精灵的设置位置函数SetSpritePosition将鼠标的位置设置为球杆精灵的位置。在上面的函数里面填入:m_spBallCue-SetSpritePosition(fMouseX, fMouseY );4) 使用CSystem的隐藏鼠标的函数ShowCursor将鼠标在地图的图标隐藏掉。这一步可以在程序初始化的
9、时候就完成。在GameInit函数里面的if( !iInited )判断里面填入一行代码:CSystem:ShowCursor(0);5) 在Main.cpp中的OnMouseMove函数里面填入我们的自定义函数,实时获取鼠标坐标参数:g_GameMain.OnMouseMove(fMouseX,fMouseY);5. 在球运动的方向画虚线比较简单。主要是获取球和球杆连线的向量,然后等到该向量的单位向量大小,调用DrawLine函数,利用for循环,判断循环因子为偶数的时候不画线,奇数的时候才画线。首先声明定义函数,进入LessonX.h,在CGameMain类中添加画虚线的函数声明:void
10、 DrawDottedLine();然后在LessonX中添加函数的定义:void CGameMain:DrawDottedLine()1) 在函数中填入如下代码:/ 获取球杆和球的位置floatfBallPosX=m_spBallm_iBallNumber-GetSpritePositionX();floatfBallPosY=m_spBallm_iBallNumber-GetSpritePositionY();floatfCuePosX=m_spBallCue-GetSpritePositionX();floatfCuePosY=m_spBallCue-GetSpritePositionY
11、();m_spBallm_iBallNumber是指当前桌面上的球。2) 通过上面得到的坐标计算球和球杆之间的向量(fVectorX,fVectorY)。floatfVectorX=fBallPosX - fCuePosX;floatfVectorY=fBallPosY - fCuePosY;3) 判断球和球杆不重合的时候就执行画线操作。所以还需要在上面的代码后面添加一个if的判断,同时计算向量(fVectorX,fVectorY)的大小,以及将该向量单位化:/ 如果只有当两点不重合的时候(向量值不为零),才需要处理if( fVectorX 0.001f | fVectorX 0.001f |
12、 fVectorY -0.001f )/ 计算该向量的大小,以及将该向量单位化(sqrt函数是开平方函数,回想下数学里如何求单位向量)floatfVectorSize=sqrt( fVectorX * fVectorX + fVectorY * fVectorY );floatfDirX=fVectorX / fVectorSize;floatfDirY=fVectorY /fVectorSize;因为sqrt()这个开方函数,所以需要包含头文件:#include4) 用循环,画出球前进方向的虚线,算法:我们用循环画12段首尾相连的线段,如果全部画出来就是一条实线,如果循环变量为偶数就画,为奇
13、数就不画,那么就得到一条虚,画一条线需要前后两个点: 一个点使用LastPos,一个点使用NewPos。循环12次,按照下面步骤写代码:NewPos等于LastPos加上Dir乘以PosStep(单位向量乘以长度值等于该向量上的一个坐标点)当循环变量为偶数的时候,使用DrawLine画一根线。在画了线之后,将NewPos赋值给LastPos具体代码如下:intiLoop= 0;floatfLastPosX= fBallPosX, fLastPosY = fBallPosY;floatfNewPosX= 0.f, fNewPosY = 0.f;floatfPosStep= fVectorSize
14、 / 10.f;for( iLoop = 0; iLoop 12; iLoop+ )/ 新坐标等于前一坐标加上向量方向上的一个距离值fNewPosX=fLastPosX + fDirX * fPosStep;fNewPosY=fLastPosY + fDirY * fPosStep;/ 偶数段就画if( iLoop % 2 = 0 )CSystem:DrawLine( fLastPosX, fLastPosY, fNewPosX, fNewPosY, 2.f, 0, 0, 255, 0, 255 );/ 坐标往前移动(NewPos赋值给LastPos)fLastPosX=fNewPosX;fL
15、astPosY=fNewPosY;5) 进入LessonX.cpp,在GameRun函数里面,先判断是否处理可以打球的状态,即球目前还处于静止状态,是的话就调用DrawDottedLine()进行画虚线操作:if( 0 = m_iPlayState )DrawDottedLine();实验三 球洞来回循环滚动【实验内容】步骤、循环改变球洞的位置实现来回滚动【实验思路】使用循环,将数组值分别往后移动一位,最后一位移动到第一位。同时移动精灵名字数组,移动对应的精灵Y坐标(移动精灵。使用GetSpritePositionY获取精灵的位置,交换一下,用SetSpritePositionY赋值回去)思路
16、:先取出最后一个的值、名字、Y坐标,由后往前遍历数组,依次将前一个的值覆盖当前的值,最后将取出来的值赋值给第一个(这一步是在循环结束后做)【实验指导】1. 进入LessonX.h,添加CGameMain类球洞精灵的声明:intm_iHoleNumber8;/ 8个球洞当前的数字值,0 - 7来回滚动。对应的球数字打入对应的球洞才胜利CSprite*m_spBallHole8;/ 8个球洞的精灵floatm_fHoleRollTime;/ 球洞循环滚动间隔时间2. 进入LessonX.cpp,在构造函数里面初始化球洞精灵变量:m_fHoleRollTime=0.f;在构造函数for( iLoop
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 语言 课程设计 桌球 11
限制150内