飞机大战是一款比较经典的小游戏,我们会分几篇文章来实现。
第一篇文章实现游戏界面的绘制、地图滚动、战机移动
第二篇文章实现战机发射子弹、敌机出现、爆炸效果、音效的添加
第三篇文章实现敌机发射子弹、产生boss、以及boss发射子弹
第四篇文章实现道具、血条、多种子弹
设定图标、游戏名、窗口宽度、高度
窗口宽度和高度应和背景图片的宽高一致(背景图512×768)
要设定图标,必须先引入资源文件
选中Sources 》右键选择 添加新文件
选择Qt 》Qt Resource File 点击Choose…
设定资源名称为res,点击下一步
点击完成
点击添加 》添加前缀
设定前缀为/
再点击添加 》 选择添加文件
把准备好的资源文件res拷贝到项目根目录下
点击进入res,ctrl + a选中所有资源
点击打开
点击左下角小锤子构建项目,出现如下错误
打开项目工程文件planeWar.pro
添加配置CONFIG += resources_big
设定窗口大小、图标、游戏名
资源文件的使用: : + 前缀 + 资源名称 + / + 图片名
运行结果
在实际开发中,类似于
这样的代码是不会出现在我们的项目中的,当我们需要修改游戏名字、图标时,还需要去修改源码,是非常不合理的。因此我们可以创建一个配置文件,里面放我们所有的字符串、常量,后期修改,直接修改配置文件。
创建配置文件
选中Sources 》右键选择 添加新文件
选择C++ 》C++ Header File ,点击Choose…
配置文件取名为Config 点击下一步
点击完成
在配置文件中添加游戏名、窗口宽度、游戏图标对应的宏常量
//游戏名
#define GAME_TITLE "飞机大战"
//窗口宽度
#define GAME_WIDTH 512
//窗口高度
#define GAME_HEIGHT 768
//游戏图标
#define GAME_ICON ":/res/game.ico"
在主窗口mainscene.cpp中引入config.h,使用配置文件中的宏常量来初始化主窗口
//设置游戏名字
setWindowTitle(GAME_TITLE);
//设定图标
setWindowIcon(QIcon(GAME_ICON));
//设定界面固定宽高
setFixedSize(GAME_WIDTH,GAME_HEIGHT);
在mainscene.h中添加新的成员函数initScene 用来初始化游戏场景
实现如下
选中Sources,右键添加新文件
选择C++ => C++ class,点击Choose…
取名为Map,点击下一步
点击完成
地图滚动实际上是两张图片同时向下移动,当两张图片移动到一定的位置再还原,在继续滚动,地图向下滚动,x坐标不变,y坐标改变,地图滚动有相应的速度与函数,定义如下:
在配置文件中添加地图图片及地图滚动速度
在构造函数中初始化成员变量,函数实现
在MainScene.h中,创建地图对象,并重写绘图事件
绘制地图,在paintEvent中创建画笔,并进行两张地图图片的绘制
绘制效果如图
要实现地图滚动,需要引入定时器,每隔10毫秒刷新页面,达到地图滚动的效果,并创建两个函数playGame和updatePosition,一个进行定时器的调用,一个进行地图、子弹、敌机等位置改变
在config中添加定时器刷新间隔
实现playGame、updatePosition函数,并调用qt自带的update函数来进行页面刷新,设定定时器间隔,并监听定时器,,每隔10毫秒进行页面刷新和函数调用,至此地图滚动已经实现
按照创建地图(Map)类的步骤进行战机(Hero)类的创建
战机也需要加载一张图片,战机移动需要有坐标,为了进行检测碰撞,为战机添加矩形边框
因为战机移动受上下左右键控制,因此位置改变函数需要传递xy坐标
在config.h中,设定战机图片及战机移动速度
进行变量初始化及函数实现
在MainScene.h中,创建战机对象,并重写键盘按下事件
在PainterEvent函数中,进行战机的绘制
通过按键对飞机进行控制,并调用飞机移动函数,通过对飞机坐标判断,进行越界控制
战机移动如图:
至此地图滚动、战机移动已全部实现