跳到主要內容

發表文章

Good Game Editor 1.2 Beta

* 新增Good.KillAllChild * 關卡編輯器(Level Editor)支援按住Alt鍵以滑鼠拖曳物件作複製。 * 修正在關卡編輯器中拖曳物件過程中按ESC鍵的處理錯誤。 * AboutBox中,zlib及yardparser文字位置對調。 * 關卡編輯器新增使用方向鍵移動物件。 * 關卡編輯器中(Name|Visible|Rot|Scale|Repeat|Script)等屬性可以undo/redo。 * 關卡編輯器支援按住Shift鍵以方向鍵作色塊及貼圖物件縮放。 * 關卡編輯器支援以Tab鍵切換選取物件。 * 修正Good模組API傳入物件Id(0)的錯誤。 * 去掉Good模組中物件類別常數的前綴詞TYPES_。 * 去掉Input模組中按鍵常數的前綴詞KEYS_。 * 以Good.SetBgColor設定關卡物件BgColor等同於設定關卡背景清除顏色(ClearColor)。 * 新增範例lvlbg。 * 新增範例動態選單(menu)。 * 工具列新增一個可以開關ResourceView及一個開關OutputView的按鈕。 * AboutBox的連結(又)改成按鈕型式。 * 修正一個新增關卡的小問題,將HasClearColor初始為false。 * 將範例程式中使用的一些BMP圖形格式轉為PNG。 * 新增單人撲克牌遊戲:蒙地卡羅。 * AboutBox添加Wiki連結。 * 編輯器(Editors)的縮放比例最大可到800%。 * 修正一個新件貼圖物件大小計算錯誤的問題。 * 新增Good.GetTexId/SetMapId/SetTexId API。 * 新增檢查是否有新版本編輯器的功能(Help\Check for Update...)。 * 新增一個sample,簡單的示範縮放及旋轉(scalerot)。 * 移除AboutBox裡的waync's smallworld連結。 * 修正Good.GetDim在讀取貼圖物件時沒有正確回傳寬高的問題。 * 修正時間控制的問題,這樣在某些電腦上不會一執行遊戲時就失速。 * 新版本也能在iPhone上通過編譯執行。 * 增加對物件作縮放(xScale,yScale)及旋轉(Rotate)的支援。 * 把25940m改版一下支援iPhone,當作測試。 * 除了可以在Dependen...

25940p for PSP

自從上次更新過 DevkitPSP 之後,PSP版的 25940p 就無法編譯,其實是環境設定問題,不過當時沒有仔細去看是怎麼回事,直接就丟著不管。直到前天又突然想到,把DevkitPSP更新到目前R14後,試編譯一下,結果又可以編譯了,只不過這次是編譯問題,編譯不成功。既然可以編譯,所以花了點時間修正一下,順便作一些修正。 下載

單人撲克牌遊戲 - 蒙地卡羅

更多可在網頁玩的 單人撲克牌遊戲 ; 新增一個簡單的單人撲克牌遊戲: 蒙地卡羅 ,簡單介紹一下玩法。 下載 事先排列好5x5張牌。 每次移動一張可以配對的牌,並消除這對牌。在上下、左右及斜向相隣的二張牌,只要擁有同樣數字(不計花色),即可配對。 消除二張配對的牌後,剩餘的牌以往左往上的方式補滿空隙,接著在發新牌補滿後面的空格。 重覆步驟2~3,直到沒有牌可以配對及發完所有牌為止。 結果有二種。一個是勝利,成功的消除掉所有牌。另一個是Gameover沒有牌可以再作配對。

以Boost.Spirit實作算式計算機

Spirit 是開源碼C++程式庫 Boost 裡的一個項目,大量使用了C++ Template Meta-Programming實作技術。它提供了一個用來實作語言剖析器的框架,就好像lex/yacc一樣是專門用來製作語言剖析器的工具。但是Spirit因為應用了C++ Template Meta-Programming的技術,使得我們可以在C++程式碼中寫出相當於 EBNF 的描述且可直接編譯並執行,也因為如此Spirit是一套既神奇又威力強大的工具程式庫。 按照慣例,前面我們已經以 手工的方法 ,以及 lex/yacc的方式 實作了算式計算機,這次我們要使用Spirit來作個簡單的算式計算機。 EBNF表示式 雖然前面我們已經提到過Spirit的神奇的能力,也就是可以直接把EBNF式直接以程式碼的形式寫在C++程式碼內,但是因為受限於C++程式語言的語言,有些表式法需要作些調動,這裡面主要有幾個地方的語法需要注意。 A B 上面是原EBNF表示式的寫法,用來表示一個序列,A之後會有個B。而在Spirit裡需改寫成如下的形式。 A >> B 看起來沒有什麼太大的不同,也可以很容易的理解這是表示在A之後跟著B的序列。再來是*號的用法。 A* 在EBNF內,在符號A之後加個*號,表示A的數量是可重複的,可以是0個以上的A所構成的序列。而在Spirit中需改寫成如下形式。 *A 正好相反,需要把*號擺到符號的前面,因為在C++裡面並沒有任何後序式的*號運算元。不過就算改成前置式也不會影響到原來所代表的意義,並不會造成什麼衝突,容易理解。 A? 這是表示符號A是可有可無,也就是A的數量可以是0個或一個。以下改成以Spirit的寫法。 !A 如你所見到的,問號變成驚嘆號,同時也提到前面變成前置式。那麼一個以上的表示式呢?一樣使用加號,也一樣改成前置式即可,如下所示。 +A 現在來看一個簡單的範例,如下所示是EBNF式,用來表示以逗號分隔的數字的EBNF表示式。 S := INTEGER (',' INTEGER)* 改成Spirit的形式。 S = INTEGER >> *(',' INTEGER); 很直接,也不需要再多作說明。不過上面的式子還不是最終可用的版本,底下還會再陸續交待清楚。 Parser 在上面我們所看...

malloc(0)的回傳值?

用VC寫個小程式作個實驗。 int *a = (int*)malloc(0); if (a)   cout else   cout 程式執行的結果是, 'not null' 為什麼配置一塊大小為0的記憶體的回傳值不是NULL? 有時候要配置的記憶體大小是計算得到的,這個大小有可能為0,為了和配置失敗回傳的NULL作區分,同時也能保持程式對任何大小記憶體的處理一致,所以就讓0大小的配置也回傳個有效的指標。 不管是不是NULL,free都能接受。 ... 最後,根據 C99標準 : If the size of the space requested is zero, the behavior is implementation-defined : either a null pointer is returned, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object. 所以,簡單的講,malloc(0)是沒有定義的行為。對於沒有定義的行為,去討論它是沒意義的...

虛擬檔案系統

大家都頃向於把自己遊戲所使用到的資源,以自己的檔案格式作加密打包。我也不例外,以前也和大家一樣設計了自己的檔案格式,可以將多個檔案加密壓縮打包起來,當然也還需要製作可以讀寫這種檔案格式的工具程式。實作出來後感覺還不錯,只不過其實這只是多此一舉的動作。 後來我改使用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 Game Editor 1.1 Beta Release!

遊戲資源編輯 貼圖 (Texture editor, Jpeg, PNG, BMP) 聲音 (Audio, OGG, WAV) 地圖編輯 (Map editor) 精靈編輯 (Sprite editor) 關卡編輯 (Level editor) Script編輯 (Script editor) 範例程式 打磚塊/寶石方塊/踩地雷等16個小遊戲範例 遊戲範例 25940m 輸出WIN32獨立可執行檔 (Stand-alone exe) ; 本來要等到加上文字物件後再釋出,不過這陣子比較沒時間更新,所以先把目前的版本作為1.1beta釋出... 這個版本作了許多小更新,主要在加強 particle的部份,應用方面可參考25940m,另外API reference也作了更新。 下載good Game Editor 1.1 Beta API 參考手冊