C++ 项目管理与工程实践¶
概述¶
笔者修读了浙江大学计算机学院 2024 年短学期课程《C++ 项目管理与工程实践》,并三人组队做了一个简单的项目:四轨道键盘交互音游。这篇文章相当于是对这十几天做个记录吧。
教师:袁昕
上课时间:2024 年 7 月 1 日 - 2024 年 7 月 14 日
项目仓库:点这儿!
做点准备工作¶
在上这门课之前就听说需要三人组队做东西,所以提前找了两个队友,然后就开始了这门课的学习。头几天上课讲的除了 C++ 的历史、一些编程注意事项之外,最重要的是第二天介绍的 MVVM 软件架构模式。这个模式是我们项目的基础,也是核心,更是进行验收的时候考察的重点。
一开始还很激动,毕竟很少有机会在课程里面做这种带用户界面的应用。对比了几个解决方案之后,使用了几乎人均的 Qt 库(虽然下载安装加配置就用了一整天)。下好之后看了看他们的示例工程,好像都是做工具类应用的?
后来上课的时候老师讲到 MVVM 框架适合那些交互频繁但是刷新频率不高的应用,这个时候就有点慌了,因为我们的项目是一个音游,交互频率很高,而且还要实时刷新。还好老师后面说对于游戏类应用可以对 MVVM 框架做一些修改,不过对于这种游戏来说心里还是没底。
作为一个音游 老玩家,我之前玩的时候也会想是怎么做出来的,尤其对判定的检测和音乐的同步感兴趣。之前一直搞不懂他们是怎么知道我要判定的是哪个 note 的。
艰难的开始¶
毕竟是老玩家,见得多,所以当上了组长还是很有野心的,想做出来很多功能。最开始的几天筹划整个项目建设,还在幻想属于自己的 伟大 音游。
但是东西太多了从何做起呢?想到我们在验收的时候最重要的是这个 MVVM 框架和解耦合特性满足情况,最后还是决定从一个最基础的功能来开始,但是每一个功能都要严格框在这个框架里面。
这第一个功能就是解析谱面文件并画出谱面的流动。谱面文件用的 JSON,配合第三方库解析还是很香的。想绘制那种谱面的流动情况还有点费劲,因为遵循这种框架就要求我们把业务逻辑和界面完全分开来思考,中间就用一些数据来连接。最开始的时候想到了很多方法,包括但不限于:
- 直接输出所有音符的起始位置给 View,然后让 Qt 自己动
- 用一个 QTimer 定时器,每次触发的时候让 ViewModel 更新数据,然后 View 读取数据
- ViewModel 自己来控制时间,每次更新数据的时候让 View 读取数据
对于这个问题的选择是很小心的,生怕违反了 MVVM 的原则。最后选择了第三种方法,因为这样 ViewModel 可以控制时间,而且 View 只需要读取数据就行了。(有点像在做硬件实验?ViewModel 掌控整个游戏的流程,View 就像开发板上的 VGA 接口,只管根据拿到的数据画图,跟时间完全无关)
经过三天的图书馆研讨室开发过后,确定用 noteInfo
进行数据传递然后画图。感谢 ViewModel 同学能够掌握这些错综复杂的数据生成方式,感谢 View 同学不厌其烦地画图并调数据。
第一轮迭代:爽了¶
能渲染谱面这件事,在 7 月 6 号晚上就能完成了。7 号左右开始中期验收,但是我们当时已经开始处理键盘输入了,就想着加上之后一块儿去验收。这个时候就开始了第一轮迭代。
7 号这天全在做键盘输入处理。两边工作其实挺顺利的,但是关于这个判定的问题还是发现挺多漏洞。后来发现还是存在很多性能问题,但是目前的情况来说够用就行。这个时候逐渐理解了判定延迟问题,是所有音游的一个难点。怎么去处理、怎么去优化,包括怎样让用户做出正确的选择,都是我们需要考虑的。这个“准”私以为由两部分组成:一部分是游戏本身的“准”,也就是预设的谱面能不能无延迟地显示出来,另一个是玩家的“准”,也就是玩家在正确的时间按下按键之后,逻辑是否也能正确判定,这个问题很关键。
晚上总算是能玩了,后来修了点延迟,做了点美化,就想着第二天去中期验收。
8 号起的挺早去机房,没想到到的时候虽然已经过了上课时间半个多小时,机房里都没几个人哈哈哈哈哈()。更没想到的是 8 号早上验收,我们组竟然还是全班第一个进行中期验收的。老师就重点看 MVVM 框架的实现,好在我们从一开始都强逼着自己按照这些思维开发,所以验收还是挺顺利的。老师提了一些建议,确实很有道理,我们就回去继续开发了。
后面几天做什么了吗?¶
上午验收完兴致勃勃地准备预约主图研讨室,发现预约不了了。原来从 8 号开始研讨室都不让预约了,寝室又有其他人,自习室讨论也不合适,西教公共空间有没有空调......紫金港之大,竟然没有一个合适的地方可以让我们继续开发。于是前往咖啡馆,接着讨论。下午就把老师上午说的两个问题搞完了,晚上就玩会儿。
9 号也是不知道去哪里讨论,最终决定前往一个神奇的地方:KTV。又有空调、桌子也大,写累了还能唱会儿,天才!唯一的缺点就是光线不太好。这天就做了一些界面美化,然后加了个音符打中即消失的特效。快结束的时候我们开始将目光转向多界面开发,加上欢迎界面、选歌界面啥的。下午六点半 KTV 到时间,晚上也没搞啥了,打了一晚上球()。
10 号在干啥?好像是加了个打击音效但是在另外两个人机子上跑不了。为了这事还在 GitHub 上面 revert 了。晚上快睡之前突然觉得这事有点蹊跷,后来搜了一下果然有解决方案,但是来不及了,就睡了。
11 号上午就把那个问题解决之后又在 GitHub 上 reapply 了,真是折磨人。下午才开始进行别的界面开发。最先是想做一个结算界面,因为这个最简单。其他两人在做的时候老师突然找到我说明天可以搞最后验收了,吓我一跳,可能我们进度确实比较快吧。我心中还可以加很多很多功能,但是老师说没必要太多哈哈哈哈哈哈。
晚上回寝室把结算界面做完了。一看表八点,感觉选歌界面晚上加个班应该也能做,没想到一做就又做到一点钟,好在是做出来了。最后把代码都整理一下,睡下准备验收,此时已是三点()。
最后验收:遥遥领先¶
12 号早上没啥可说的,验收,通过,潇洒离开,作为第一个验收的组,提前两天完成任务,神!
后记¶
其实还有好多功能想开发的,包括但不限于:
- 长条音符
- 双押、多押
- 音符特效
- 用户自主调节延迟
- 性能优化
不过对于这两周的课程来说,确实有点太自信了(悲)。能做到这个样子也挺不错的,毕竟老师一直说我们这就是红包雨,都红包雨了还要啥自行车。这些功能要是有时间的话还是会继续开发的,毕竟这个项目还是挺有意思的。
这几天的开发充分说明了提前准备、提前开工和紧密有序的工作流程是及其奏效的,团队合作也很重要,感谢队员们!更要感谢老师,给了许多建议和指导,而且验收的时候能聊好久哈哈哈哈,知识面很广。
继续加油吧!