本文较长,建议收藏,可以观看本文配套视频教程【C++干大事系列之游戏篇:Qt飞机大战】
飞机大战是我们大家所熟知的一款小游戏,本教程就是教大家如何制作一款自己的飞机大战。
首先我们看一下效果图
玩家控制一架小飞机,然后自动发射子弹,如果子弹打到了飞下来的敌机,则射杀敌机,并且有爆炸的特效。接下来再说明一下案例的需求,也就是我们需要实现的内容。
·滚动的背景地图
·飞机的制作和控制
·子弹的制作和射击
·敌机的制作
·碰撞检测
·爆炸效果
·音效添加
创建项目步骤如下:
·打开Qt
·跟着向导创建项目
基类选择 QWidget空窗口
第一个场景为主场景 MainScene
不带UI界面
2.1 打开Qt
找到你安装的Qt Creator,打开它。
如果安装时,没有选择在桌面上建立快捷方式,那么你的Qt软件位置如下
C:\qt\Qt5.x.x\Tools\QtCreator\bin
在这个路径下找到 qtcreator.exe 双击打开即可
2.2 按照向导创建项目
2.2.1 新建项目
点击菜单 中的文件 -> 新建文件或项目 或者 在首页面中点击New Project
2.2.2 选择模板
模板选择 Application -> Qt Widget Application
2.2.3 项目名称和位置
给项目起个名称以及选中项目要保存的地方
这一步选择后在Kits 构建套件中直接点击下一步即可
2.2.4 类信息
基类选择 QWidget
类名也就是我们第一个窗口场景的名称,这里我起名为 MainScene 代表游戏中的主场景
取消创建界面中的内容
2.2.5 完成创建
在汇总页面中点击完成,我们就迈开了项目的第一步!
主场景设置的步骤如下:
·添加配置文件,保存游戏中所有配置数据
·初始化主场景窗口大小、标题
3.1 配置文件添加
创建新的头文件为 config.h 主要记录程序中所有的配置数据,方便后期修改
添加窗口宽度、高度的配置信息,依据背景图大小进行设置
/********** 游戏配置数据 **********/
define GAME_WIDTH 512 //宽度
define GAME_HEIGHT 768 //高度
define GAME_TITLE "飞机大战 v1.0" //标题
3.2 主场景基本设置
在mainScene.h中添加新的成员函数initScene 用来初始化游戏场景
void initScene();
在mainScene.cpp中实现如下代码
void MainScene::initScene()
{
//初始化窗口大小
setFixedSize(GAMEWIDTH,GAMEHEIGHT);//设置窗口标题
setWindowTitle(GAME_TITLE);
}
在构造函数MainScene中调用该函数 initScene
MainScene::MainScene(QWidget *parent)
: QWidget(parent)
{
//初始化场景
initScene();
}
测试运行效果如图:
在主场景中其实还有一个配置项没有实现,也就是窗口左上角的那个图标资源。那么接下来我们将游戏中的资源进行导入并且设置游戏图标。
资源导入步骤
·生成qrc文件
·项目同级目录下创建res文件夹并将资源粘贴过来
·编辑qrc,加入前缀和文件
·利用qrc生成二进制文件 rcc
·rcc文件放入到debug同级目录下
·注册二进制文件
·添加图标资源
4.1 qrc文件生成
右键项目,点击添加新文件
选择Qt -> Qt Resource File
资源文件起名 如:res
生成res.qrc文件
4.2 创建res文件夹
项目的同级目录下创建文件夹res,并将准备好的资源粘贴进去
4.3 编辑qrc文件
右键qrc文件,选中Open in Editor
添加前缀为 '' \ ''
添加文件 将res下所有文件选中即可
4.4 qrc生成 rcc二进制文件
由于资源过大,会提示错误:
这个错误也就是“编译器的堆空间不足”。
由于资源文件qrc过大,超出分配的内存范围
因此我们需要利用二进制资源,而生成二进制资源就需要我们刚刚的qrc文件
利用cmd打开终端,定位到res.qrc的目录下,输入命令
rcc -binary .\res.qrc -o plane.rcc
4.5 复制rcc文件
将生成好的rcc文件,放入到debug同级目录中一份
4.6 注册二进制文件
在config.h中追加配置数据
#define GAMERESPATH "./plane.rcc" //rcc文件路径
在main.cpp中修改代码
#include "mainscene.h"
#include
#include
#include "config.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);