Saturday, July 29, 2006

OGRE3D的麻煩

看著這個題目,大家也可能想到一二吧,對了,大家還記得上回我講及有關 OGRE3D,和 Ngan-GINE'3D 中的地圖資料互換,初時還以為解決了,但後來我發現,在 OGRE3D 的 Log 中,有一堆 Warning 投訴手動 Load 入資料,沒有 Manual Loader。我才知道,要自己 Load 入資料,是要自己做個 Loader,以便當 OGRE3D 丟失資料時,可以作為 Reload 用。在努力了數個晚上後,今晚終於搞好了這個 Loader,但最有趣的是,我不太清楚這個 Loader 是否起作用......

做好上面的 Manual Loader 後,就準備做第二樣了,我選擇做 Billboard,但看來又是另一個麻煩了,因為我再次搞不清楚 OGRE3D 中,Billboard 及 BillboardSet 的分別。OGRE3D 雖然強大,但處處都是令人卻步的難關,究竟有沒有一個 3D Render Engine,是比較簡單易明的呢?

Tuesday, July 25, 2006

遊戲的未來

今天在偶然下,再看到這篇舊文章:

The Future of Game Design

當中筆者所說到的要點,每每都一針見血,在第一頁的尾段,就有一句很精彩的,是 Naughty Dog 總裁 Jason Ruben 說的:the amount of polygons you have on screen doesn't matter anymore, it's what's you do with them. ( 在畫面上多邊形數量已不再重要,重要的是你用它們來做甚麼 )

再看上面的一句說話,仍然是獲益良多。我玩遊戲的時候,一般都不會著意畫面的質數,只要不是過份醜陋,遊戲本身好玩就可以。但還看過去幾年玩過的遊戲,有很多都沒有玩完,有些甚至玩過一、兩個 Stage 就放棄了。究竟是為什麼呢?有些平平無奇,有些難度太高,有些過於簡單而重複。回想近年來,Nintendo 仍然是堅持以創意先行,真的是值得敬佩的遊戲商。

Saturday, July 22, 2006

OGRE3D 和 地圖資料 #2

Lightmap Level Stage 經過數日的努力(?),成功將 Ngan-GINE'3D 用的地圖資料,以手動建立 Mesh 形式在 OGRE3D 內顯示,而且還可以有 Multi-Texturing ( 用於 Lightmap 效果 )。在這次實作中,明白了OGRE3D 的手動建立 Mesh 的流程,這個其實是屬於基本技巧,不懂這個便不能善用一個圖像系統了。

另外在這次實作中,將原本不是以 Singleton 形式設計的 Ngan-GINE'3D,轉為以 Singleton 形式套好(其實不是真正的 Singleton,只是形式上設計相同),但有趣的事情發生了,我做的一個測試程式中,速度增加了 15% 之多,究竟是不是 Singleton 設計的一種好處呢?

Sunday, July 16, 2006

OGRE3D 和 地圖資料

在近期,研究將 OGRE3D 加入 Ngan-GINE'3D 內的時候,碰到一個問題,就是原本 Ngan-GINE'3D 內的 3D 地圖資料,不知應該怎樣在 OGRE3D 內存取及運用,因為在 Ngan-GINE'3D 內的地圖資料,是以 Sector 來分開儲存,而我希望在 OGRE3D 內建立差不多的架構,所以就想了很久要怎樣才做到。但近日有點頭緒了,就是用 OGRE3D 內的 StaticGeometry 架構來實現。但是這個概念還要進一步實驗,因為始終是一個概念,要寫一點程式來實際調試一下才可。

在研究這個 OGRE3D 的時候,學會了如何 Debug DLL 的技巧,因為我不是用 Visual C++ 來編寫遊戲的,但是要用 OGRE3D 的話便要用 VC++,所以我要將 OGRE3D 封裝成一個 DLL,再給我常用的 PellesC 來使用,這樣一來便需要學會如何 Debug DLL 了。之前我一直都沒有做過 DLL,在這次經驗中我發現,其實 Debug DLL 也很有趣的呢,而且有個意想不到的,就是 Visual C++ 2005 Express 版本的功能真的很齊全呢。

Thursday, July 13, 2006

Shooting Game

我常常說我很喜歡玩 Action Game,其實我亦很喜歡玩 Shooting Game 的,當年曾經常常玩IREM 的 games,當中有「Image Fight」及「R-Type」系列。後來就很喜愛Treasure的遊戲,當中不小名作,如「GunStar Hero」、「Radian Silvergun」及「班鳩」。除了這類正統的橫/豎Scroll 的Shooting game 外,我亦很喜歡 SEGA 的「Panzer Dragoon」系列。

Panzer Dragoon Orta我曾經做過一個ArcBall Rotation Camera 的實驗,是用了個非算術的方法做出來。前幾天看著這個 ArcBall 控制時,忽發奇想,我以「Spikeout」作為參考做了個「Final Spike」,其實也可以以「Panzer Dragoon」作為參考,做個類似的遊戲也不錯啊(PC 也極小這類遊戲)!自從幾年前看過XBox版的「Panzer Dragoon Orta」之後,確實非常難忘,當中的遊戲性非常高,而整個遊戲的演出亦非常精彩,完成度超級好,參考價值很高。

Wednesday, July 12, 2006

Indie Game要甚麼?

大家可能會記得,我曾經說過想做個Indie Game Developer,亦看過有關資料。其實環顧各地的Indie Game Developer,大都是做些小型遊戲,而且最多的可以說是Puzzle Game(3-Match),例如類似 Bejeweled 的遊戲。剛才在 GameProducer 裡看到一篇短文,它的題目很吸引:

3 Reasons to Avoid Developing 3-Match Games

我並不是要踩這類遊戲,而是認同上文中所說的三個理由,Indie類遊戲確是要求創意。

另外 10 Easy Ways to Save MoneyLearn to Steal 亦很受用。

Saturday, July 08, 2006

HIMMG vol.02

上一回我說過,要說說在製作那個「Final Spike」實驗版本的過程中,所學到的東西。那時候的「Ngan-GINE'3D」還未成熟,有很多功能都沒有,而當時的我對3D遊戲製作亦不太熟悉,就想:不如先做個遊戲吧,那便會知道要加甚麼功能進Ngan-GINE'3D;就這樣,我便開始去想要做個怎麼樣的3D遊戲了。

Skeleton Animation in Ngan-GINE'3D在開始製作遊戲時,我不知從何入手,那我就想:不如和做2D遊戲時一樣,在控制主角上開始著手吧;就這樣,我便開始在控制角色上開始。在Ngan-GINE'3D中,我已經有Skeleton Animation了,心想那就易辦了,只要按甚麼鍵,播放Animation之餘,再移動角色便可。雖然方向是正確的,但問題出現了,Skeleton Animation的控制一塌糊塗,用MS3D export出來的Animation,是一連串的包含所有Animation,我卻沒法隨意控制播放那一段。大問題出現了,應該要怎樣解決呢?我再詳細地看看,發現一個情況,原本MS3D資料內有30格Animation,當中有15格是屬於Keyframe的,而export出來的資料卻只有15格,不是原來30格。那麼我便明白了,export出來的只有Keyframe,Keyframe之間的格數是不會被export出來的,那就好辦。我將原來的MS3D的Animation,刪去沒有Keyframe的格數,只保留Keyframe格數,那麼Animation總數和Keyframe總數一樣,只有15格。就這樣我便成功地,以Animation的Frame數值來隨意播放任何一段的Animation了。

播放Animation解決了,那便繼續嘗試做遊戲。有一天和朋友逛街,在看一些新的Console遊戲,那個朋友說:為何電腦沒有這類動作遊戲?那時候我便想:沒錯,電腦上確是沒有Console中的動作類遊戲出現,那我便決定要做個動作遊戲出來了。及後我發現另一個問題,就是:我要如何做出角色擊出左拳,敵人被左拳擊中呢?因為自己之前都做過些低水平2D遊戲,知道應該以圓對圓的碰撞測試(Sphere to Sphere collision)來調試,但首要任務,是要得知「左拳的位置」。這個就是難度,我不懂如果計算出來,我只知道可以用Skeleton中,Joint 的Position位置計算,但究竟要怎樣才得到那個位置呢?這個問題困擾了一個多星期,最後在網上搜出相關文章,再對程式調試良久,才成功得到Joint 的World position,成功做出擊出及被擊中的效果。

就這樣,Ngan-GINE'3D中的Skeleton Animation,便有了任意播放某一段Animation,及取得某個Joint 的World position功能。下一回,說說另一個話題吧,說說3D地圖及移動Object 的碰撞問題。

Wednesday, July 05, 2006

Metal Slug (3D)

不知道大家有沒有玩過,新的Metal Slug?我有,但我想說的是,有時候,名氣確實是可以蓋過很多問題。其實新的Metal Slug並不好玩,不好玩的並不是遊戲本身,而且那個不知做甚麼的鏡頭系統,我感覺就好像被它玩一樣,令我超級頭痛。

先說說遊戲本身,開發商極力想將經典2D的Metal Slug,毫不改動玩法下,轉為3D,我覺得開發商是做得不錯的了。很多操控上,已經很努力去做,感覺上已經不錯,但是很可惜,遊戲最後卻被惱人的鏡頭系統破壞了。遊戲中的鏡頭系統,Player行左時,鏡頭同時向右Plan,令人感覺移動速度過快(我好頭暈)。另外鏡頭經常被牆壁阻礙,碰到牆壁後鏡頭會向上移動,嘗試換角度,但這樣做的話,有時候令玩家不能看到目標或敵人(鏡頭向上移,但注視點仍是主角,最後令畫面看到的只是地面...),不能作戰。在3D場景中,到處都有不少的雜物,及一些地圖細節部份,又是另一個令人懊惱的問題,如果有件雜物高過主角,而又剛剛在鏡頭及主角中間,那件雜物經然不會變成半透明,玩家就不能夠看到主角了。

好像只有彈,沒有讚的...... 我也不想的,只是想洩洩氣,一隻簡單的遊戲,就是被一個毫不起眼,但是很重要的鏡頭部份弄垮,有點惋惜。(順帶一提,遊戲場景的"簡陋"程度也不錯......)

Saturday, July 01, 2006

HIMMG vol.01

Final Spike Poster (experimental version)究竟這是甚麼題目?「HIMMG」?讓我來慢慢解釋吧。兩個月前,我將我自己製作經年的電腦遊戲,「Final Spike」的一段Teaser Trailer發報,得到了不少正 面的回應,亦有網友希望我說說我在製作遊戲時的難題,或一些製作上的技巧,在我想了一陣子後,我決定寫出一個Blog系列,來說說我製作電腦遊戲的一些事 ,我訂出了這個系列的題目,就叫做「How I Make My Game」。

今次是第一篇,我會先說說,我的Game Engine「Ngan-GINE'3D」。在Ngan-GINE'3D的初期,我已經決定要做一個,以製作動作遊戲為本的Game Engine。首先要 做的,使要學習用Direct3D,因為那時候我接觸了3D圖像編程沒多久,要學習如何做一個Engine,那就要選個API/SDK吧。在了解Direct3D是如何畫出多邊形後, 便開始嘗試做個最基層的系統,我稱之為「Frame」。在Ngan-GINE'3D中,是沒有任何所謂Scene Management,而最基層的,就是這個Frame了。

Frame系統中的成員,都是最基本的,例如Position、Rotation、Local Matrix... 等等。而Function方面,會包含了Translate、Rotate、Update、 Transform... 等等。當然,Frame也會有建立及移除 Function了,在建立的時候,會放進一個作為分類的資料,以便認知這個Frame是用來做甚麼的(在Ngan-GINE'3D中,暫時只有角色及Camera類別)。在Frame系統完全後,便開始做3D Model的繪畫了,那時候對3D圖像認識淺,就找來Quake的MD2檔案來玩玩,到了明白當中的運作後,就開始找個3D Modeler來用了。在不記得 甚麼情況下,得知了MilkShape3D的存在,更有內建Skeleton Animation,而且還可以自己做Export Plugin等,便開始研究MS3D了。

用了很多時間來研究MS3D,始終自己的數學水平比較弱,用了數個月才學好了MS3D及Export出自己的檔案類型。同時我亦將MS3D中的Skeleton Animation,分拆 出來加到了Frame系統中,作為Frame內的成員之一。在學習MS3D期間,同時亦學會了靜態的3D Model繪畫,但其與動態3D Model有之後再用了數個月的時間,加進了繪製靜態3D Model。其後再用了數個月時間,想加進地圖資料和Frame系統的Collision Detection,但怎樣做也不理想,後來才知道最大原因是,因為Ngan-GINE'3D中沒有Scene Management,導致不能分割區域做出準確的Collision response,所以後來就放棄研究了,但始終一直不能找到好方法代替。在往後,更加入了Skybox、Billboard、2D Sprite... 等等。

在此期間,碰巧香港中文大學舉辦了一個遊戲創作比賽,我就用了這個Ngan-GINE'3D,做了個實驗版本的「Final Spike」參賽,可能是剛巧碰到SARS的爆發,參賽作品比較少,感覺有點僥倖地取得公開組別的銅獎。在下一次,我會說說在製作那個實驗版本的「Final Spike」時,所學到的東西如何改進Ngan-GINE'3D的功能。

Final Spike Title screen (experimental version) Final Spike in-game screen (experimental version)