跳到主要內容

發表文章

目前顯示的是有「Interface」標籤的文章

虛擬檔案系統

大家都頃向於把自己遊戲所使用到的資源,以自己的檔案格式作加密打包。我也不例外,以前也和大家一樣設計了自己的檔案格式,可以將多個檔案加密壓縮打包起來,當然也還需要製作可以讀寫這種檔案格式的工具程式。實作出來後感覺還不錯,只不過其實這只是多此一舉的動作。 後來我改使用zip格式作資料包。想要加密?也沒有問題,加上密碼保護就可以了。工具也有一堆現成的,要用 WinZip 或 7-Zip 什麼的都可以,完全不必花費任何力氣就擁有工具可以讀寫資料包。所有我需要作的事就是設計一個程式庫,可以用來讀寫 Zip檔案格式 就行了。事實上 zlib 已經能夠滿足這個需求了,只需要再多作一點程式包裝。所以我多花了些功夫在程式介面的設計上,最後完成了虛擬檔案系統的設計( smallworld2 ::Archive)。 為什麼把它叫作虛擬檔案系統呢?因為它目前支援了二種檔案系統,一個是一般的路徑檔案系統,另一個就是剛剛提的zip檔案系統。不管你使用的是那一種檔案系統,對於呼叫者而言是抽象的。呼叫者只需要透過統一的介面只存取檔案,完全不必考慮這個檔案是在那個資料夾或那個zip檔內,或甚至是在那一塊記憶體內(這是第三種形式)。 class Archive { public:   bool addFileSystem(std::string const& path);   bool addFileSystem(std::istream& stream);   bool isFileExist(std::string const& name) const;   bool loadFile(std::string const& name, std::ostream& outs, std::string const& password=""); }; 如上是虛擬檔案系統的C++程式介面,很簡單。因為其中也使用了C++ stream作為資料交換介面,所以也能很容易的和 C++ IOstream 家族結合使用,變的很有彈性。 addFileSystem是用來增加一個路徑或zip檔案到搜尋路徑。而另一個stream的版本則是用來加入一個來自串流的檔案系統,這個串流可以指向C++ Fil...

good::gx介面

good::gx是負責繪圖的介面。它很簡單,至少目前來說還很簡單。只有二個介面:Image及Graphics。 Image介面對貼圖作一層薄薄的包裝,good執行的時候,所有使用到的貼圖的地方全都透過這一層介面作存取。下面是Image介面定義。 template<class ImgT> class Image { public: bool isValid() const; int getWidth() const; int getHeight() const; bool hasKeyColor() const; int getKeyColor() const; void setKeyColor(int keycolor); }; Graphics介面提供了很少的功能,目前只有貼圖和畫色塊二個功能,因為目前good的成像目前只需要這二個功能就足夠畫出所有東西。下面是Graphics介面定義。 template<class ImgT> class Graphics { public: bool drawImage(int x, int y, ImgT const& img, int srcx, int srcy, int srcw, int srch); bool drawImage(int x, int y, ImgT const& img) { return drawImage(x, y, img, 0, 0, img.getWidth(), img.getHeight()); } bool fillSolidColor(int left, int top, int width, int height, int color); }; + + + 實際應用的時候,只需要針對不同繪圖平台作不同實作品的提供,對於good內部而言,幾乎不必作任何修改。目前good::gx有四種實作品,GDI、SDL、imgp及OpenGL。