欢迎光临
我们一直在努力

【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】

【写在前面,些许感慨】

c++课设做的项目,历时两个多月,写了4000余行代码,最终终于用QT从底层实现了超级玛丽。由于我能力有限,参考了一个大神的源代码(大神传送门),不过他是用VS写的,我是用QT写的,在一些方面还是有很大的差距。刚开始很绝望,项目重写了5、6次,以至于一度怀疑自己要不要写一个这样的项目(这就是刚开始规划的重要性),不过当我参考着源代码写完碰撞盒的时候,我就知道这个项目我可以做出来了。后面的代码都是我随意发挥,即兴挥毫。

相较于其他用平台做的也很好的同学,我花费的时间和代码量应该是他们的两到三倍(宿舍的一个大神,用平台写的特牛,但我看他也就1000多行)。难点在哪?第一就是碰撞盒的搭建,这是重中之重,当你处理好碰撞盒的时候,你的项目也就完成了一半。第二就是图片的处理,本项目参考了任天堂的做法,采用了拆图在拼图的方法。如下图马里奥的图片集合,无非就是用"截图"的方式,把用到的马里奥一个个抠出来,然后在拼装到合适的位置,我觉得这个步骤占据了我80%的时间,因为对这个图片掌握不是很详细,所以只能一步步尝试,一个坐标一个坐标的尝试,就像一个很简单的界面,功能很简单,但是由于图片拼装非常麻烦,所以100来行却花了两个多小时,诸如此类。难点不想再写了,要是想写,又是洋洋洒洒几千字,但我觉得没啥意义,最烦写报告了(一笑)。

【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】

尽管用底层写一款游戏费的时间特别长,代码量又大,再加上用的是QT,非常不方便。但是通过这次游戏的开发,让我完整的走完了一遍游戏开发的流程,对游戏开发有了更深的感悟(发自内心的一句话,却有种套话的感觉【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】),那些用平台以至于引擎写的同学不会体会到底层的浩瀚(嘿嘿)。

【写在前面,项目缺陷】

  • 碰撞盒:碰撞盒处理的不是很到位,所以碰撞有点问题,所以设置的马里奥是无敌的,不过死亡动画也写了。不信你按S。
  • 流程的处理:刚开始连界面都没写(【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】),后来我给补上了。但是死亡之后不会重新开始,这好像也挺简单,但就是没写。验收的时候老师也没说啥,毕竟写底层的就我一个人(帅气)。
  • 由于当时图省事,大多数路径用的都是绝对路径,所以如果运行该项目,需要把路径替换成自己的,如下图路径。

【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】

【项目操作】

估计都不用写吧。↓←→分别控制下蹲、移动。X 跳跃 Z发射子弹

骚操作:S 死亡 T 升级

【项目show】

放不了视频,贴几张GIF吧

【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】

【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】

【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】 【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】

【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】

【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】

【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】 【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; }

【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】

【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】

如上,将面向左的翻转成面向右的,反之。

4、图片截取

marioPix = QPixmap(s); marioPix = marioPix.copy(x + j * mx, y + i * ny, width, heigh); marioPix = marioPix.scaled(width*2.5,heigh*2.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

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《【QT】历时两个月,用QT实现超级玛丽,谁说QT不能写游戏?【附源码】》
文章链接:https://www.456zj.com/37526.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址