關鍵字:《金庸群俠傳》C++復刻版
這是一個以SDL2為基礎實現的2D遊戲框架,同時相當於提供了一個使用該框架製作DOS遊戲《金庸群俠傳》移植版的範例。Windows下可以使用Visual Studio編譯,其他系統下可以在src目錄使用CMake生成Makefile,使用GCC或Clang編譯,需至少支持C++14。VS工程為x64版本,如需要x86版請自行修改。
安裝說明
架構的簡單說明
一:公共部分
1、Engine封裝了一套SDL2的主要實現,與SmallPot類似。如更換繪圖引擎,則只需修改此部分即可。
2、Save中對所有數據進行了封裝,可以較為方便地調用。
3、TextureManger是一個紋理管理器,因為《金庸群俠傳》的貼圖是含偏移設置的,故有些特殊的地方。
4、Audio是音頻類,基於BASS或者SDL_mixer,可以播放mid、mp3、wav等格式。
5、PotConv封裝了iconv的實現。
二:RunNode基礎執行類說明
RunNode是遊戲中的基本執行類,包含5個重要的虛函數:backRun,draw,dealEvent,onEnter,onExit。對應在背景中執行,如何畫自身,如何處理事件,進入時的處理,退出時的處理。一般來說,衍生類應重寫這些函數。其中每個元素可以包含數個子元素,在繪圖時子節點也會被自動一一繪出。需注意在畫自身的部分不需要處理子節點,除非有特殊的需要。
1、存在一個全局的的RunNode棧root(實際是std::vector),會從下到上依次畫出每個節點。RunNode類有一個佔滿全屏的屬性,表示這個類將佔用全部的屏幕,因此引擎在繪製的時候,會僅找出最靠上的含有該屬性的節點,並從這裡開始往上畫。
2、創建一個節點,並調用run過程即可運行此節點,注意使用run執行的節點是完全獨佔的,其子節點也會有事件響應。如果需要退出當前節點,在適當的地方使用setExit(true)即可,但是子節點調用是無效的,除非擁有當前運行節點的指針。
3、run過程的參數為一個布爾值,如果為true則會被加入到root並進行繪製,如果為false則只運行不參與繪製。但是很多節點的draw過程是空的,即使放到root中也不會參與繪製,實際利用了這一特性的僅有顯示人物對話的部分。
4、run過程會返回一個函數值,可以利用進行一些判斷,例如菜單的選擇。
5、規定所有節點均使用共享指針,可以比較自由地互相包含。請不要讓子節點出現遞歸包含,這樣會迅速消耗掉所有資源。通常來說,大部分遊戲引擎都需要全局標記和回調來控制劇情的執行,本框架採用Element的run設計,使事件以阻塞的模式順序執行,同時繪圖仍是無阻塞執行的,這樣無需額外的標記事件即可以順序執行。
三:視頻
這是作者編寫的一個視頻播放器,可以將其編譯為動態庫,作為SDL2的插件,用於進行視頻過場的播放。如果難以處理,可以將預處理定義宏中的WITH_SMALLPOT刪除。Mac和Linux下默認不會打開。
四:音頻
音頻播放可從BASS或者SDL_mixer中二選一,其中BASS的音質較好。之前SDL_mixer有嚴重的跳出問題,目前版本是否已經解決暫時不清楚。因BASS為商業庫,故使用SDL_mixer作為備選,編譯時增加宏USE_SDL_MIXER_AUDIO即可。鏈接選項並未分別處理。VS和GCC中,如果某個庫的功能並未被用到,即使其包含在鏈接選項中,也不會參與實質的鏈接。
五:abc工程以及資源的保存
abc工程用來轉換之前的數據。建議自行調整代碼後,使用調試模式執行。
其中主要的功能是將存檔的R部分擴展為原來的二倍。即所有的16位整數轉為32位整數,表示範圍從32767擴大到2^31-1,足夠通常的數值使用。同時,原有的字串也擴展為之前的二倍長度,例如原來人物的名字有5箇中文字符長度,實際上最多隻能使用4個字,轉換之後則可以使用9個字(並不是推薦你用9個字)。轉換之後的文件名變為r?.grp32。
1、文件的文本編碼,僅有初始存檔為cp950(BIG5),這是向下兼容的需要,但是內部會使用cp936(GBK),存檔被保存後也會轉為cp936。
2、存檔的基礎數據部分可以保存為sqlite的數據庫格式。可以通過讀取和保存來轉換已有存檔。
3、遊戲的資源文件是以單個圖片的形式放在resource的各個目錄中的,每張圖的偏移保存在index.ka中,格式為每張圖兩個16位整數,連續存放。目前沒有設計打包格式。
4、戰鬥貼圖文件中,每個人的幀數,之前在hugebase(水滸)框架中使用fightframe.ka保存,現改用fightframe.txt保存。格式為動作索引(0~4),每方向數量。未寫則視為0。
5、之前遊戲使用的列表文件只保留了升級經驗列表和離隊列表,改用txt格式。並非所有的文檔都轉為32位,這有一部分是為了節省資源的需要。以上提到的數據,除了文本文件外均可以用真正的強強的新版upedit修改(該修改器不完善)。
六:使用到的其他開發庫
1、以下庫在Windows下建議使用vcpkg或者msys2來安裝,或者也可以去官網下載,請自行選擇。在Linux下編譯時則應優先考慮使用系統的包管理器(例如apt等)自動安裝的庫,在Mac下可以使用homebrew來安裝。
SDL https://www.libsdl.org/
SDL_image https://www.libsdl.org/projects/SDL_image/
SDL_ttf https://www.libsdl.org/projects/SDL_ttf/
SDL_mixer https://www.libsdl.org/projects/SDL_mixer/
libiconv https://www.gnu.org/software/libiconv/
lua https://www.lua.org/
PicoSHA2 https://github.com/okdshin/PicoSHA2
sqlite3 https://www.sqlite.org/
2、以下庫已包含在本工程中:
hanz2piny https://github.com/yangyangwithgnu/hanz2piny
zip https://github.com/kuba--/zip
BASS, BASSMIDI http://www.un4seen.com/
OpenCC https://github.com/BYVoid/OpenCC
Fast C++ CSV Parser: https://github.com/ben-strasser/fast-cpp-csv-parser
smallpot: https://github.com/scarsty/smallpot
4、以下為間接使用,通常包管理器會自動處理。
freetype https://www.freetype.org/
FFmpeg https://www.ffmpeg.org/
zlib https://zlib.net/
libass https://github.com/libass/libass
fribidi https://www.fribidi.org/
libpng http://www.libpng.org/pub/png/libpng.html
harfbuzz https://github.com/harfbuzz/harfbuzz
fontconfig https://www.freedesktop.org/wiki/Software/fontconfig
5、備註:SDL及相關的擴展均是2.0版本。漢字轉拼音和壓縮文件並非Linux發行版的常見庫,故直接使用了源碼。PicoSHA2和CSV庫僅需要頭文件,如果文件不在包含目錄中,請注意將它們複製到適合的位置。除BASS和BASSMIDI為閉源,但可以免費用於非商業項目之外,其他均為開源工程。
七:common 功能集合下載
common是作者所寫的一個通用功能集合,被多個工程使用。其中包含了ini文件讀寫庫,修改自以下工程:ini Reader https://github.com/benhoyt/inih
閱讀更多 程序源代碼 的文章