Qt编程之超级玛丽
? ? ? ?一年前在一個(gè)公眾號(hào)偶然看到了一些html游戲源碼,其中就有超級(jí)瑪麗的。用Webstrom打開看了下,發(fā)現(xiàn)是別人打過包,格式化后發(fā)現(xiàn)代碼真的是晦澀難懂,后來又到github上去搜索,看能不能找到源代碼,github果然什么都有。找到了下面兩個(gè)倉庫,貌似是最完整的,而且也可以調(diào)試源代碼:
https://github.com/cflewis/Infinite-Mario-Bros
https://github.com/robertkleffner/mariohtml5.git
? ? ? ?用idea調(diào)試Java代碼簡直就是方便得不得了。看完了代碼,又調(diào)試了代碼,發(fā)現(xiàn)代碼還是比較復(fù)雜的。大體的邏輯總算是搞清楚了,細(xì)節(jié)方面還是有些沒有去仔細(xì)琢磨。當(dāng)然了解這些就足夠了,接下來的工作就是把源代碼移植到C++平臺(tái)下來。
? ? ? ?移植的首要問題是技術(shù)方案,到底是在Windows平臺(tái)下還是在Linux平臺(tái)下開發(fā),到底是GDI還是GDI+,又或者是Irrlicht,Qt。關(guān)于這些我都一一嘗試過,首先說一下GDI和GDI+,這兩個(gè)東西貼出來的圖,圖片之間有明顯的分隔線,兩張圖片挨著貼在一起,給人的感覺看上去還是兩張。用Irrlicht和Qt就沒有這種問題。但是用Irrlicht有個(gè)特效就沒辦法做出來,比如像下面的:
? ? ? ?另外Irrlicht貌似也不支持圖片鏡像顯示,考慮到盡可能把所有的功能都移植過來,所以最終選擇了Qt 。當(dāng)然Qt確實(shí)也是非常的強(qiáng)大。通過查閱其文檔,把所有的問題都解決了。開發(fā)工具是QtCreator 4.10.0,Qt版本是5.13.1,用的是ubuntu 18.04.4,g++ 7.5.0。
? ? ? ? 當(dāng)然,在移植的過程中也遇到了一些坑:
? ? ? ?(1)二維vector初始化的問題,vector可以用assign賦初值,也可以先resize,然后再一個(gè)個(gè)循環(huán)遍歷來賦值。一開始我是用assign賦值,結(jié)果程序有的時(shí)候會(huì)崩潰,也不是100%崩潰,后來上網(wǎng)查了一下,人家說可能是編譯器問題,所以就采用先resize然后再循環(huán)賦值。崩潰的問題終于解決了。
? ? ? (2)游戲中的音樂播放問題,由于Cocos2d-x開源,所以參考了其源代碼,把SimpleAudioEngine那部分代碼移植過來了,SimpleAudioEngine在Linux下采用fmod來播放音頻文件,由于游戲采用MIDI音頻文件,代碼執(zhí)行到播放音頻文件那一步時(shí)居然提示報(bào)錯(cuò),說什么沒有DSL文件沒有,后來也上網(wǎng)各種搜索,甚至想自己來制作MIDI音頻文件。最后,干脆下載了一個(gè)轉(zhuǎn)換工具,把這些音頻文件轉(zhuǎn)成mp3格式的。問題也算是解決了。
? ? ? ?(3)游戲分辨率問題,用Java開發(fā)的那個(gè)是320 * 240的,而我用的是640 * 480的,所以很多數(shù)字都是原來項(xiàng)目兩倍大小,這些參數(shù)一旦搞錯(cuò),程序運(yùn)行就會(huì)有問題,所以花了很長時(shí)間調(diào)試,搞懂這些邏輯。
? ? ? ?移植工作實(shí)在周末空閑時(shí)間完成的,完全是照搬的代碼,沒法照搬的就去找Qt里面對應(yīng)的api來實(shí)現(xiàn),盡管如此,也有些收獲。前后斷斷續(xù)續(xù),從開始到完成將近3個(gè)月的時(shí)間。一開始看這個(gè)源代碼時(shí),感覺確實(shí)挺復(fù)雜的,隨著看的次數(shù)越來越多,覺得源代碼也沒這么難。不再那么畏懼了,信心也就上來了。原先的源代碼寫得很不規(guī)范,包括命名,重復(fù)代碼比較多,移植的也有這些問題,當(dāng)然以后有時(shí)間的話,再重構(gòu),不過它這個(gè)設(shè)計(jì)思想比較好。
? ? ? ?最后,給一下github地址,有需要的可以拿去研究下。
? ? ? ?https://github.com/zxymd5/QtMario.git
?
總結(jié)
- 上一篇: 六角星问题---蓝桥杯练习
- 下一篇: Northwind数据库Pubs数据库文