跳过正文

C++ 短学期项目实践心得

·1406 字·3 分钟· ·
Fanovian
作者
Fanovian
“无论过去,不问将来”
目录

概述
#

笔者修读了浙江大学计算机学院 2024 年短学期课程《C++ 项目管理与工程实践》,并三人组队做了一个简单的项目:四轨道键盘交互音游。本文章将这两周的学习和开发过程进行总结。

教师:袁昕

上课时间:2024 年 7 月 1 日 - 2024 年 7 月 14 日

项目仓库:https://github.com/Fanovian/MyMUG

准备工作
#

前几天上课内容除了 C++ 的历史、一些编程注意事项之外,最重要的是第二天介绍的 MVVM 软件架构模式。这个模式是我们项目的核心,也是验收考察重点

很少有机会在课程里面做这种带用户界面的应用,对比了几个解决方案之后,使用了几乎人均的 Qt 库。这个库的优点是跨平台、文档齐全、社区活跃,缺点是有点大。

老师讲到 MVVM 框架适合那些交互频繁但是刷新频率不高的应用,似乎与音游有点不符。但是好在能够对框架进行一些小修改。

如何开始
#

功能太多了从何做起呢?想到我们在验收的时候最重要的是这个 MVVM 框架和解耦合特性满足情况,最后还是决定从一个最基础的功能来开始,但是每一个功能都要严格框在这个框架里面

第一个功能就是解析谱面文件并画出谱面的流动。谱面文件用的 JSON 格式配合第三方库解析,难点在于绘制谱面的流动情况,因为遵循这种框架就要求我们把业务逻辑和界面完全分开来思考,中间就用一些数据来连接。最开始的时候想到了很多方法,包括但不限于:

  • 直接输出所有音符的起始位置给 View,然后让 Qt 自己动
  • 用一个 QTimer 定时器,每次触发的时候让 ViewModel 更新数据,然后 View 读取数据
  • ViewModel 自己来控制时间,每次更新数据的时候让 View 读取数据

对于这个问题的选择是很小心的,生怕违反了 MVVM 的原则。最后选择了第三种方法,因为这样 ViewModel 可以控制时间,而且 View 只需要读取数据就行了。(有点像在做硬件实验?ViewModel 掌控整个游戏的流程,View 就像开发板上的 VGA 接口,只管根据拿到的数据画图,跟时间完全无关)

经过数次讨论,我们确定用 noteInfo 进行数据传递然后画图。感谢 ViewModel 同学能够掌握这些错综复杂的数据生成方式,感谢 View 同学不厌其烦地画图并调数据。

第一轮迭代
#

能渲染谱面这件事在 7 月 6 号晚上就能完成了。7 号左右开始中期验收,但是我们当时已经开始处理键盘输入了,就想着加上之后一块儿去验收。

这个时候就属于第一轮迭代。

7 号这天全在做键盘输入处理。两边工作其实挺顺利的,但是关于这个判定的问题还是发现挺多漏洞。后来发现还是存在很多性能问题,但是目前的情况来说够用就行。这个时候逐渐理解了判定延迟问题,是所有音游的一个难点。怎么去处理、怎么去优化,包括怎样让用户做出正确的选择,都是我们需要考虑的。

这个“准”私以为由两部分组成:一部分是游戏本身的“准”,也就是预设的谱面能不能无延迟地显示出来,另一个是玩家的“准”,也就是玩家在正确的时间按下按键之后,逻辑是否也能正确判定,这个问题很关键。

8 号中期验收,我们排第一个,老师的总体评价很好,但是也提出了两个问题:

  • 某些线程过于复杂,可以考虑简化
  • 前后端某些数据还在用指针绑定,可以考虑全面使用 Qt 的信号槽机制

其实是很好修复的。

后期工作?
#

由于我们一直逼迫自己进入此框架开发模式,因此第一轮迭代完成后,后面的工作就变得很简单了。我们只需要不断地添加新的功能,然后在这个框架里面进行开发就行了。后续开发只用了两天。

后记
#

还有很多待开发功能,包括但不限于:

  • 长条音符
  • 双押、多押
  • 音符特效
  • 用户自主调节延迟
  • 性能优化

不过对于这两周的课程来说,确实有点太自信了,能做到这个样子也挺不错的,要是有时间的话继续。