跳到主要內容

發表文章

WTL簡介

good Game Editor的視窗編輯器是以WTL作為框架實作的,因為WTL的資料非常稀少,本文就針對WTL作個簡單的入門介紹。 歷史背景 ATL(Active Template Library,或者ActiveX Template Library ) ,它本來的目的是為了要讓COM元件以及ActiveX元件的撰寫變得更容易。因為ATL是拿來寫COM元件的,所以它只有幾個非常基本的GUI類別,相當於MFC的CWnd和CDialog。 很幸運的是,這幾個 GUI類別有很足夠的彈性可以讓像WTL這樣的東西架構在它之上。 WTL實際上是ATL的一組擴充,它也和ATL一樣都是以C++ Template寫成。它擁有許多像MFC的強大GUI類別所提供的能力,同時還能編譯出更小的執行檔。如果你學習過 MFC的程式設計,那麼你會很習慣於像MFC那樣的元件包裝還有很彈性訊息處理機制,也就是說你會比較容易進入WTL的世界。 WTL有二個主要的修訂版本,版本3及7。版本的號碼對應到ATL的版本號碼,這也是為什麼不叫作版本1及2。一直到版本7.1之後微軟將WTL變成一個開源碼的專案,寄駐在Sourceforge上,而目前最新的版本已到8.1。 安裝 你可以在底下的位址下載到最新版本( http://sourceforge.net/projects/wtl/ ),目前最新的版本是8.1版,而good是使用8.0版本製作。在網站上提供了exe版的自解壓縮檔和zip格式的檔案。下載下來後,解壓縮到電腦上任意的位置。 解壓縮後,AppWiz、AppWizCE 和 AppWizMobile 三個資料夾,提供了以 Java Script撰寫成的針對不同版本Visual Studio的安裝程式。根據自己電腦上安裝的 VS.NET 版本,選擇對應的安裝程式來自動安裝 WTL 精靈到你的VS.NET資料夾。Samples資料夾裡有一些有趣的教學範例程式,有興趣的話可以自行研究看看。 因為WTL完全是以C++ Template實作,所以只有C++ Header檔,不需要任何Lib檔,所以我們只需要把include資料夾的位置加到自己專案的搜尋路徑裡就完成了安裝。因為 WTL可以是個通用的模組,所以一般來說我會選擇把它加入到全域的搜尋路徑裡,這樣就不必每個專案都新增一次搜尋路徑。 以 Visual Stud...

(E)BNF表示式

BNF(Backus-Naur Form)是由John Backus所開發,可用來表示與上下文無關文法的語言,也就是一種用來描述語言的中繼語言(meta-language)。一個BNF表示式是由一個非終端符號(non-terminal)和它的產生式所組成,產生式可以是一個終端符號(terminal)和非終端符號組成的序列。(終端符號中的標點符號一般使用單引號括起來,而字串則使用雙引號) 底下為一個簡單的範例: sent := subj verb '.' subj := “Birds” verb := “sing” 在上面的例子裡面,如Birds、sing及句點('.')表示終端符號。而sent及verb表示為非終端符號。這條BNF句子定義了一條文法,表示的意思為,一個sent是由subj及verb再以一個句點為結尾所構成。 BNF表示式有以下幾種主要表示形式: (1) S := A B C (2) S := A | B | C (3) S := {A} 第一條表示說,S是由ABC三個符號所定義, 而ABC是以序列的形式依序出現,也就是說A之後一定跟著一個B,而B之後一定跟著一個C。第二條表示說,由S可推導出A或B或C其中之一。第三條表示說,由S可以推導出一個或多個A。 範例: S := x A A := y | z (1) xy (O) (2) xz (O) (3) xx (X) (4) yz (X) 以上4個範例中,只有(1)(2)是符合上面BNF文法定義的句子,因為x之後只能接y或z所以(3)不符合文法,因為S只能以x開頭為句子所以(4)也文法錯誤。 範例: id := alpha {alpha} alpha := a | b | c | d (1) aabbbcdd (O) (2) cabbbda (O) (3) baccab (O) (4) bdax (X) (5) 5acd (X) 在上面的5個範例裡面,其中(1)(2)(3)項是正確符合上面BNF的文法定義。而(4)因為alpha裡不包含x符號所以語法不正確。而(5)因為alpha裡面不包含5所以也不正確。 範例: S := '-' FN | FN FN := DL | DL '.' DL DL ...

特訓99稱號

以前在 網站 上擺過後來移除,現在再把它放在這。這是玩了N次收集到的,純脆是個人收藏,只是不知道還有沒有沒收錄到的...

踩地雷

新增一個簡單的範例:踩地雷。 下載

實驗中國象棋 for WM/PPC

每一年不管是新作或改版我至少要製作一個小遊戲,放在 我的網站 上公開免費下載,一般都在元旦的時候釋出。 今年開放的是實驗中國象棋 WindowsMobile/PocketPC版,目前已公開過Symbian版,而這也是我第一次公開 WindowsMobile/PocketPC上的小遊戲。 下載 這個版本是使用我最新的PC版核心來作移植,不過PC版是只供個人使用,沒打算開放。放張圖看看就好。

good基礎教學

這篇文章要來一步步製作一個彈跳球的範例,完成後相信對good會有一個基本的認識。 ; 1, 首先打開good編輯器,這時專案是空白的,按下Ctrl+S將空白專案儲存為bounceball.txt。 2, 接著在工具列上點擊NewTexture或選單Project->NewTexture加入用來作為彈跳球的face.png。 會使用png格式的圖檔的目的是,因為我們這張圖會用到鏤空效果,png格式可以帶alpha,我們可以很容易利用png的alpha來作alpha鏤空。 * 所有會使用到的圖形,我們都需要以加入貼圖的方式事先加入到good專案內才能夠使用。 3, 再用同樣的方式加入一張準備用來作為背景的圖形lace_0103.gif。 到此先按Ctrl+S存檔。(隨時存檔是個需要養成的好習慣) 4, 接下來在工具列上點擊NewSprite或選單Project->NewSprite加入一個精靈。一般在遊戲中,在畫面上會動的人物怪物等等我們把它叫作精靈(Sprite)物件,以我們要製作的範例來說,我們現在要建立一個表示彈跳球的精靈。 我們前面共加入了二張圖,要用來作為彈跳球的圖是tex1,這個名稱我們也可以在加入圖形時自己命名。這張圖的大小是107x107,所以我們在TileWidth/Height上填入了107和107,表示要使用整張圖。同時我們在name欄位自己填入了ball這個名字,當然也可以像加入圖形時保留空白,讓編輯器為我們自動加上名字。 完成後要加入一個空白的精靈,我們需要加入影格才能在畫面上顯示東西。因為我們已經事先設定好要使用整個圖形的大小,所以可以看到在右下角的貼圖檢視區上選取了整張的圖(透明紅色),接著按下貼圖上方的新增影格鈕加入影格。這樣就完成了精靈的設定,再按下Ctrl+S存檔。 5, 接下來在工具列上點擊NewLevel或選單Project->NewLevel新增一個空白關卡,準備來建立我們的遊戲場景。 good的關卡是我們實際執行遊戲時會呈現在畫面上的東西,我們可以建立很多不同的關卡,但同一時間只會有一個正在執行。我們可以在關卡上擺放各種物件,像是背景地圖或精靈等等,這些物件在關卡執行時都會顯示在畫面上。 首先我們加入一個背景圖,在關卡編輯器上方的工具列點擊NewTextureBg選擇tex2也就是我們事先加入的背景貼圖,完成...

Stge基礎教學

這篇文章作為stge script的入門教學,會告訴你如何撰寫stge script來描述簡單的彈幕效果並整合到good裡,透過good的顯示功能呈現到畫面上。要補充說明的是,雖然stge script最初是為了射擊遊戲而設計的,但因為它也有基本足夠的彈性,所以也能夠作為粒子效果來應用。 ; 1, 首先打開good Game Editor,按下Ctrl+S儲存空白專案,命名為StgeTest1.txt。 2, 接著在工具列上點擊新增空白關卡(New Level),或點擊選單Project->New Level...加入空白關卡。 3, 在新關卡(level1)的屬性檢視器上的ClearColor,開啟顏色選擇對話盒並設定成黑色。 4, 在工具列上點擊新增空白腳本(New Script),或點擊選單Project->New Script...加入空白腳本,檔案名稱填StgeTest1.lua。 5, 在資源樹上點擊level1回到空白關卡1的屬性檢視器,在Script欄位上填入Level。 6, 按下Ctrl+S儲存檔案。 現在已建立基本的資源,接下來全部使用script來建立我們要的功能。首先撰寫一些good script作出基本框架。 Level= {} Level.OnCreate = function(param)   Stge.RunScript('StgeTest1') end Level.OnNewParticle = function(param, particle)   local obj = Good.GenObj(-1, -1)   Good.SetDim(obj, 0,0, 3, 3)   Good.SetBgColor(obj, 0xffff0000)   Stge.BindParticle(particle, obj) end Level.OnKillParticle = function(param, particle)   Good.KillObj(Stge.GetParticleBind(particle)) end 如上,我們有個叫作Level的table,並加入了三個空白的function,這三個function是...