玩家通过移动球杆到单一的桌球处碰撞桌球运动,当桌球于一定速度通过桌面右方的同样颜色的球洞后,则该球进洞,在桌面左边重新分配新球开始游戏。要求如下:
1. 游戏的初始界面如下,其中左边有一个体积较小的桌球,其x方向位置固定,y方向位置随机。右边有八个颜色不一样,体积较大的球洞,游戏的目的是使用左边的桌球以一定小的速度穿过右边同样颜色的球洞就算桌球进洞,然后重新分配新球。
2. 球杆随鼠标运动而运动,单击球杆,桌球获取一个前进的速度同时往前有运动。桌球的前进方向有一段指示球运动方向的虚线。
3. 右侧的球洞以移动的频率不断更换位置。球洞的x左边不变,更换的是y坐标的位置,即每一轮中每一个球洞移动到下一个球洞的位置,最下边的球洞则移动到第一个球洞位置。
所以的这些动作都要在一个频率的时间里面完成。因此当游戏一某一个频率进行的时候,右侧的球洞就能实现循环变化的效果。
4. 球碰撞到桌面边沿的时候以发射角的角度弹走。
5. 球进洞的判断是球以一定的速度通过同样颜色的球洞时,桌球消失,表明球进洞了,此时左侧随机生成新球。球运动到球洞的速度不能太大,太大则球直接运动过球洞,如果速度太小,则球同样不进洞。
实验任务】步骤。
一、打开funcode,创建一个的c++语言项目;
步骤。二、导入snooker模板。
实验思路】按实验指导完成。
实验指导】1、 打开funcode,点击“项目”菜单,选择“创建c语言工程”
注意:工程名名称要求字母开头,只能包含字母和数字,且名字中间不能有空格。
2、 点击菜单“项目”中的“导入地图模块”,如图一。跳出一个对话框,选中“snooker”模板,点击“导入到工程”按钮,如图二。
图一图二。3、导入成功后的,界面如下图所示:
实验内容】步骤。
一、设置球的初始位置,球杆的初始朝向。
步骤。二、设置球杆随鼠标移动。
步骤。三、在球的前进方向上画虚线。
实验思路】在设置初始球的时候要考虑随机本局的球数字,如果和上一局的不一致,则将上局的球拉到屏幕外,将本局的球拉到屏幕内,在y向上随机摆放球的出生位置,只随机y方向坐标,不动x方向。对于球杆则通过系统的donmousemove函数获取到鼠标移动时的坐标位置,然后使用dsetspriteposition函数同步设置桌球精灵的位置。通过获取球的x和y坐标,并求两个坐标平方和的平方根来得到球运动方向向量的大小,利用循环调用系统画线函数画虚线。
实验指导】1. 在中,初始化几个全局变量,**如下:
/ 游戏玩法设计:上方有8个球洞,分别是数字0-7,球洞间的数字按一定速率滚 //动,每局球都随机一个0-7的数字,对应的数字打入对应的球洞才胜利,开始打球 //状态。
g_iplaystate = 0;
g_frotatetime =
g_fholerolltime =
2. 初始化精灵:
/ 使用循环,给数组赋值:
/ 将数组的8个值分别赋值0-7即可,无需随机。名字使用dmakespritename分 //别产生,为ballhole0 - ballhole7
/ 球洞精灵预先摆放在场景中,因此不需要创建。
int iloop = 0;
for( iloop = 0; iloop < 8; iloop++
g_iholenumber[iloopiloop;
strcpy( g_szholename[iloop], dmakespritename( "ballhole", iloop )
3. 在中填写球和球杆的初始化**。
/ 随机本局的球数字,如果和上一局的不一致,则将上局的球拉到屏幕外,将本 //局的球拉到屏幕内。
int inewballnumber = drandomrange( 0, 7 );
if( inewballnumber !=g_iballnumber )
dsetspritepositiony( g_szballname, )
// 新球,移动到屏幕中。
g_iballnumber = inewballnumber;
strcpy( g_szballname, dmakespritename("ball", g_iballnumber) )
dsetspritepositionx( g_szballname, )
/ 在y向上随机摆放球的出生位置,只随机y方向坐标,不动x方向。
int iposy = drandomrange( -25, 25 );
dsetspritepositiony( g_szballname, (float)iposy );
/ 获取球拍的初始朝向,只做一次。
static int iinited = 0;
if( !iinited )
iinited = 1;
g_foldrotation = dgetspriterotation( "ballcue" )
4. 设置球杆随鼠标移动而移动。首先通过系统的donmousemove函数实时获取到鼠标移动的坐标位置参数,然后将该参数传给球杆精灵的dsetspriteposition函数,这样就能让球杆随鼠标移动了。
由于鼠标在地图中有自己的图标,因此我们需要调用系统的隐藏鼠标的函数showcursor将鼠标隐藏掉。实现步骤如下:
1) 在中添加我们自己定义的onmousemove函数的定义:
void cgamemain::onmousemove( const float fmousex, const float fmousey )
2) 调用球杆精灵的设置位置函数dsetspriteposition将鼠标的位置设置为球杆精灵的位置。在上面的函数里面填入:
dsetspriteposition( "ballcue", fmousex, fmousey );
3) 使用funcode提供的api函数dshowcursor将鼠标在地图的图标隐藏掉。这一步可以在程序初始化的时候就完成。在的初始化里面的if( !
iinited )判断里面填入一行**:
dshowcursor( 0 );
5. 在球运动的方向画虚线比较简单。主要是获取球和球杆连线的向量,然后等到该向量的单位向量大小,调用drawline函数,利用for循环,判断循环因子为偶数的时候不画线,奇数的时候才画线。
1) 在中,在while循环里面,先判断是否处理可以打球的状态,即球目前还处于静止状态,是的话就进行画线操作。填入如下**:
if( 0 ==g_iplaystate )
/ 下面的**,用于画出球前进方向的一段虚线。
/ 之前的案例里,有段画抛物线弹道轨迹的**,比较复杂。这里画虚线比较简单,可以自己动手实现。
/ 获取球杆和球的位置。
float fballposx = dgetspritepositionx( g_szballname );
float fballposy = dgetspritepositiony( g_szballname );
float fcueposx = dgetspritepositionx( "ballcue" )
float fcueposy = dgetspritepositiony( "ballcue" )
m_spball[m_iballnumber]是指当前桌面上的球。
2) 通过上面得到的坐标计算球和球杆之间的向量(fvectorx,fvectory),在上面的if判断里面添加如下**。
/有a,b两点坐标,求两点间的向量 ==b减去a得到一条由a指向b的向量。
//下面的计算,得到一条球杆坐标指向球坐标的向量。
float fvectorx = fballposx - fcueposx;
float fvectory = fballposy - fcueposy;
3) 判断球和球杆不重合的时候就执行画线操作。所以还需要在上面的**后面添加一个if的判断,同时计算向量(fvectorx,fvectory)的大小,以及将该向量单位化:
if( fvectorx > 0.001f ||fvectorx < 0.001f ||fvectory > 0.001f ||fvectory <0.001f )
/ 计算该向量的大小,以及将该向量单位化(sqrt函数是开平方函数,回想下 //数学里如何求单位向量)
float fvectorsize = sqrt( fvectorx * fvectorx + fvectory * fvectory );
float fdirx = fvectorx / fvectorsize;
float fdiry = fvectory / fvectorsize;
C语言课程课程设计
课程设计报告。课程名称 c语言程序设计 系别 xxx 专业班级 xxx班 学号 xxxxxxxxxx 姓名 xxx 课程题目 10或100以内儿童加减乘除算术游戏。完成日期 2013.6.14 19 指导老师 xxx 2013年 6月 21日。附件 一 程序模块图。二 源程序。include inc...
C语言课程设计
目录。1 c语言程序课程设计教学大纲。2 c语言程序课程设计说明书。3 c语言程序课程设计报告 模板 4 c语言程序课程设计成绩评定表。xx xx学院。课程教学大纲。课程名称 c语言程序课程设计。适用专业 课程类别 专业基础课。制订时间 2010年11月 计算机科学与技术系制。c语言程序课程设计教学...
C语言课程设计
目录。1 c语言程序课程设计教学大纲。2 c语言程序课程设计说明书。3 c语言程序课程设计报告 模板 4 c语言程序课程设计成绩评定表。珠海学院。课程教学大纲。课程名称 c语言程序课程设计。适用专业 2010级计算机科学与技术系各专业。课程类别 专业基础课。制订时间 2010年11月 计算机科学与技...