没有合适的资源?快使用搜索试试~ 我知道了~
funcodec++课程设计_坦克大战.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 98 浏览量
2023-04-25
18:41:03
上传
评论
收藏 406KB PDF 举报
温馨提示
试读
23页
funcodec++课程设计_坦克大战.pdf
资源推荐
资源详情
资源评论
课程设计一 坦克大战
一、游戏介绍
相信大部分同学都玩过或看过“坦克大战”这款经典游戏。现在, 就由我们自己动手来
开发它。只要大家具备了
C++
语言和面向对象的基础知识,然后按照实验指南的指导一步一
步进行下去,相信我们每个同学都能把这款经典游戏做出来。
、实验目标
综合运用
C++
及其面向对象的知识开发一款小游戏。
三、实验内容
在一个战场上, 玩家控制坦克, 消灭敌方坦克,并防止敌方坦克摧毁我方基地。游戏
的 具体要求如下:
1
、游戏有一个初始页面,如下图。
2
、按下任意键开始游戏,玩家控制坦克在战场上穿梭,碰到墙时,不能通过。
3
、敌方坦克自由移动,每隔
2
秒改变一个方向,每隔
3
秒发射一发子弹。
4
、敌方坦克每隔
5
秒出现一辆,从屏幕上方的左、中、右三个位置依次出现。
5
、当玩家被消灭或者我方基地被摧毁或者游戏时间大于
30
秒的时候,游戏结束。
游戏开始前
进入游戏
四、游戏的整体框架
五、
实验指南
实验准备
打开
FunCode
,创建一个新的
C++
项目。注意:项目名称必须为英文和数字,且不能有
空格。
点击“项目”→“导入地图模板” ,从对话框中选取名称为
TankWar
的模板导入。导入
成功后,界面如下:
实验一 游戏开始
【实验内容】
1
、设置游戏标题
2
、按空格键
,
提示图片消失
,
游戏进入开始状态
.
【实验运行结果】
游戏开始前
按下空格键后
【实验思路】
按下空格键是键盘按下事件
,
可在
CSystem::OnKeyDown
函数中编写响应代码。 为了保证
程序结构的清晰、 一致, 更好的办法是在
CGameMain
类中添加一个相应的键盘按下事件处理
函数,然后在
CSystem::OnMouseClick
函数中进行调用。
g_GameMain
是
CGameMain
类的对象,它是全局变量,在程序运行时最先被创建。
【实验指导】
1
、
C++
程序的执行入口是主函数。
FunCode
的主函数名称叫
WinMain
,写在文件中。
CSystem::SetWindowTitle
是设置程序运行窗口标题的函数,修改如下:
CSystem::SetWindowTitle(" 坦克大战 ");
2
、参考
CSystem::OnKeyDown
函数,为
CGameMain
类创建一个
OnKeyDown
函数。
CGameMain
类的头文件是文件,实现代码写在文件中。因此,先在文件对函数进行 声
明。函数的返回值和参数列表都与
CSystem::OnKeyDown
函数保持一致。访问权 限应
该是
public
。代码如下:
void OnKeyDown( const int iKey, const bool bAltPress, const bool
bShiftPress, const bool bCtrlPress );
3
、接着,在文件中对该函数进行定义:
void CGameMain::OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const
bool bCtrlPress )
{
}
4
、在
CSystem::OnKeyDown
函数(文件中)调用
CGameMain::OnKeyDown
函数,并将自
己的参数传递给该函数。
g_GameMain
是是
CGameMain
类的对象, 它是全局变量,
在 程序运行时最先被创建。因此,我们可以用
g_GameMain
调用自己的成员函数
OnKeyDown
。
(iKey, bAltPress, bShiftPress, bCtrlPress);
5
、
FunCode
程 序 运 行 时 , 当 发 生 键 盘 按 下 事 件 , 程 序 首 先 调 用 并
执 行
CSystem::OnKeyDown
函 数 , 然 后 由
CSystem::OnKeyDown
函 数 调 用
并 执 行
CGameMain::OnKeyDown
函 数 。 因 此 , 键 盘 按 下 事 件 的 响 应
代 码 我 们 在
CGameMain::OnKeyDown
函数中编写即可。
6
、我们要处理的两个精灵如下图,它们的名称分别是
splash
和
start
。我们需要创建
两个
CSprite
类对象与这两个精灵绑定。
7
、在
CGameMain
类中声明两个
CSprite*
类型,根据面向对象的封装性原理,成员变量
的访问权限应该是
private
。代码应该写在哪个文件,请参看前面的实验步骤。
CSprite*
m_pSplash;
CSprite* m_pStart;
在
CGameMain
类的构造函数中, 对上面两个指针变量进行初始化。 通过调用
CSprite
的构造函数,将精灵和精力对象绑定在一起。
m_pSplash= new CSprite("splash");
m_pStart= new CSprite("start");
8
、最后,我们在
CGameMain::OnKeyDown
函数中处理空格键按下事件。
if( 0 ==GetGameState() )
{
if(iKey ==KEY_SPACE)
{
miGameState = 1;
}
}
KEY_SPACE
是枚举变量
KeyCodes
的成员,表示空格键。
KeyCodes
定义在文件中。
该枚举变量定义了全部的键盘值。注意: 必须将
m_iGameState
的值改为
1
。 当
GameMainLoop
函数再次执行时, 根据
m_iGameState
的值调用并执行
GameInit
函
数, 游戏进入开始状态。
进入游戏开始状态时,调用
CSprite
类的
SetSpriteVisible
函数将精灵图片设置 为不可
见。
在
GameInit
函数中添加代码:
m_pSplash->SetSpriteVisible(false); m_pStart->SetSpriteVisible(false);
9
、程序执行完
CGameMain::GameInit
函数后,执行
CGameMain:: SetGameState(2)
, 将
m_iGameState
的值改为
2
,游戏进入运行状态。
10
、在
CGameMain
类的析构函数中
delete
本实验创建的指针对象, 以释放分配的内存。
CGameMain::~CGameMain()
{
delete m_pSplash;
delete m_pStart;
}
11
、编译并运行程序,然后按下空格键,看看运行效果。
实验二 坦克运动
【实验内容】
1
、创建坦克类
CTankPlayer
;
2
、游戏开始时,将坦克放置于
(0,0)
的坐标上;
3
、通过按键
WSAD
控制坦克上下左右运动;
4
、坦克运行到黑色区域边界时不能继续前进。
实验运行结果】
在区域内运动
运动到区域边界
【实验思路】 坦克也是精灵, 但是它具备一些自己独特的功能, 比如通过键盘控制运动、 开
炮等。因 此我们可以创建一个新的类
CTankPlayer
类,并让它继承
CSprite
类。
通过
WASD
键,控制坦克做相应的的上左下右运动。按下某个键,给坦克设置相应方向
的运动速度;松开时,将该方向的速度设为
0
,表示停止运动。
屏幕上最内部的黑色区域为玩家坦克的活动区域,左上角坐标为
(-26,-22)
,右下角坐 标为
(26,22)
。当坦克运动到该区域边界时,坦克不能继续前进。
【实验指导】
1
、通过类向导创建
CTankPlayer
类,其继承于
CSprite
类。以
VC++
为例: 第一步、点
击菜单“插入”
-
〉“新建类”。
第二步、在“
New Class
”对话框中输入类名和父类名。
第三步、点击“
Change
”按钮,在新对话框中修改
CTankPlayer
类的头文件和
cpp
文
件的路径。将头文件保存到项目文件夹的
\SourceCode\Header
文件夹中,将
cpp
文件保 存到
项目文件夹下的
\SourceCode\Src
文件夹中。
这里需要特别注意的是创建文件路径的问题,所有的
.h
头文件应该在项目文件夹
\SourceCode\Header
中 , 所 有 的
.cpp
源 文 件 应 该 放 在 项 目 文 件 夹 下
的
\SourceCode\Src
文件夹中。
2
、为
CTankPlayer
类添加
m_iDir,m_fSpeedX,m_fSpeedY
,
m_iHp
四个成员变量(成员 变
量。用来表示坦克在
X
轴和
Y
轴方向上的速度以及运行的方向,并且在构造函数中
初始化为
0
。这里规定,
m_iDir
的值为
0
、
1
、
2
、
3
,分别表示上、右、下、左。 成
员函数的声明和定义如何添加,访问权限是什么,可参考实验一,下文不再继续 提
示),分别表示运动方向、
X
轴、
Y
轴速度以及血量值。 本文档的命名采用匈牙利
命名法,
m_
表示类成员变量,
i
表示整型,
f
表示
float
型,
sz
表示字符指针,
g_
表示全局变量等。
同时需要在
public
权限下定义获取和设置这些变量的
Get
和
Set
方法:
//set 方法
void SetHp(int hp)
void SetDir(int dir)
{m_iHp = hp;}
{m_iDir = dir;}
void SetSpeedX(float speedX)
void SetSpeedY(float speedY)
//get 方法
int GetHp() {return m_iHp;}
int GetDir()
float GetSpeedX()
{ return m_iDir;}
{ return m_fSpeedX;}
{ m_fSpeedX = speedX;}
{ m_fSpeedY = speedY;}
float GetSpeedY() {return m_fSpeedY;}
3
、
CTankPlayer
的父类是
CSprite
类(具体声明查看) ,构造函数为
CSprite( const char
*szName )
。
4
、所以通过上边方法自动生成的类, 如果系统自动生成构造函数
CTankPlayer(void)
, 删
除掉它以及在中自动生成的对构造函数实现的代码:
CTankPlayer::CTankPlayer(void)
{
}
再为
CTankPlayer
类添加新的构造函数:
CTankPlayer(const char* szName)
。
CTankPlayer::CTankPlayer(const char* szName):CSprite(szName) //
行实现
{
对构造函数进
m iDir=0; m_fSpeedX=; m_fSpeedY=;
m_iHp=2;
}
子类对象创建时,要先调用父类的构造函数完成父类部分的构造。如果父类没有默 认
构造函数,子类的构造函数必须显示调用父类的构造函数。
CTankPlayer
构造函 数调
用
CSprite
类构造函数, 并将参数
szName
的值传递给它, 从而将名称为
szName
的
精灵图片与
CTankPlayer
对象绑定起来。
5
、为
CTankPlayer
类添加
Init
函数,该函数主要用来完成该类的初始化工作。这里, 先调
用
setHp
方法设置血量。 然后调用父类的
SetSpritePosition
函数将坦克精灵 设置在屏
幕中央
(0,0)
处。接下来给坦克精灵设置时间边界的大小,与世界边界的 碰撞模式为
WORLD_LIMIT_NUL
,
L
表示精灵与世界边界碰撞的响应由代码完成, 同时
设置坦克碰撞模式为发送碰撞和接收碰撞。
void CTankPlayer::Init()
{
SetHp(2);
SetSpritePosition,; SetSpriteWorldLimit(WORLD_LIMIT_NULL, -26, -22, 26, 22);
SetSpriteCollisionActive(1,1);//
设置为可以接受和发生碰撞
SetSpriteVisible(true);
6、
在
CGameMain
类中增加一个私有成员变量
m_pTankplayer
,类型为
CTankPlayer*
。
注意在添加头文件:
#include""
7
、按下空格键后,程序会调用键盘按下事件响应函数,将
m_iGameState
的值改为
1
,
游戏进入开始状态(见实验一) 。程序再次执行
CGameMain::GameMainLoop
函数
时, 根据
m_iGameState
的值调用并执行
CGameMain::GameInit
函数。因此,可以在
该 函数中创建我方坦克, 并调用
CTankPlayer::Init
函数来完成该类对象的初始化工
}
剩余22页未读,继续阅读
资源评论
hhappy0123456789
- 粉丝: 62
- 资源: 5万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功