Qt编程之超级玛丽

       一年前在一个公众号偶然看到了一些html游戏源码,其中就有超级玛丽的。用Webstrom打开看了下,发现是别人打过包,格式化后发现代码真的是晦涩难懂,后来又到github上去搜索,看能不能找到源代码,github果然什么都有。找到了下面两个仓库,貌似是最完整的,而且也可以调试源代码:

https://github.com/cflewis/Infinite-Mario-Bros

https://github.com/robertkleffner/mariohtml5.git

       用idea调试Java代码简直就是方便得不得了。看完了代码,又调试了代码,发现代码还是比较复杂的。大体的逻辑总算是搞清楚了,细节方面还是有些没有去仔细琢磨。当然了解这些就足够了,接下来的工作就是把源代码移植到C++平台下来。

       移植的首要问题是技术方案,到底是在Windows平台下还是在Linux平台下开发,到底是GDI还是GDI+,又或者是Irrlicht,Qt。关于这些我都一一尝试过,首先说一下GDI和GDI+,这两个东西贴出来的图,图片之间有明显的分隔线,两张图片挨着贴在一起,给人的感觉看上去还是两张。用Irrlicht和Qt就没有这种问题。但是用Irrlicht有个特效就没办法做出来,比如像下面的:

Qt编程之超级玛丽_第1张图片

       另外Irrlicht貌似也不支持图片镜像显示,考虑到尽可能把所有的功能都移植过来,所以最终选择了Qt 。当然Qt确实也是非常的强大。通过查阅其文档,把所有的问题都解决了。开发工具是QtCreator 4.10.0,Qt版本是5.13.1,用的是ubuntu 18.04.4,g++ 7.5.0。

        当然,在移植的过程中也遇到了一些坑:

       (1)二维vector初始化的问题,vector可以用assign赋初值,也可以先resize,然后再一个个循环遍历来赋值。一开始我是用assign赋值,结果程序有的时候会崩溃,也不是100%崩溃,后来上网查了一下,人家说可能是编译器问题,所以就采用先resize然后再循环赋值。崩溃的问题终于解决了。

      (2)游戏中的音乐播放问题,由于Cocos2d-x开源,所以参考了其源代码,把SimpleAudioEngine那部分代码移植过来了,SimpleAudioEngine在Linux下采用fmod来播放音频文件,由于游戏采用MIDI音频文件,代码执行到播放音频文件那一步时居然提示报错,说什么没有DSL文件没有,后来也上网各种搜索,甚至想自己来制作MIDI音频文件。最后,干脆下载了一个转换工具,把这些音频文件转成mp3格式的。问题也算是解决了。

       (3)游戏分辨率问题,用Java开发的那个是320 * 240的,而我用的是640 * 480的,所以很多数字都是原来项目两倍大小,这些参数一旦搞错,程序运行就会有问题,所以花了很长时间调试,搞懂这些逻辑。

       移植工作实在周末空闲时间完成的,完全是照搬的代码,没法照搬的就去找Qt里面对应的api来实现,尽管如此,也有些收获。前后断断续续,从开始到完成将近3个月的时间。一开始看这个源代码时,感觉确实挺复杂的,随着看的次数越来越多,觉得源代码也没这么难。不再那么畏惧了,信心也就上来了。原先的源代码写得很不规范,包括命名,重复代码比较多,移植的也有这些问题,当然以后有时间的话,再重构,不过它这个设计思想比较好。

       最后,给一下github地址,有需要的可以拿去研究下。

       https://github.com/zxymd5/QtMario.git

 

你可能感兴趣的:(C++编程之超级玛丽)