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有個特效就沒辦法做出來,比如像下面的:

進入關卡畫面

       另外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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章