零、说在前面
最近做了个qt/c++的小项目飞机大战,主要是边玩边做,主要讲解一下设计思路,各个模块的实现原理,非常适合初学者拿来练手。需要源码、素材、项目详解、打包软件等整个项目用到的全部内容,可以加我wx公众号:酷玩软件乐园,后台回复:飞机大战,即可获取全部资源。话不多说一起来看看吧。
一、项目目录
1 项目简介
2 创建项目
3 设置主场景
4 资源导入
5 地图滚动
6 英雄飞机
7 子弹制作
8 玩家发射子弹
9 敌机制作
10 碰撞检测
11 爆炸效果
12 音效添加
13 打包发布
二、项目讲解
1 项目简介
飞机大战是我们都比较熟悉的小游戏,想必大家都有玩过,那你有没有想过去自己制作一个飞机大战的小项目呢,玩自己做的游戏会不会别有一番风味呢。下面就给大家讲解一下飞机大战的实现原理,只要照着教程做,每个人都可以是飞机大战的开发者。
首先来看一下效果图
玩家控制一架小飞机,然后自动发射子弹,如果子弹打到了飞下来的敌机,则射杀敌机,并且有爆炸的特效
2 创建项目
window端推荐用vs开发,下载qt插件开发qt项目,具体请直接百度一下,这里不再详解
linux只能用qt进行开发了,为了统一,这里直接使用qt开发,qt版本qt5,qt creator 4.0及以上
打开Qt Creator按照向导创建项目,基类选择 QWidget
3 设置主场景
创建新的头文件为 config.h 主要记录程序中所有的配置数据,方便后期修改
添加窗口宽度、高度的配置信息,依据背景图大小进行设置
/********** 游戏配置数据 **********/
#define GAME_WIDTH 512 //宽度
#define GAME_HEIGHT 768 //高度
#define GAME_TITLE "飞机大战 v1.0" //标题
在mainScene.h中定义initScene函数, 用来初始化游戏场景在mainScene.cpp中实现如下代码
void MainScene::initScene()
{
//初始化窗口大小
setFixedSize(GAME_WIDTH,GAME_HEIGHT);
//设置窗口标题
setWindowTitle(GAME_TITLE);
}
4 资源导入
生成qrc文件,生成res文件夹,生成res.qrc文件,将准备好的资源全部粘贴进res文件夹下,最后将res中的资源全部导进res.qrc中
qrc生成 rcc二进制文件
先配置好rcc.exe的文件路径:在系统环境变量中添加qt中rcc.exe的文件路径。
然后利用cmd打开终端,定位到res.qrc的目录下,输入命令
rcc -binary .\res.qrc -o plane.rcc
最后将生成好的rcc文件,放入到debug/release同级目录中一份
注册二进制文件
在config.h中追加配置数据
#define GAME_RES_PATH "./plane.rcc" //rcc文件路径
在main.cpp中修改代码
#include “mainscene.h”
#include
#include
#include “config.h”
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//注册外部的二进制资源文件
QResource::registerResource(GAME_RES_PATH);
MainScene w;
w.show();
return a.exec();
}
5 地图滚动
添加map.h和map.cpp文件
在map.cpp中实现成员函数
#include "map.h"
#include "config.h"
Map::Map()
{
//初始化加载地图对象
m_map1.load(MAP_PATH);
m_map2.load(MAP_PATH);
//设置地图其实y轴坐标
m_map1_posY = -GAME_HEIGHT;
m_map2_posY = 0;
//设置地图滚动速度
m_scroll_speed = MAP_SCROLL_SPEED;
}
void Map::mapPosition()
{
//处理第一张图片滚动
m_map1_posY += MAP_SCROLL_SPEED;
if(m_map1_posY >= 0)
{
m_map1_posY =-GAME_HEIGHT;
}
//处理第二张图片滚动
m_map2_posY += MAP_SCROLL_SPEED;
if(m_map2_posY >= GAME_HEIGHT )
{
m_map2_posY =0;
}
}
在MainScene.cpp中实现成员函数
void MainScene::playGame()
{
//启动定时器
m_Timer.start();
//监听定时器
connect(&m_Timer,&QTimer::timeout,[=](){
//更新游戏中元素的坐标
updatePosition();
//重新绘制图片
update();
}