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