程序设计实训2024大作业:带有元素反应系统的2D横板动作游戏
巫师姐妹中的姐姐在幼年时神秘失踪,仿佛被森林的雾气吞噬,徒留无尽的谜团和思念。
妹妹自幼便承受着失去姐姐的痛苦,将全部心血投入巫术修炼,誓言要找到姐姐的下落。她甚至远赴星系,向一位强大的绝地武士学习光剑技艺,希望借助多重力量解开失踪之谜。
一日,妹妹在古老卷轴中发现了一则传说:森林深处藏有一件宝物,能找到世界上任何一个人的位置。
她踏上征程。
森林中弥漫着神秘的低语,隐秘的咒语回荡在耳边。随着她一步步深入,光线渐暗,寒气逼近。妹妹握紧了手中的光剑和法杖。
一个与她一模一样的怪物悄然出现,仿佛早已在此等待……
图片 | 说明 |
---|---|
无装备 | |
初始套装 | |
受击 | |
着火 | |
冰冻 | |
触电 |
图片 | 说明 |
---|---|
普通帽子 | |
火抗帽子 | |
冰抗帽子 | |
电抗帽子 | |
普通巫师袍 | |
火抗巫师袍 | |
冰抗巫师袍 | |
电抗巫师袍 | |
普通鞋子 | |
火抗鞋子 | |
冰抗鞋子 | |
电抗鞋子 |
图片 | 说明 | 图片 | 说明 |
---|---|---|---|
初级法杖_木质 | 初级法杖_金属质 | ||
连击法杖_木质 | 连击法杖_金属质 | ||
群攻法杖_木质 | 群攻法杖_金属质 | ||
能量球_普通 | |||
能量球_火 | |||
能量球_冰 | |||
能量球_电 |
图片 | 说明 |
---|---|
地块_岩石 | |
地块_木质 | |
地块_金属 |
注:以上大多数图片为本人制作
本项目使用 Qt Creator
构建,
开发环境为:
Win11
Qt Creator 13.0.2
Qt 6.8.0
编译运行:
1. 在 Qt Creator 中选择 CMakeLists 打开项目
2. 选择 Qt 6.8.0 MinGW 64-bit 或其他构建套件进行配置
3. 点击编译运行
运行:
双击 bin 目录下的 qt_programming_2024.exe 即可
注:如遇窗口显示不全的情况,将电脑显示设置中的缩放改为100%,再重启程序即可
按键A
:向左移动
按键D
:向右移动
按键W
:跳跃
按键J
:拾取
按键K
:近战武器攻击 / 切换箭矢
按键L
:远程武器攻击 / 扔出近战武器
按键I
:切换武器
按键Left
:向左移动
按键Right
:向右移动
按键Up
:跳跃
按键Comma
:拾取
按键Period
:近战武器攻击 / 切换箭矢
按键Slash
:远程武器攻击 / 扔出近战武器
按键Shift
:切换武器
按键Return
:打开作弊码输入框
按键BracketLeft/Right
:开关显示Item包裹框和中心点
关闭开场动画
:在 MyGame.cpp
中注释掉 #define STARTSCENE
关闭物品掉落
:在 BattleScene.cpp
中注释掉 #define DROPEQUIPMENT
和 #define DROPARROW
-
充分使用面向对象编程的思想,对不同模块进行抽象与封装。充分利用继承性与多态性,处理各子类的共性与差异。
-
利用状态模式(State Pattern)实现玩家不同元素与行为之间的状态切换
-
利用状态模式实现木质物品和金属物品的状态切换
-
利用信号-槽机制实现了页面切换等控制
-
利用状态模式控制对战AI的行为模式
MyGame
继承自 QMainWindow
,是游戏主页面
Scene
继承自 QGraphicsScene
,是游戏战斗主页面。
在其子类 BattleScene
中,处理场景内各 Item
的交互。
PvEBattleScene
为 BattleScene
子类,将场景中的玩家2替换为AI玩家。
StartScene
继承自 QGraphicsScene
,是游戏开始菜单页面。
GameOverScene
继承自 QGraphicsScene
,是游戏结束页面。
Item
继承自 QGraphicsItem
,主要处理物品的显示、位置与移动
游戏场景中各物品均为 Item
的子类,如下图所示
而某一元素某一材质的物品又为其大类的子类,下图以单手剑类为例(省略金属质子类)
CItemFactory
为 Item
工厂,处理各种物品的生成
IState
及其13个子类(下图中12个+1死亡状态)为玩家状态类,继承自 QObject
,处理玩家的元素与行为状态。
IHero
提供控制玩家状态与动画的接口
设计如下图所示:
状态切换如下图所示:
Character
为玩家类,处理玩家的相关操作,与其他类的关系如下图所示
IWood
和 IMetal
提供控制木质与金属质物品状态与动画的接口
状态切换如下图所示:
CAIPlayer
为对战AI类,结合 IAIState
及其子类,对AI进行行为模式的控制
状态切换如下图所示:
程序初始进入 StartScene
界面
选择 PvP
进入 BattleScene
界面,
选择 PvE
进入 PvEBattleScene
界面
在 BattleScene
中,程序主要依靠 90FPS 的 BattleScene::update()
推动运行,
每次 update
中,处理以下流程:
- 用户输入
- 移动
- 拾取
- 射击
- 攻击,火/电传导
- Fps
- 生命值进度条显示更新、判断
PvEBattleScene::update()
中,除了处理以上流程,额外增加
- AI行动
- 人物左右移动
- 人物跳跃,能够跳到更高的平台上
- 实现重力加速度
- 两个玩家同屏对战
- 不同高度的平台
- 不同材质的平台:岩石、木质、金属
- 每个玩家各有100点生命值,在上方血条显示
- 受到伤害会减少生命值。一方生命值
$\leq 0$ 时,进入死亡状态;5秒后跳转到游戏结算界面
-
物品从空中随机出现,按照重力规律下落
注:物品未被拾取,10秒后会消失
- 玩家可捡起附近物品。武器装备,消耗品生效
- 按下回车可调出作弊码窗口,使用作弊码生成指定物品,具体对应如下
E - Electro, F - Flame, I - Ice 1 - Wooden, 2 - Metal S - Spear, 1 - OneHandedSword, 2 - TwoHandedSword B - PrimaryBow, 3 - ComboBow, 4 - AOEBow A - Armor, L - Leg Shoes, H - Head Hat
- 能渲染玩家装备的武器,有攻击动画
- 可进行攻击
- 近战武器有多种类型:单手剑、双手剑、矛(光剑)
- 近战武器有两种材质:木质、金属质(见1.2.3)
- 可投掷近战武器,受重力作用,接触人或平台触发攻击并消失
- 同时拥有近战武器和弓(法杖)时,玩家可切换武器
- 空中会掉落不同元素类型的箭(能量球),拾取可增加弹容量。可在不同类型的能量球间切换,可以射出,受重力作用。
-
支持三种类型不同的法杖
1. 初级法杖:射程近,发射1个能量球 2. 连击法杖:射程远,发射3个能量球,水平速度各不相同 3. 群攻法杖:射程远,发射3个能量球,初速度方向不同 注:发射多个能量球时,优先当前选择元素,若不够,则由其他元素补充;如果玩家持有能量球不够,则将已有能量球全部发射
-
法杖有两种材质:木质、金属质(见1.2.4)
-
能够渲染飞行中的箭和投掷武器
-
有火属性的箭和近战武器,被这些武器攻击后进入着火状态。
人物的着火状态持续10秒,每2秒受到1点伤害。 如果着火状态时受到冰属性攻击,则回到正常状态。
- 玩家在着火物体附近会持续受到伤害,每2秒受到1点伤害,离开着火物体后3秒恢复
- 木质物品着火后10秒燃尽消失
- 着火效果能够有一定延时地传播
- 显示燃烧效果
- 有冰属性的箭和近战武器,被这些武器攻击后进入冰冻状态
- 玩家在冰冻状态下不能进行任何操作,5秒后解除冰冻状态
- 在冰冻状态下受到攻击双倍伤害,立即解除冰冻状态
- 显示冰冻效果
- 有电属性的箭和近战武器,被这些武器攻击后进入触电状态
- 玩家触电状态持续0.5秒,每0.1秒受到1点伤害
- 通电效果能够快速传播
- 人物触电时,若手持金属武器,则武器掉落
- 显示触电效果
- 有三个部分的盔甲,每个部分都有火抗、冰抗、电抗的免疫效果(见1.2.2)
-
用户界面友好,移动、攻击、受击、生命值、buff/debuff状态等有清晰的显示
注:攻击时武器有0.2秒攻击动画; 受击时人物有0.2秒受击动画; 攻击和受击时各有0.2秒僵直,期间不能再进行攻击和被攻击; 生命值由上方血条显示; 元素状态均有显示
-
动作流畅,帧率能稳定在30FPS以上
下图为 PvE 模式下未发生冲突时的一次update的时间
下图为 PvE 模式下攻击时的一次update的时间
- 寻路系统
- 攻击系统
- 状态机 (具体实现见5.5)
注:对战 AI 进行了削弱,设计上对其进行攻击时不能移动等方面的限制,避免将玩家秒杀
[1] Qt Documentation [EB/OL],https://doc.qt.io