【写在前面,些许感慨】
c++课设做的项目,历时两个多月,写了4000余行代码,最终终于用QT从底层实现了超级玛丽。由于我能力有限,参考了一个大神的源代码(大神传送门),不过他是用VS写的,我是用QT写的,在一些方面还是有很大的差距。刚开始很绝望,项目重写了5、6次,以至于一度怀疑自己要不要写一个这样的项目(这就是刚开始规划的重要性),不过当我参考着源代码写完碰撞盒的时候,我就知道这个项目我可以做出来了。后面的代码都是我随意发挥,即兴挥毫。
相较于其他用平台做的也很好的同学,我花费的时间和代码量应该是他们的两到三倍(宿舍的一个大神,用平台写的特牛,但我看他也就1000多行)。难点在哪?第一就是碰撞盒的搭建,这是重中之重,当你处理好碰撞盒的时候,你的项目也就完成了一半。第二就是图片的处理,本项目参考了任天堂的做法,采用了拆图在拼图的方法。如下图马里奥的图片集合,无非就是用"截图"的方式,把用到的马里奥一个个抠出来,然后在拼装到合适的位置,我觉得这个步骤占据了我80%的时间,因为对这个图片掌握不是很详细,所以只能一步步尝试,一个坐标一个坐标的尝试,就像一个很简单的界面,功能很简单,但是由于图片拼装非常麻烦,所以100来行却花了两个多小时,诸如此类。难点不想再写了,要是想写,又是洋洋洒洒几千字,但我觉得没啥意义,最烦写报告了(一笑)。
尽管用底层写一款游戏费的时间特别长,代码量又大,再加上用的是QT,非常不方便。但是通过这次游戏的开发,让我完整的走完了一遍游戏开发的流程,对游戏开发有了更深的感悟(发自内心的一句话,却有种套话的感觉),那些用平台以至于引擎写的同学不会体会到底层的浩瀚(嘿嘿)。
【写在前面,项目缺陷】
碰撞盒:碰撞盒处理的不是很到位,所以碰撞有点问题,所以设置的马里奥是无敌的,不过死亡动画也写了。不信你按S。
流程的处理:刚开始连界面都没写(),后来我给补上了。但是死亡之后不会重新开始,这好像也挺简单,但就是没写。验收的时候老师也没说啥,毕竟写底层的就我一个人(帅气)。
由于当时图省事,大多数路径用的都是绝对路径,所以如果运行该项目,需要把路径替换成自己的,如下图路径。
【项目操作】
估计都不用写吧。↓←→分别控制下蹲、移动。X 跳跃 Z发射子弹
骚操作:S 死亡 T 升级
【项目show】
放不了视频,贴几张GIF吧
【QT知识的总结】
写给自己的,这次项目也遇到了一些QT知识的问题,整理一下。
1、强制类型转换(父转子)
TortoiseKing M = dynamic_cast<TortoiseKing>(b);
b是父类的实例,TortoiseKing类是子类
2、计算时间戳
QDateTime::currentMSecsSinceEpoch();//13位,精确到毫秒
QDateTime::currentSecsSinceEpoch();//10位,精确到秒
long long int Level::calcTime()
{
// 计算当前的时间戳
return QDateTime::currentMSecsSinceEpoch();
}
3、图片翻转
pix = horFilp((pix.toImage());
QPixmap Level::horFilp(QImage image)
{
image = image.mirrored(true, false);
QPixmap pix1 = QPixmap::fromImage(image);
return pix1;
}
如上,将面向左的翻转成面向右的,反之。
4、图片截取
marioPix = QPixmap(s);
marioPix = marioPix.copy(x + j mx, y + i ny, width, heigh);
marioPix = marioPix.scaled(width2.5,heigh2.5);
解析:把s这张图片赋予marioPix,copy(a,b,c,d)的作用:从marioPix这张图片的a,b位置开始截取,截取c*d大小的图片。scaled(a,b),宽高分别放大a、b倍
一个多月了,其他的还有一些,不整理了。
【写在后面】
QT确实不太适合做游戏......绘图事件都不好弄,所以只写了一个绘图事件,但是难度就给了全局变量的设置。不过底层实现对于学生而言还是比较牛掰的,所以课设成绩还不错。前三!
【源码】
链接:https://pan.baidu.com/s/1fKZbTg6HQUNZAInXu-cFLw?pwd=qtnb
提取码:qtnb