08 C++课程设计 - 弹弹堂 - 图文 下载本文

C++语言课程设计 — 弹弹堂

一、实验内容

玩家通过控制键盘上的按键来发射炮弹击中右边的目标,直到目标被击毁。 要求如下:

1. 游戏的初始界面如下,左下角是一个炮台精灵,用于发射炮弹,中间是一个石块精

灵,可以阻挡炮弹且自身不受到伤害,右边是三个目标精灵。

2. 按下键盘上的上下方向键可以改变炮台精灵的发射角度,同时炮台精灵上方的“角

度”文字显示精灵会响应显示炮弹对应的角度值,角度越往上,值越小。按下空格键可以设置炮台精灵的发射力度,空格键按下的时间越久,力度越大。此时,会有一条抛物线从炮台精灵发射口中画出,用于指示发射炮弹的路线。同时,炮台精灵上方的“力度”文字显示精灵会响应显示炮台精灵发射力度值。释放空格键,炮弹发射,以抛物线的形式运动。

3. 右边是三个目标动画精灵,炮弹每击中一次之后,目标变成损伤状态,被炮弹击中

三次,目标精灵死亡,直到三个目标精灵死亡,游戏重新生成三个目标精灵。无论炮弹是否击中目标精灵,每完成一次发射,三个目标精灵的位置随机改变一次。 4. 无论炮弹击中目标精灵、石块精灵或者是地面,都会响应播放爆炸效果图。

二、实验指南

实验一 开始实验

【实验任务】

步骤一、打开FunCode,创建一个的C++语言项目;

步骤二、导入TanTanTang场景。

【实验思路】 按实验指导完成。

【实验指导】

1、 打开FunCode,点击“项目”菜单,选择“创建C++工程”

注意:工程名名称要求字母开头,只能包含字母和数字,且名字中间不能有空格。 2、 点击菜单“项目”中的“导入地图模块”,如图一。跳出一个对话框,选中“TanTanTang”

模板,点击“导入到工程”按钮,如图二。

图 一 图 二 3、 导入成功后的,界面如下图所示:

地图不仅包括界面设计,还包括该游戏可能要用到的其他精灵。添加到“场景”中的精灵,都已经取好名称,并根据程序要求设置好中心点、链接点等,学生只需要直接编程就可以。

实验二 初始化目标精灵

【实验内容】

步骤一、随机移动位置 步骤二、播放初始动画

【实验思路】

在X方向上随机生成坐标位置并使用for循环随机设置三个目标精灵的位置,最后播放初始动画,即目标精灵上下弹跳的动画。

【实验指导】

1、 进入LessonX.h中,在#include下添加宏定义:

#define TARGET_COUNT 3

2、 在CGameMain类中添加下面的成员变量声明:

// 开炮状态:0 - 等待开炮,1 - 炮弹飞行中 // 等炮弹爆炸之后才开始下一轮开炮流程 int int

m_iFireState ;

m_iTargetHit[TARGET_COUNT];

;

// 目标被击中次数,被击中3次后死亡重新开始下回合

// 最大旋转角度,也是初始角度 static const float m_fMaxRotation //目标精灵数组

CAnimateSprite* m_pTarget[TARGET_COUNT]; CSprite* m_pStoneSprite; //声明石块精灵 CSprite* m_pBottomWall;//声明精灵下方地面精灵

3、 进入LessonX.cpp中在构造函数里面添加以上变量的初始化代码:

m_iFireState

{

=

0;

for(int i=0;i

m_iTargetHit[i]=0;

m_pTarget[i]=new CAnimateSprite(CSystem::MakeSpriteName(\ }

m_pStoneSprite = new CSprite(\创建石块精灵

m_pBottomWall = new CSprite(\创建精灵下方地面精灵 并把构造函数中m_iGameState的值由0改为1,使游戏运行时直接初始化:

m_iGameState

=

1;

由于m_fMaxRotation是const类型的变量,因此我们需要单独对其进行初始化,在LessonX.cpp的最后面添加下面一行:

const float CGameMain::m_fMaxRotation=350.f;

4、 进入GameInit函数,添加下面代码:

m_iFireState

=

0; //初始化为未开炮状态

5、 初始化目标精灵数据,使用循环给m_iTargetCount的每个值清零,给每个

m_szTargetName做以下事:使用随机数函数RandomRange在0到45之间获取一个随机值,作为此目标本次移动的终点X坐标,Y坐标从精灵身上获取GetSpritePositionY,使用SpriteMoveTo函数,让其移动到指定坐标。速度为40,AutoStop参数为1,表示移动到终点后停止下来。使用SetSpriteVisible函数,让精灵显示出来(上一局被打死之后被隐藏了),使用AnimateSpritePlayAnimation( m_szTargetName, \0 ); 让目标精灵更换回出生时的动画/图片。在GameInit函数里面添加下面的代码:

int

iLoop = 0;

float fPosX = 0, fPosY = 0;

for( iLoop = 0; iLoop < TARGET_COUNT; iLoop++ ) { }

m_iTargetHit[iLoop] = fPosX fPosY

m_pTarget[iLoop]->SpriteMoveTo(fPosX, fPosY, 40.f, 1); m_pTarget[iLoop]->SetSpriteVisible(1); // 恢复初始动画/图片

m_pTarget[iLoop]->AnimateSpritePlayAnimation(\

= =

0;

// 在X方向上,目标在0-45范围内随机移动

CSystem::RandomRange( 0, 45 ); m_pTarget[iLoop]->GetSpritePositionY();

至此,本实验结束。

实验三 准备开炮

【实验内容】

步骤一、增加炮台力度 步骤二、改变炮台角度

步骤三、画炮弹发射前半段的抛物线

【实验思路】

获取系统的键盘按下响应消息事件,然后根据fDeltaTime时间来计算炮台的角度和发射