2009年11月10日星期二

背景重覆模式

新增了一個類似CSS的background repeat功能,可以在關卡裡指定貼圖背景及地圖背景水平及垂直方向的重覆模式。有了這個功能之後,背景就可以使用簡單的磚塊圖片重覆鋪滿,或者也能很容易的實作出多重背景捲動。底下的抓圖是使用repeat-x功能作出多重背景捲動。


總共使用了三張底圖,全景底圖、白雲及太陽寶寶,全部設定成水平重覆貼圖。程式執行後,三張圖各以不同的速度去改變自己的水平座標,結果就在畫面上呈現出三層的背景捲動。

2009年11月7日星期六

Script Editor

結果又把Script Editor的Syntax Color功能拿掉了,因為我把Editor本身用到的Rich Edit換回一般的Edit,所以也就沒辨法支援顏色。原因是加入了完整的Edit Hotkey支援,例如Ctrl+C/Ctrl+X等等。為了省麻煩,減少複雜度所以才換回一般的Edit元件。

除此之外直接在Script Edit內作的改變終於也能夠存檔了。因為原本存檔的定義是針對專案,現在再加上也可對程式原始碼檔作存檔,所以在操作的定義上需要再多作一點判定,同時在專案切換或程式關閉時也需要多加對變動檔案需存檔的提醒。

目前還缺Find/Replace及GotoLine的功能需要補充。

2009年11月5日星期四

stge粒子系統介面修正

stge粒子系統介面部份作了重新設計,現在能夠更有彈性的將stge產生的粒子bind到任意的good物件。

主要的改良點在於新增了二個event。

1. 當有新粒子產生時可以收到一個通知,此時可以獲得這個新粒子的id,透過這個id可以取得粒子的user定義參數,利用把這個參數應用為粒子型別,我們就能夠根據型別產生不同類型的物件,再把這個物件和這個粒子關聯起來。

2. 當粒子即將被刪除時也能得到一個通知,此時我們就可以解除粒子和物件的關聯,或者連同物件一起刪除。

2009年11月4日星期三

播放聲音

加入聲音資源後,現在終於可以播放聲音了。聲音播放是透過Audiere來實作,這是我使用過最簡單易學的聲音模組,同時也因為它支援多種不同Device。

要可以播放聲音,主要有三件事情要實現。

1, 下載並編譯Audiere。如果直接從網路上下載預先編譯好的DLL,因為那已經是很舊的版本,似乎會有問題,所以必須自己透過SVN下載最新程式作編譯。
2, 以Audiere實作抽象的聲音介面,good RunTime只會透過這個介面來播放聲音。
3, 實作Lua聲音API。

這樣子就能夠在Script內使用聲音API來播放聲音資源了!

2009年10月28日星期三

新增Good.CallPackage

新增一條新的API,Good.CallPackage,

Good.CallPackage和Goodl.PlayPackage的功能都是呼叫外部的專案,使用方式一模一樣,差別只在於PlayPackage呼叫了之後就不會再返回原來的專案程序,而CallPackage則會在被呼叫的專案結束之後,自動再返回原來呼叫的專案. 見下圖便能明白。

PlayPackage
A --------------> B ---> 直接結束

CallPackage
A ---------------> B ----> A (返回原呼叫者)

2009年10月26日星期一

自動解壓縮程式原理

許多朋友來信詢問關於編輯器CreateExecutable的運作原理,所以這篇文章就來講講背後的技術原理。

底下提供一個簡單的方法,也是編輯器使用的方法,而這個方法只能適用在Windows作業系統,因為它使用了Windows系統的資源機制。Windows提供了一系列的API可以讓你對PE執行檔內的程式資源作存取。利用這點,只要我們作點變化稍加利用就能夠達到我們的需求。

+ + +

先說明good編輯器產生獨立的單一可執行檔的操作過程。

1,開啟舊專案
2,執行選單Project->Create Executable
3,選擇輸出目標
4,按下儲存

整個動作完成後,會產生一個不必編輯器就可以獨立執行遊戲執行檔。其實這個動作就相當於,編輯器會幫你產生一個內建了遊戲資源的播放器(Player)。

那麼這個播放器是從那來的?答案是它是事先建立好,然後被藏在編輯器裡。當使用者執行了Create Executable操作時,編輯器會從自己身上取出這個Player,然後再把專案所有相關資源,當成資料又全塞到Player裡,全部掺在一起打包成一個獨立的執行檔。當執行這個執行檔時,Player會先從自己身上找到遊戲資源,解開,載入遊戲,然後開始執行。

要完成上述的功能,主要有二件事情。第一就是如何把資料藏到執行檔內,第二就是載入藏在執行檔內的資料,以下分別說明。

+ + +

在VS.NET裡執行Add Resource功能時可以選擇要加入的資源類型,這些類型是Windows預設的,例如Bitmap/Cursor/Dialog/Menu/String Table等等。假如要加入的不是內建的資源類型,你也能在AddResource對話盒點選Custom鈕加入自訂資源。自訂資源用一個自訂的字串來作區別,例如"GameData"。如下圖所示,加入了一個"TEST"類型的資源,ID是IDR_TEST1,對應到外部檔案res\test1.bin。

以上是用工具的方式來加入自訂資源,只要是能夠編輯程式資源的工具都能拿來應用,而不限只能用VS.NET。接著我們來看怎麼用程式來加入資源。

Windows提供了BeginUpdateResource, UpdateResource EndUpdateResource三個API來讓我們修改資源的內容。
HANDLE hExe = BeginUpdateResource(exename, FALSE);

UpdateResource(hExe, _T("TEST"), (LPCTSTR)IDR_TEST1,
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (VOID*)lpData, szData);

EndUpdateResource(hExe, FALSE);
首先呼叫BeginUpdateResource開啟準備要更新內部資源的執行檔,接著呼叫UpdateResource來更新或加入指定類型及ID的資源項目,最後結束後再呼叫EndUpdataResource關閉程式。

+ + +

自動解壓縮程式執行起來後,主要要作的事情就是在自己內部搜尋並載入資源。

首先以FindResourceEx來搜尋指定類型和ID的資源,找到後再以LoadResource來載入資源,最後再以LockResource取得指向載入的資源資料的記憶體指標,並以SizeofResource取得這塊資源的大小,然後就能作讀取的操作,剩下來的部份就是程式怎麼去處理這塊記憶體的工作了。底下是個簡單的範例。
HRSRC hTest = FindResourceEx(hInst, _T("TEST"), (LPCTSTR)IDR_TEST1,
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));

int len = SizeofResource(hInst, hTest);
HGLOBAL lpres = LoadResource(hInst, hTest);

char const* pDat = (char const*)LockResource(lpres);


+ + +

如此,知道怎麼存取程式資源後,就能應用來製作出像zip那樣的自動解壓縮程式了。

2009年10月25日星期日

打磚塊

沒有使用任何資源,使用純色塊編輯了一個陽春版的打磚塊小遊戲。