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

举报
游坦之 发表于 2022/10/21 18:51:28 2022/10/21
【摘要】 ​ 【写在前面,些许感慨】         c++课设做的项目,历时两个多月,写了4000余行代码,最终终于用QT从底层实现了超级玛丽。由于我能力有限,参考了一个大神的源代码(大神传送门),不过他是用VS写的,我是用QT写的,在一些方面还是有很大的差距。刚开始很绝望,项目重写了5、6次,以至于一度怀疑自己要不要写一个这样的项目(这就是刚开始规划的重要性),不过当我参考着源代码写完碰撞盒的时候...

 【写在前面,些许感慨】 

        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(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



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。