QT实现飞机大战

飞机大战

飞机大战是一款比较经典的小游戏,我们会分几篇文章来实现。
第一篇文章实现游戏界面的绘制、地图滚动、战机移动
第二篇文章实现战机发射子弹、敌机出现、爆炸效果、音效的添加
第三篇文章实现敌机发射子弹、产生boss、以及boss发射子弹
第四篇文章实现道具、血条、多种子弹

创建项目

  1. 点击菜单中的 文件 -> 新建文件或项目 或者 点击New Project
    QT实现飞机大战_第1张图片

  2. 模板选择 Application -> Qt Widget Application
    QT实现飞机大战_第2张图片

  3. 创建项目名称以及选中项目保存路径
    注:名称、路径必须不含中文QT实现飞机大战_第3张图片

  4. 工具选择Desktop Qt 5.9.0 MinGW 32bit
    QT实现飞机大战_第4张图片

  5. 基类选择 QWidget
    当前类我设置为游戏中的主场景-MainScene 去掉创建界面的选择,主场景上的图片都用代码实现QT实现飞机大战_第5张图片
    点击下一步,再点击完成,项目则创建完成
    QT实现飞机大战_第6张图片

主界面设定

设定图标、游戏名、窗口宽度、高度
窗口宽度和高度应和背景图片的宽高一致(背景图512×768)
要设定图标,必须先引入资源文件

资源文件引入

选中Sources 》右键选择 添加新文件
QT实现飞机大战_第7张图片
选择Qt 》Qt Resource File 点击Choose…
QT实现飞机大战_第8张图片
设定资源名称为res,点击下一步
QT实现飞机大战_第9张图片
点击完成
QT实现飞机大战_第10张图片
点击添加 》添加前缀
QT实现飞机大战_第11张图片
设定前缀为/
QT实现飞机大战_第12张图片
再点击添加 》 选择添加文件
QT实现飞机大战_第13张图片
把准备好的资源文件res拷贝到项目根目录下
QT实现飞机大战_第14张图片
点击进入res,ctrl + a选中所有资源
QT实现飞机大战_第15张图片
点击打开
QT实现飞机大战_第16张图片
点击左下角小锤子构建项目,出现如下错误
QT实现飞机大战_第17张图片
打开项目工程文件planeWar.pro
添加配置CONFIG += resources_big
QT实现飞机大战_第18张图片
设定窗口大小、图标、游戏名
资源文件的使用: : + 前缀 + 资源名称 + / + 图片名
QT实现飞机大战_第19张图片
运行结果
QT实现飞机大战_第20张图片
在实际开发中,类似于
QT实现飞机大战_第21张图片
这样的代码是不会出现在我们的项目中的,当我们需要修改游戏名字、图标时,还需要去修改源码,是非常不合理的。因此我们可以创建一个配置文件,里面放我们所有的字符串、常量,后期修改,直接修改配置文件。
创建配置文件
选中Sources 》右键选择 添加新文件
QT实现飞机大战_第22张图片
选择C++ 》C++ Header File ,点击Choose…
QT实现飞机大战_第23张图片
配置文件取名为Config 点击下一步
QT实现飞机大战_第24张图片
点击完成
QT实现飞机大战_第25张图片
在配置文件中添加游戏名、窗口宽度、游戏图标对应的宏常量
QT实现飞机大战_第26张图片

//游戏名
#define GAME_TITLE "飞机大战"
//窗口宽度
#define GAME_WIDTH 512
//窗口高度
#define GAME_HEIGHT 768
//游戏图标
#define GAME_ICON ":/res/game.ico"

在主窗口mainscene.cpp中引入config.h,使用配置文件中的宏常量来初始化主窗口
QT实现飞机大战_第27张图片

    //设置游戏名字
    setWindowTitle(GAME_TITLE);
    //设定图标
    setWindowIcon(QIcon(GAME_ICON));
    //设定界面固定宽高
    setFixedSize(GAME_WIDTH,GAME_HEIGHT);

运行效果
QT实现飞机大战_第28张图片

定义初始化函数

在mainscene.h中添加新的成员函数initScene 用来初始化游戏场景
QT实现飞机大战_第29张图片
实现如下
QT实现飞机大战_第30张图片

地图实现

创建地图类

选中Sources,右键添加新文件
QT实现飞机大战_第31张图片
选择C++ => C++ class,点击Choose…
QT实现飞机大战_第32张图片
取名为Map,点击下一步
QT实现飞机大战_第33张图片
点击完成
QT实现飞机大战_第34张图片

定义成员变量、函数

地图滚动实际上是两张图片同时向下移动,当两张图片移动到一定的位置再还原,在继续滚动,地图向下滚动,x坐标不变,y坐标改变,地图滚动有相应的速度与函数,定义如下:
QT实现飞机大战_第35张图片
在配置文件中添加地图图片及地图滚动速度
QT实现飞机大战_第36张图片
在构造函数中初始化成员变量,函数实现

QT实现飞机大战_第37张图片
QT实现飞机大战_第38张图片
在MainScene.h中,创建地图对象,并重写绘图事件
QT实现飞机大战_第39张图片
绘制地图,在paintEvent中创建画笔,并进行两张地图图片的绘制
QT实现飞机大战_第40张图片
绘制效果如图
QT实现飞机大战_第41张图片

定时器添加

要实现地图滚动,需要引入定时器,每隔10毫秒刷新页面,达到地图滚动的效果,并创建两个函数playGame和updatePosition,一个进行定时器的调用,一个进行地图、子弹、敌机等位置改变
QT实现飞机大战_第42张图片
在config中添加定时器刷新间隔
QT实现飞机大战_第43张图片
实现playGame、updatePosition函数,并调用qt自带的update函数来进行页面刷新,设定定时器间隔,并监听定时器,,每隔10毫秒进行页面刷新和函数调用,至此地图滚动已经实现
QT实现飞机大战_第44张图片
按照创建地图(Map)类的步骤进行战机(Hero)类的创建
战机也需要加载一张图片,战机移动需要有坐标,为了进行检测碰撞,为战机添加矩形边框
因为战机移动受上下左右键控制,因此位置改变函数需要传递xy坐标
QT实现飞机大战_第45张图片
在config.h中,设定战机图片及战机移动速度
QT实现飞机大战_第46张图片

进行变量初始化及函数实现
QT实现飞机大战_第47张图片
在MainScene.h中,创建战机对象,并重写键盘按下事件
QT实现飞机大战_第48张图片
在PainterEvent函数中,进行战机的绘制
QT实现飞机大战_第49张图片
通过按键对飞机进行控制,并调用飞机移动函数,通过对飞机坐标判断,进行越界控制
QT实现飞机大战_第50张图片
战机移动如图:
QT实现飞机大战_第51张图片
至此地图滚动、战机移动已全部实现

你可能感兴趣的:(C++,qt,开发语言,c++)