当前位置:网站首页>基于QTGUI图像界面的空战游戏设计
基于QTGUI图像界面的空战游戏设计
2022-07-28 17:46:00 【biyezuopinvip】
基于图形界面的空战游戏
设计内容设计一个基于图形界面的空战游戏,使用 qt 的 GUI 框架下图为最终的游戏过程截图

设计目标(功能介绍)
加载界面
- 主窗口可伸缩
- 提供菜单界面
- 背景音乐(可切换)
- 游戏指南介绍游戏
- 显示我方血量、蓝量、分数
- 可移动我方飞机
- 自动打出子弹
- 按空格发动技能并消耗蓝
- 多种敌人类型
- 击杀特殊敌人掉落补给
- 可暂停游戏
- 暂停后弹出选项:可返回菜单、查看指南或继续游戏
- 子弹打中或飞机碰撞造成受到伤害
- 血量为 0 的物体将消失
- 我方血量为 0 游戏自动结束
- 游戏结束后弹出选项:重新游戏、查看指南、返回菜单
设计思路
类的设计
视角类 MyView
功能:容纳场景的窗口,在该类中重定义 resizeEvent 事件处理函数可以完成窗口和场景的自适应伸缩
成员数据:无
成员函数:resizeEvent
实例化:main 中实例化为 view
场景类 Scene
功能:提供图形化界面,一切视觉与玩家交互的控件都在场景类中进行控制。场景类也是和玩家交互的顶层接口,玩家发出的信号、或者触发的事件,都在场景类中进行第一层处理
成员数据:文本显示、按钮显示、遮罩面板、飞机状态显示、图像路径、媒体音乐播放器、菜单显示、物体显示
成员函数:构造函数、按钮信号的槽函数、事件触发后的处理重载函数
实例化:Scene.cpp: Scene* MyScene;main 中申请空间
游戏运行类 ProcessGame
功能:控制游戏的逻辑,对游戏的物体对象进行管理、控制游戏的运行状态、与场景类进行交互(即场景类的需求通过游戏运行类来逻辑实现,游戏运行类逻辑实现的结果通过场景类来进行体现)、按键响应
成员数据:移动键按钮状态(以处理移动按键响应)、定时器(控制物体运动)、分数、游戏阶段(是否暂停、是否处于菜单界面)
成员函数:构造函数、定时器的删除和设置函数、清除游戏现场函数、 Scene 中按钮信号处理的槽函数的逻辑实现(图形界面的接口)、Scene 事件响
应函数的逻辑实现(图形界面的接口)、玩家飞机状态更新函数
实例化:ProcessGame.cpp: ProcessGame game;
物体类 Object
功能:作为游戏中物体的顶层抽象,可以标记物体的类型和碰撞状态
成员数据:type:包括玩家飞机、玩家子弹、普通敌人、红色敌人、蓝色敌人、普通敌人子弹、红色敌人子弹、红色补给、蓝色补给
成员函数:构造函数、通过类型和图像路径初始化 object
实例化:在需要的位置实例化其派生类
飞机类 Plane
功能:由 object 派生,处理飞机的碰撞和移动、记录飞机状态
成员数据:生命值和蓝量
成员函数:处理碰撞和处理移动的函数
实例化:在需要的位置实例化其派生类
子弹类 Bullet
功能:由 object 派生,处理子弹产生和移动
成员数据:子弹的方向、子弹的杀伤力
成员函数:子弹发射函数、子弹整体更新位置函数、某个子弹移动函数
实例化:在静态成员函数子弹发射中实例化具体对象
补给类 Medicine
功能:由 object 派生,代表物体为补给
成员数据:继承 object 的 type 标记补给的类型
成员函数:通过补给类型和图像进行构造
实例化:在掉落补给的位置实例化具体对象
我方飞机类 MyPlane
功能:由 Plane 派生,处理我方飞机的移动按键响应、射击模式
成员数据:长宽(防止我方飞机出界),射击模式、移动趋势、伤害
成员函数:是否静止、设置移动趋势的函数
实例化:MyPlane.cpp: MyPlane* mycraft,游戏开始的时候申请空间,返回菜单释放空间
敌方飞机类 EnemyPlane
功能:由 Plane 派生,处理敌方飞机的整体位置更新、具体飞机的移动、和射击
成员数据:继承 object 的类型判断其是哪种敌方飞机
成员函数:射击函数、整体位置更新函数、刷新产生函数、单个飞机移动函数
实例化:在飞机刷新定时器事件中创建具体的对象
Config.h 配置了一些宏
类层次的关系
层次关系如下图

逻辑流程
在 main.c 中初始化视角和场景类,然后应用进行循环 exec 状态(等待事件)
刚开始只有按钮和键盘事件会被响应,通过按下按钮或键盘触发 Scene 中的事件响应函数或者槽函数Scene 接收到信号或事件后将要处理的事情丢给 ProcessGame 类来处理在 ProcessGame 中通过具体的信号来处理内部的数据,Object 和被派生出的飞机、子弹、补给、键盘响应、定时器响应都是在此类中处理课程设计一和二的关联和改善主要的逻辑控制都按照设计一的思路,除了把顶层加了 ui 以外,内部也有一些改进比如数据结构的改进(STL 的掌握):子弹、敌方飞机从数组管理改成 vector 管理流程上沿用:菜单 <-> 游戏的结构
比如利用 qt 的定时器库让物体运动机制更完善,在设计一中提到,基于冷却的原理,即一个功能使用后再被申请使用的时候,只记录下申请,等待冷却结束再满足申请,在二中通过了解 qt 定时器的使用知道了这是基于定时器的物体运动机制类的层次更加鲜明(继承的运用):把许多物体抽象成 Object,统一的管理增加了许多新的功能:例如音乐、例如技能、例如血槽、例如补给、例如多种敌人程序的操作方法
刚进入游戏看到加载界面

然后看到游戏窗口

听到背景音乐,可以按 R 键切换
点游戏指南查看游戏的介绍信息


点开始游戏进行游戏

随时按回车键暂停

按上下左右移动,空格发技能
右下角查看当前状态

绿色敌人速度慢、单子弹攻击,伤害弱、防御弱

红色敌人速度慢、多子弹攻击,伤害强、防御强

蓝色敌人速度快、撞击攻击,伤害强、防御一般
击杀红色敌人掉落红色补给,补充血量

击杀蓝色敌人掉落蓝色补给,补充蓝量

玩家死亡后弹出选项和分数

边栏推荐
- Ardupilot software in the loop simulation and online debugging
- 德国、葡萄牙均宣布不会禁用华为5G设备,但德国会设定严格限制条件!
- BeanFactory not initialized or already closed - call ‘refresh‘ before accessing beans via the Applic
- 使用SaltStack自动化部署Zabbix
- adb remount of the / superblock failed: Permission denied
- SaltStack进阶
- How to use Qianqian listening sound effect plug-in (fierce Classic)
- 微信公众号授权登录后报redirect_uri参数错误的问题
- IMU 加热
- 智能合约安全——溢出漏洞
猜你喜欢
随机推荐
Method of win7 system anti ARP attack
测试开发备忘
芯片功耗性能验证:从困境到超越
China's first chip stamp released: built-in 120um ultra-thin NFC chip
使用SaltStack自动化部署Zabbix
Force buckle 1331. Array serial number conversion
JS 批量添加事件监听onclick this 事件委托 target currentTarget onmouseenter onmouseover
lua语言的左对齐函数(手写)
Swing事件处理的过程是怎样的?
Rust Getting Started Guide (crite Management)
ardupilot软件在环仿真与在线调试
Fantasy 5 (ue5) game engine complete course 2022
ES6 new - arrow function
助力面板行业创新,FPGA将成屏厂TCON最佳选择?
Transformer for anomaly detection - instra "painting transformer for anomaly detection"
MySQL8 Encrypting InnoDB Tablespaces
Scrapy Spider源码分析
德国、葡萄牙均宣布不会禁用华为5G设备,但德国会设定严格限制条件!
为什么在telnet登入界面下没有日志输出?
Jestson nano Object detection









