「程序源代碼」《金庸群俠傳》C++復刻版

關鍵字:《金庸群俠傳》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


「程序源代碼」《金庸群俠傳》C++復刻版

「程序源代碼」《金庸群俠傳》C++復刻版

「程序源代碼」《金庸群俠傳》C++復刻版


分享到:


相關文章: