在 2D 遊戲的時代,遊戲都是簡單的操控:十字掣移動,A按鈕是跳躍,B按鈕是攻擊;關卡設計也是簡單的,在設計上就是要你不停地做出指定動作,如果玩家做不到,只是他不夠熟練,一旦玩家熟練後就可以駕輕就熟地完成。Sprite 也是充滿想像空間的,因為記憶體不足的問題,背景或是人物的 Animation 往往都是有限的,但這種有限也給與了玩家的想像空間。整個遊戲除了給玩家遊玩之外,也做就了玩家的一些正面心智成長。
在現今 3D 遊戲設計的道路上,已經很難看到一些和以前 2D 相比的例子。曾經和同事們討論過,究竟為什麼會有這種情況出現?那些簡單但令人中毒很深的遊戲,現在的 3D 遊戲中真的很難找到些例子,究竟問題出在哪裡?有同事的意見是,我年齡增長了,見識和玩過的遊戲也增多了,在要求上變了,但是我卻不太完全同意。
我喜愛玩的遊戲的模式,其實是很簡單的,我做的事情就是:攻擊 ( 連續攻擊 )、跳躍 ( 雙重跳 )、跳躍攻擊、抓住敵人再攻擊 ... 等等。加一點點攻擊或武器的強化工具,遊戲的進程速度爽快,變化慢慢增加 ( 不是難度 )。
想一想,玩遊戲就是想跳出現實,玩樂一會兒,但是歐美大型 3D 遊戲卻以「 真實 」作為賣點,在玩遊戲的時候要跳入另一個「( 偽 ) 真實環境」,究竟哪裡能帶來一些正面的心智成長?
相關網頁:
● Opinion: How Mega Man 9 Resembles… Real Life ?
● 那些洛克人教我們的事
Saturday, January 31, 2009
Wednesday, January 28, 2009
Retained 和 Immediate Mode 程式編寫
這幾天農曆新年假期,都沒有特別編寫程式,只是將 Ogng3D 由 Ogre 1.4.9 正式轉到 1.6.1。今天反而想說說一個程式編寫的念頭,就是 Retained 及 Immediate Mode 程式編寫的題目。
就電腦程式編寫方面,很多時都會看到 Retained Mode 的程式,例如 Windows 的程式就是最好的例子,每個程式都是以 Messages 及 Callback 形式執行,這樣的做的原因,在我的理解上,是要 De-couple 程式之間的關係,令程式與程式之間互相不需要倚賴,也能夠完成工作。但是 Immediate Mode 的程式就剛剛相反,程式在需要的時候直接地呼叫另一個程式來完成一個小工作,之間的倚賴性是很強的,如果分開了它們,程式便不能夠完成工作,甚至連 Compile 也不可以呢。
但是兩者之間,除了上面所說的編程風格外,還有甚麼其他分別呢?就我自己而言,是「難度」的分別:Retained Mode 比 Immediate Mode 困難。
在製作遊戲方面呢,會不會有特別的分別?有的,遊戲的設計及前期工作上,就是最主要的分別。以歐美及日本市場為例,歐美喜歡一邊製作同時一邊更新及改善遊戲設計 ( 更甚者會改變設計 ),而日本就很不一樣,很多時候一開始便已經有了遊戲的定案,製作上只要依設計定案完成便可。歐美的情況用 Retained Mode 就會比較好,因為程式設計都是分開的,遊戲設計需要改動的話,換個程式便可以 ( 但卻很花時間 )。後者就多以 Immediate Mode 製作了,因為遊戲設計是不會大改的,所以程式都不太需要重寫。
以上所說的,是以 Game Play 編程為背景,在 Game Engine 方面,其實是沒有特別設定了,為什麼呢?原因是製作 Game Play 的編程員,多是不需要理會 Game Engine 的架構,只要 Game Engine 方便使用,速度高便可以的了。
就電腦程式編寫方面,很多時都會看到 Retained Mode 的程式,例如 Windows 的程式就是最好的例子,每個程式都是以 Messages 及 Callback 形式執行,這樣的做的原因,在我的理解上,是要 De-couple 程式之間的關係,令程式與程式之間互相不需要倚賴,也能夠完成工作。但是 Immediate Mode 的程式就剛剛相反,程式在需要的時候直接地呼叫另一個程式來完成一個小工作,之間的倚賴性是很強的,如果分開了它們,程式便不能夠完成工作,甚至連 Compile 也不可以呢。
但是兩者之間,除了上面所說的編程風格外,還有甚麼其他分別呢?就我自己而言,是「難度」的分別:Retained Mode 比 Immediate Mode 困難。
在製作遊戲方面呢,會不會有特別的分別?有的,遊戲的設計及前期工作上,就是最主要的分別。以歐美及日本市場為例,歐美喜歡一邊製作同時一邊更新及改善遊戲設計 ( 更甚者會改變設計 ),而日本就很不一樣,很多時候一開始便已經有了遊戲的定案,製作上只要依設計定案完成便可。歐美的情況用 Retained Mode 就會比較好,因為程式設計都是分開的,遊戲設計需要改動的話,換個程式便可以 ( 但卻很花時間 )。後者就多以 Immediate Mode 製作了,因為遊戲設計是不會大改的,所以程式都不太需要重寫。
以上所說的,是以 Game Play 編程為背景,在 Game Engine 方面,其實是沒有特別設定了,為什麼呢?原因是製作 Game Play 的編程員,多是不需要理會 Game Engine 的架構,只要 Game Engine 方便使用,速度高便可以的了。
Sunday, January 25, 2009
Saturday, January 10, 2009
Network 遊戲的學習進展
上週末努力試過使用 network library,成功地將兩部 PC 連上了 ( 只是以 LAN 形式 ),這幾天用了點時間,繼續在嘗試。
這一次我在一部 PC 上,運行兩個單一 Program 來完成連線 ( 這個太普通了吧 ... )。然後便嘗試在一個遊戲軟件中,實現 P2P 的連線遊玩,其實我的目標是,先製作一個簡單的「一對一」連線遊戲。
流程大致完成了,現在的情況會是:
● 進入 Splash Screen 及 Main Menu 畫面
● 選擇 Connect to ( Client ) 或 Start Host ( Server )
● 進入 Game Room 畫面:
○ Client 需要玩家輸入 Host 的 IP 或名字
○ Server 只需等待另一玩家連線
● 成功連線後,Server 回傳訊息確認連線
● 確認後,Server / Client 同時進入 Game Play
在 Game Play 中的資料傳送方面,使用了一個 Timer 加入 Callback 控制,定時傳送 / 接收資料,因為都是以 Local Host / LAN 作為試驗,所以更新資料次數可以來得比較多 ( 每秒十次或以上,packet size 為 29 byte )。Game Play 方面可說是最麻煩的,所以還未完成,現時只是成功進入 Game Play ,及傳送接收資料而已。
這一次我在一部 PC 上,運行兩個單一 Program 來完成連線 ( 這個太普通了吧 ... )。然後便嘗試在一個遊戲軟件中,實現 P2P 的連線遊玩,其實我的目標是,先製作一個簡單的「一對一」連線遊戲。
流程大致完成了,現在的情況會是:
● 進入 Splash Screen 及 Main Menu 畫面
● 選擇 Connect to ( Client ) 或 Start Host ( Server )
● 進入 Game Room 畫面:
○ Client 需要玩家輸入 Host 的 IP 或名字
○ Server 只需等待另一玩家連線
● 成功連線後,Server 回傳訊息確認連線
● 確認後,Server / Client 同時進入 Game Play
在 Game Play 中的資料傳送方面,使用了一個 Timer 加入 Callback 控制,定時傳送 / 接收資料,因為都是以 Local Host / LAN 作為試驗,所以更新資料次數可以來得比較多 ( 每秒十次或以上,packet size 為 29 byte )。Game Play 方面可說是最麻煩的,所以還未完成,現時只是成功進入 Game Play ,及傳送接收資料而已。
Thursday, January 08, 2009
我在用 C 編寫遊戲嗎 ?
有看過我的 Blog 的朋友都知道,我是很喜歡用 C Language 寫程式的,除了製作 Ogng3D 引擎是用 C++ 外,自己的遊戲或 Demo 都是用 C 編寫的。
前幾天正在用 C 編寫程式,來試驗 Network 連線時,突然有一點感受,就是我完全感覺不到自己在編寫 C 程式。那一刻的我覺得自己,就好像在編寫 Script 程式一樣,感覺很神奇。為什麼會有這種感覺呢?後來我想了一天,終於想到了,就是因為我在用 C 寫遊戲時,已經不需要再考慮遊戲引擎的問題,可以很專注地對付 Game Play 的程式設計。
雖然 Ogng3D 引擎是用 OGRE 及 C++ 製作,但是在設計上,已經不需要直接使用 OGRE 的任何部件,而且引擎是用 C 及 DLL 做接口,基本上用任何程式語言也可以使用。就好像一些遊戲引擎支援 Python 或 LUA 一樣,製作遊戲的人員是不需要理會遊戲引擎內部運作,可以專注地製作遊戲內容。
現在的我,可以用一句經典說話形容:
「 Write Games, Not Engines ! 」
那當然了,若果在引擎方面真的需要新功能,才能夠完成某些工作的,加強 Ogng3D 還是免不了的。

雖然 Ogng3D 引擎是用 OGRE 及 C++ 製作,但是在設計上,已經不需要直接使用 OGRE 的任何部件,而且引擎是用 C 及 DLL 做接口,基本上用任何程式語言也可以使用。就好像一些遊戲引擎支援 Python 或 LUA 一樣,製作遊戲的人員是不需要理會遊戲引擎內部運作,可以專注地製作遊戲內容。
現在的我,可以用一句經典說話形容:
「 Write Games, Not Engines ! 」
那當然了,若果在引擎方面真的需要新功能,才能夠完成某些工作的,加強 Ogng3D 還是免不了的。
Monday, January 05, 2009
Happy Net Year
在 2008 年,曾經將一個免費的 network library "ENet" 套入到 Ogng3D 中,那時候也是初接觸 network library 及程式編寫,但是並沒有再深入地研究下去。而這個沒有繼續的工作,在這兩天便投入了時間去繼續了。
ENet 是一個提供一種銜接層面的 network library,當中一些 network 中的管理還是要自己做的。在這兩天週末的時間,就是嘗試製作一些 network 資料的管理 Functions,例如:起動 Server、起動 Client、那個 Client 已連接上 Server 及 Server / Client 之間的資料傳送。其中最令我煩惱的,可以說是 memory 管理,因為在 network 之間的資料傳送,通常都是很嚴格的,最好沒有一個 Byte 是浪費的。而且 ENet 只是一個銜接層,沒有限制使用哪種方案,就是說用家要自訂 Protocol 及 Data 等資料型態,這些都是我的弱項,到了剛才 ( 踏入零晨時分 ) 才可以說是暫時測試完成。
Network 程式編寫確實是很煩瑣,為什麼會這樣的呢?
祝大家 2009 年比 2008 年更開心、更健康。
ENet 是一個提供一種銜接層面的 network library,當中一些 network 中的管理還是要自己做的。在這兩天週末的時間,就是嘗試製作一些 network 資料的管理 Functions,例如:起動 Server、起動 Client、那個 Client 已連接上 Server 及 Server / Client 之間的資料傳送。其中最令我煩惱的,可以說是 memory 管理,因為在 network 之間的資料傳送,通常都是很嚴格的,最好沒有一個 Byte 是浪費的。而且 ENet 只是一個銜接層,沒有限制使用哪種方案,就是說用家要自訂 Protocol 及 Data 等資料型態,這些都是我的弱項,到了剛才 ( 踏入零晨時分 ) 才可以說是暫時測試完成。
Network 程式編寫確實是很煩瑣,為什麼會這樣的呢?
祝大家 2009 年比 2008 年更開心、更健康。
Sunday, December 28, 2008
Technical Artist ?
大家有沒有看過這個職銜呢?Technical Artist,中文直譯的就是「 技術美術員 」,那究竟這個職位是做甚麼的呢?
在兩年前,認識了一位在美國遊戲業工作的人員,他的職銜就是 Technical Artist。雖然說是 Artist,但是他卻一點畫作也不懂,他每每也會開動 MAYA 來做一些測試,他曾經說過,他的工作是非常困難和獨特的,那時候有點令我摸不著頭腦。昨天我在閱讀一本有關遊戲製作的雜誌,其中一篇文章講述了這個職位的工作範疇。
在那文章初,說了一個有趣的情況:製作遊戲時,Artist 都會向 Programmer 要求工具支援,過一會兒後,Artist 就會收到 Programmer 做好的工具,但是對 Artist 來說,這些工具都是不容易使用的。另外在製作後期,因為 Artist 做出來的東西,令遊戲運行速度表現差,Artist 和 Programmer 在這時候又會開始一場拉鋸戰了。
Technical Artist 的職位就在這個情況下出現的了。在遊戲製作整個過程中,不斷在 Artist 及 Programmer 中周旋,抓取一個在他們之間的平衡點,不失遊戲的運行速度,而又可達到 Artist 要求的效果,並與以執行。
我所閱讀的雜誌:程序員 遊戲創造 ( 2008 年 12 月下 )
在兩年前,認識了一位在美國遊戲業工作的人員,他的職銜就是 Technical Artist。雖然說是 Artist,但是他卻一點畫作也不懂,他每每也會開動 MAYA 來做一些測試,他曾經說過,他的工作是非常困難和獨特的,那時候有點令我摸不著頭腦。昨天我在閱讀一本有關遊戲製作的雜誌,其中一篇文章講述了這個職位的工作範疇。
在那文章初,說了一個有趣的情況:製作遊戲時,Artist 都會向 Programmer 要求工具支援,過一會兒後,Artist 就會收到 Programmer 做好的工具,但是對 Artist 來說,這些工具都是不容易使用的。另外在製作後期,因為 Artist 做出來的東西,令遊戲運行速度表現差,Artist 和 Programmer 在這時候又會開始一場拉鋸戰了。
Technical Artist 的職位就在這個情況下出現的了。在遊戲製作整個過程中,不斷在 Artist 及 Programmer 中周旋,抓取一個在他們之間的平衡點,不失遊戲的運行速度,而又可達到 Artist 要求的效果,並與以執行。
我所閱讀的雜誌:程序員 遊戲創造 ( 2008 年 12 月下 )
Monday, December 15, 2008
IMGUI
在 2008 年期間,因為要做製作遊戲的工具,所以接觸了很多有關 Win32 API 的資料,它雖然很強大,但在實際製作工具的時候,仍覺得它頗為麻煩的,常常要處理一些 Message,而且沒有一個好用的 GUI Design 工具 ( 或是可以自訂 Skin 的工具 ),對我來說寫這類 Program 時感覺就是不太順暢。
今天閒來在 Web Surfing 時候,發現了一個 GUI 的 Concept:「 IMGUI 」( Immediate-Mode Graphical User Interfaces ),看了一些簡介之後,頓時發覺這個就是我想做的東西,所以便開始看多一點這方面的資料。IMGUI 很簡單,不需要處理煩瑣的 Messages 及 States,只需要處理 UI Context 及 Widgets 便可以。在數個月前我確實想過類似的東西,只是在開始上出了點問題未能解決而放下了,那時候還未得知這個 IMGUI 的存在。
這個 IMGUI 方案,我覺得很適合在遊戲製作上使用,而下是幾個有關這個方案的資料:
p.s. 其實可能很多 GUI 的方案都是使用這個 Concept 的,只是沒有說明罷了,而上面的資料卻引起了我的輕趣及注目呢,而且 ... IMGUI 的設計上是 Anti-OOP 的,我喜歡! :D :D

這個 IMGUI 方案,我覺得很適合在遊戲製作上使用,而下是幾個有關這個方案的資料:
p.s. 其實可能很多 GUI 的方案都是使用這個 Concept 的,只是沒有說明罷了,而上面的資料卻引起了我的輕趣及注目呢,而且 ... IMGUI 的設計上是 Anti-OOP 的,我喜歡! :D :D
Saturday, December 13, 2008
聖誕節的願望
在 2008 年期間,有個遊戲一直都想玩的,但是因為日本的保護主意 ( 我覺得是我國某些 Online game 玩家的行為引致的 ),令我不能正常地體驗,那遊戲就是熱烈的「 Monster Hunter Frontier 」( PC 版本的 Monster Hunter )。能夠玩到這遊戲,可能是我在今年聖誕節中的願望。
從未試過有一隻 online game 是可以「如此」吸引我的,以前曾經覺得「 Phantasy Star Online 」是好玩的,但 Monster Hunter 的 Action 度卻是比 PSO 高很多。以往曾玩過 PS2 版本的 Monster Hunter,但那時候未有 Online 或合作模式版本,所以覺得不太好玩,但有了 Online 及合作模式後卻變得吸引我了。
以前曾經想在家中,能夠玩到類似「 SpikeOut 」的遊戲,但 SEGA 一直都沒有移值這遊戲到 Console 機或電腦上 ( 很多年後才在 XBox 上出現 ),所以我才搞一個「 Final Spike 」出來給自己玩。那麼我可能要自己搞一個叫做「 Behemoth Slayer 」,來滿足自己對 Monster Hunter 的興趣了。
從未試過有一隻 online game 是可以「如此」吸引我的,以前曾經覺得「 Phantasy Star Online 」是好玩的,但 Monster Hunter 的 Action 度卻是比 PSO 高很多。以往曾玩過 PS2 版本的 Monster Hunter,但那時候未有 Online 或合作模式版本,所以覺得不太好玩,但有了 Online 及合作模式後卻變得吸引我了。
以前曾經想在家中,能夠玩到類似「 SpikeOut 」的遊戲,但 SEGA 一直都沒有移值這遊戲到 Console 機或電腦上 ( 很多年後才在 XBox 上出現 ),所以我才搞一個「 Final Spike 」出來給自己玩。那麼我可能要自己搞一個叫做「 Behemoth Slayer 」,來滿足自己對 Monster Hunter 的興趣了。
Friday, December 05, 2008
工具製作,2008 回顧
一年容易又到年尾了,在今年年初時,決意要製作一些遊戲製作工具,在這裡要回看一下,究竟做了些甚麼出來。
Material Editor (1) (2)
雖然 OGRE 有一個很不錯的資源管理系統,但要用於製作工具時卻是非常困難的,而 Material 的管理是其中的致命傷。因為那個 Material 是以一個 Script 來儲存的,要製作好一個 Material script 和觀察它在 OGRE 中的表現是頗為困難的。這個工具可以製作一些簡單的 Material script,亦同時可以看到在 OGRE 中的表現。
Character Editor (1) (2) (3)
在 2007 年尾時開始接觸 Event / Data driven 的編程技術,從中學懂了一些相關的理念,所以就利用製作這工具的機會同時實踐 Event 系統。工具主要的功能是管理 Animation 的速度和 Event 的發放,這個工具只要配合 MilkShape3D Animation Splitter 工具及 OGRE Mesh Exporter 就能順利完成相關工作。
OLM MilkShape3D Plugin
這個是從朋友的 OLM ( Open Light Mapper ) 工具衍生出來的,因為覺得它的功能強大而且易用,所以便在一個短時間內,將我常用的 MilkShape3D 及 OLM 整合起來。
雖然只是製作了三個工具,但功能上絕對是紮實的,而且 Bugs 量更是極少 ( :-P )。其實在我的心目中,有一個工具一直都很想做的,就是一個類似 Scene Builder 的工具,之前在製作 OLM MilkShape3D Plugin 時學懂了一點東西,希望能夠在 MilkShape3D 中,完成類似的功能,而這個 Scene Builder,可能是最後一個需要製作的工具呢。

雖然 OGRE 有一個很不錯的資源管理系統,但要用於製作工具時卻是非常困難的,而 Material 的管理是其中的致命傷。因為那個 Material 是以一個 Script 來儲存的,要製作好一個 Material script 和觀察它在 OGRE 中的表現是頗為困難的。這個工具可以製作一些簡單的 Material script,亦同時可以看到在 OGRE 中的表現。

在 2007 年尾時開始接觸 Event / Data driven 的編程技術,從中學懂了一些相關的理念,所以就利用製作這工具的機會同時實踐 Event 系統。工具主要的功能是管理 Animation 的速度和 Event 的發放,這個工具只要配合 MilkShape3D Animation Splitter 工具及 OGRE Mesh Exporter 就能順利完成相關工作。

這個是從朋友的 OLM ( Open Light Mapper ) 工具衍生出來的,因為覺得它的功能強大而且易用,所以便在一個短時間內,將我常用的 MilkShape3D 及 OLM 整合起來。
雖然只是製作了三個工具,但功能上絕對是紮實的,而且 Bugs 量更是極少 ( :-P )。其實在我的心目中,有一個工具一直都很想做的,就是一個類似 Scene Builder 的工具,之前在製作 OLM MilkShape3D Plugin 時學懂了一點東西,希望能夠在 MilkShape3D 中,完成類似的功能,而這個 Scene Builder,可能是最後一個需要製作的工具呢。
Tuesday, December 02, 2008
經濟衰退的遊戲
經濟又再進入衰退,香港在十年間遇過數次經濟危機,可以說是難得一見,所以我也來發發牙痕。
有人說,電影業與遊戲業在經濟衰推時,多數都不會受影響,因為現實上很不高興,人們都會到電影院或待在家中看電影,又或者慳來不出外用晚餐的洗費,換來一隻電子遊戲留在家中遊玩。
以上所說的,都好像確切地出現過,每每所謂的經濟衰退,都不太聽過遊戲業受牽連,但究竟事實是否如此?多年前日本曾經試過一次頗利害的經濟衰退,日本是其中一個遊戲業界大國,當年有多個遊戲業界新聞,說某某遊戲公司裁員,某某遊戲公司結業,其實如今的一間遊戲母公司,拆散做多間子公司,就是在那時候出現的。簡化架構,精簡人手,就是要做到減省開支,而不失質量。
這次的經濟危機乃全球性問題,而現時的次世代遊戲,往往開發時間長及成本龐大,相信對遊戲製作公司有一定的壓力。而日本作為其中一個遊戲業界大國,近幾年各大遊戲商都將遊戲「國際化」,但同時卻犧牲了日本遊戲獨有的遊戲性,回看 PS One 或 SEGA Saturn 時期的遊戲,比現時 PS3 或 XBox360 的遊戲更好玩更好賣,難怪日本業界近年只專注於「炒冷飯」或「Remake」。
經濟衰退不是一年半載能夠輕易復甦,近年歐洲是個新興的遊戲發展市場,究竟下一年這市場能否保持著那分熱鬧,就要看看到時的國際環境變成如何了。
有人說,電影業與遊戲業在經濟衰推時,多數都不會受影響,因為現實上很不高興,人們都會到電影院或待在家中看電影,又或者慳來不出外用晚餐的洗費,換來一隻電子遊戲留在家中遊玩。
以上所說的,都好像確切地出現過,每每所謂的經濟衰退,都不太聽過遊戲業受牽連,但究竟事實是否如此?多年前日本曾經試過一次頗利害的經濟衰退,日本是其中一個遊戲業界大國,當年有多個遊戲業界新聞,說某某遊戲公司裁員,某某遊戲公司結業,其實如今的一間遊戲母公司,拆散做多間子公司,就是在那時候出現的。簡化架構,精簡人手,就是要做到減省開支,而不失質量。
這次的經濟危機乃全球性問題,而現時的次世代遊戲,往往開發時間長及成本龐大,相信對遊戲製作公司有一定的壓力。而日本作為其中一個遊戲業界大國,近幾年各大遊戲商都將遊戲「國際化」,但同時卻犧牲了日本遊戲獨有的遊戲性,回看 PS One 或 SEGA Saturn 時期的遊戲,比現時 PS3 或 XBox360 的遊戲更好玩更好賣,難怪日本業界近年只專注於「炒冷飯」或「Remake」。
經濟衰退不是一年半載能夠輕易復甦,近年歐洲是個新興的遊戲發展市場,究竟下一年這市場能否保持著那分熱鬧,就要看看到時的國際環境變成如何了。
Sunday, November 09, 2008
Move to MinGW + Code::Blocks
常常看到網上的 Programmer 說道 M$ DLL Hell,雖然我對 DLL 一向都沒有好感,但總是沒有特別的機會體驗一下,終於在上星期遇到過了,情況就是我用 Ogng3D 做好的一個小遊戲,不能在其他電腦上執行,因為 M$ 的 VC Runtime DLL 問題,原因是 Ogng3D 是用 VC++ 2005 Express 製作的,其所用的 VC Runtime 是要超複雜的工序才可以 Deploy 的。
沒錯這個 DLL 問題是可以用 VC++ 2005 Pro 解決,我想要保持著「低成本」的原則,決不採用這個昂貴的方案,所以我便將注意力方在 MinGW + Code::Blocks 上。安裝 MinGW + Code::Blocks 不是件難事,因為 Code::Blocks 的裝件已經簡化了整個過程,下載回來執行安裝便可以。在這時候旅程才只是剛剛開始,我下載 OGRE3D 的 MinGW 的套件,安裝後發現裡面沒有 .a 檔案,初時以為要自己重新 Compile,但看看那些 Sample 後才發現,原來 MinGW 可以直接拿 DLL 來 Import 的。
安頓好 Code::Blocks、MinGW 及 OGRE3D 之後,當然就是要在 Code::Blocks 中 compile 我的 Ogng3D 了,過程也頗順利,沒有特別的問題便成功做好了 MinGW 版本的 Ogng3D,再將其用 PellesC 的工具 dump 出 LIB,嘗試用 PellesC 的遊戲程式 Link 來用,成功了!
在 Code::Blocks 上 Debug 絕對不是一件容易事,因為它用上了 GDB,試過了數次也不能成功啟動 Debugger,後來改動 Workspace 的架構和用較新版本的 GDB,才能夠成功在 GBD 中啟動 Ogng3D 來 Debug。就這樣,兩天的週末時間就沒了三分之二了。
後記:世上沒有免費午餐,免費的東西就要付出時間和努力,要駕馭 MinGW + Code::Blocks 也是一樣,同時 3rd Party 的 DLL 也多了,但總比其他電腦不能執行較好。雖然成功地建立了 MinGW 版本的 Ogng3D,VC++ Express 版本仍是會同步使用的,主要原因是因為 MilkShape3D 的 Plugin 是一定要用 VC++ 來製作的,這點比較可惜。
後記二:終於有機會在一部不能執行的那個小遊戲的電腦上試過了,遊戲成功啟動及運作,真的很感動,而且很高興有辦法逃離 M$ DLL Hell。(11-Nov-2008)
沒錯這個 DLL 問題是可以用 VC++ 2005 Pro 解決,我想要保持著「低成本」的原則,決不採用這個昂貴的方案,所以我便將注意力方在 MinGW + Code::Blocks 上。安裝 MinGW + Code::Blocks 不是件難事,因為 Code::Blocks 的裝件已經簡化了整個過程,下載回來執行安裝便可以。在這時候旅程才只是剛剛開始,我下載 OGRE3D 的 MinGW 的套件,安裝後發現裡面沒有 .a 檔案,初時以為要自己重新 Compile,但看看那些 Sample 後才發現,原來 MinGW 可以直接拿 DLL 來 Import 的。
安頓好 Code::Blocks、MinGW 及 OGRE3D 之後,當然就是要在 Code::Blocks 中 compile 我的 Ogng3D 了,過程也頗順利,沒有特別的問題便成功做好了 MinGW 版本的 Ogng3D,再將其用 PellesC 的工具 dump 出 LIB,嘗試用 PellesC 的遊戲程式 Link 來用,成功了!
在 Code::Blocks 上 Debug 絕對不是一件容易事,因為它用上了 GDB,試過了數次也不能成功啟動 Debugger,後來改動 Workspace 的架構和用較新版本的 GDB,才能夠成功在 GBD 中啟動 Ogng3D 來 Debug。就這樣,兩天的週末時間就沒了三分之二了。
後記:世上沒有免費午餐,免費的東西就要付出時間和努力,要駕馭 MinGW + Code::Blocks 也是一樣,同時 3rd Party 的 DLL 也多了,但總比其他電腦不能執行較好。雖然成功地建立了 MinGW 版本的 Ogng3D,VC++ Express 版本仍是會同步使用的,主要原因是因為 MilkShape3D 的 Plugin 是一定要用 VC++ 來製作的,這點比較可惜。
後記二:終於有機會在一部不能執行的那個小遊戲的電腦上試過了,遊戲成功啟動及運作,真的很感動,而且很高興有辦法逃離 M$ DLL Hell。(11-Nov-2008)
Saturday, October 11, 2008
MilkShape3D + Open Light Mapper
今天要介紹一個工具,這個工具是專門做 Lightmap 的「 Open Light Mapper 」( OLM )。這個工具的好處是,它是個 Open Source 的 Project,而且能夠同時建立 Lightmap 及 Ambient Occlusion Map。OLM 是個 command-line 程式,用法就是先將 Geometry 及燈光等資料,寫做一個 OLM 格式檔案,然後執行 OLM,予以之前寫出的檔案,它就會自動建立一個 Lightmap 圖像檔案。
在大約一個月前,試過這個工具在 3DS MAX 中的表現後,就決定做個 MilkShape3D ( MS3D ) 的 Plugin 版本。但首先要解決的是,我需要一個能夠自動完成 Texture UV Unwrap 的工具,試過多個 Unwrap 工具後,便決定試用 RoadKill ( 因為只有它能夠將做好的 UV,完好地 import 到 MS3D )。經過一輪 GUI 程式編寫後,大約完成了 70%,現在的工序大約是:
● MS3D 做好 3D model
● 放到 RoadKill 中 Unwrap Texture UV
● Import 回到 MS3D
● 在 MS3D 中啟動及執行 OLM Plugin 工具
下面有兩幅在 MS3D 中執行 OLM 工具,及建立好的 Lightmap 和 AO 的效果 ( 看上去好像有點問題,那是因為 RoadKill Unwrap UV 之間空間太少,這個要再想辦法 ..... ),第三幅圖是在 Ogng3D 測試 Demo 畫面。
Open Light Mapper 很強的呢 ! ( 因為我認識它的創作人嘛 :-D )
在大約一個月前,試過這個工具在 3DS MAX 中的表現後,就決定做個 MilkShape3D ( MS3D ) 的 Plugin 版本。但首先要解決的是,我需要一個能夠自動完成 Texture UV Unwrap 的工具,試過多個 Unwrap 工具後,便決定試用 RoadKill ( 因為只有它能夠將做好的 UV,完好地 import 到 MS3D )。經過一輪 GUI 程式編寫後,大約完成了 70%,現在的工序大約是:
● MS3D 做好 3D model
● 放到 RoadKill 中 Unwrap Texture UV
● Import 回到 MS3D
● 在 MS3D 中啟動及執行 OLM Plugin 工具
下面有兩幅在 MS3D 中執行 OLM 工具,及建立好的 Lightmap 和 AO 的效果 ( 看上去好像有點問題,那是因為 RoadKill Unwrap UV 之間空間太少,這個要再想辦法 ..... ),第三幅圖是在 Ogng3D 測試 Demo 畫面。
Open Light Mapper 很強的呢 ! ( 因為我認識它的創作人嘛 :-D )



Sunday, October 05, 2008
新. Animation Split 工具 Plugin
在今年一月時,做了個「 MilkShape3D Ogre Animation Split plugin 」工具,那時候覺得應該夠用,所以便不再加以強化給美化。但在兩星期前,看到一個 Game Scene 工具 ( 忘了網址在哪 ... ),給了我一點啟發,決定重新做一個新的版本。
經過了幾天的努力,有了一點的成果,大家可以看看下圖。與舊版本最大的分別是,加入了互動功能,用家 ( 我 ) 可以用一個 Slider 來查看整個 Animation ( 能夠在左面的 Render View 看到 ),然後桉「 Set Start 」或者「 Set End 」,來設定一個獨立的 Animation 的開始及完結,用家更可以按上/下 Button 來設定 Start / End 的細節 ...... 等等。每一個獨立的 Animation 都會在下面的 Animation List 中列出,列表中的 Animation 當然可以修改了,Animation List 亦會 Save 出來給 Ogre3D Mesh Exporter 使用。
一如以往,此工具是個 Plugin,所以是不需要離開 MilkShape3D 便可以使用,暫時開發進度為 50%,仍在努力開發,完善功能中。
經過了幾天的努力,有了一點的成果,大家可以看看下圖。與舊版本最大的分別是,加入了互動功能,用家 ( 我 ) 可以用一個 Slider 來查看整個 Animation ( 能夠在左面的 Render View 看到 ),然後桉「 Set Start 」或者「 Set End 」,來設定一個獨立的 Animation 的開始及完結,用家更可以按上/下 Button 來設定 Start / End 的細節 ...... 等等。每一個獨立的 Animation 都會在下面的 Animation List 中列出,列表中的 Animation 當然可以修改了,Animation List 亦會 Save 出來給 Ogre3D Mesh Exporter 使用。
一如以往,此工具是個 Plugin,所以是不需要離開 MilkShape3D 便可以使用,暫時開發進度為 50%,仍在努力開發,完善功能中。

Sunday, September 28, 2008
程式語言及遊戲引擎的定位
其實我已經一段時間,沒有接觸 Game Engine 的 Low-Level 層面的開發 ( 例如:Vertex Buffer 或是 Skeleton Animation 等的資料管理 ) 。
在 OGRE 還是在 1.2.X 的階段時,她使用了不小的外加元件 ( Dependencies ),有很多個不同的 DLL 檔案。我一向都不喜歡這樣的遊戲引擎,那時候我還不太清楚為什麼不喜歡,只是直覺的想「 這樣會變得很麻煩 」,就和我以前說過頗類似的感覺:「小寫一些 code,Bug 的出現也會減少」。但是近來有了一點點啟發,明白到一些減少用外加元件的好處。主要的啟發是來自 Microsoft Windows,那個 VC runtime distribution,可以說是 DLL 的災難。
那些惱人的外加元件,因為它們各自用的 Runtime 版本可能不一樣,為了歸一化,很多時候也要由 Source code 開始從新 Build 一次。這些問題雖然可以解決,但也不是一件容易事。而最大的一個問題,就是要從一個開發平台,轉到另一個時 ( 例如:從 Windows 轉到 Linux ) ,這下可不是說笑的。
但是說了這麼多問題,那究竟要怎樣做才可以呢?說實話,我不是資深的軟件工程師,不太適合處理這種複雜的情況。但我一直堅持著用 C Language 的主要原因,或多或少也是因為上面所說的問題。
p.s. 回想 Ngan-GINE'3D,其實也是一個全 C Language ( + DirectX ) 的遊戲引擎。如果我能力夠的話,亦希望繼續用 C Language 做一個全面的 Game Engine。可惜的是,自己的能力不太夠罷了。
在 OGRE 還是在 1.2.X 的階段時,她使用了不小的外加元件 ( Dependencies ),有很多個不同的 DLL 檔案。我一向都不喜歡這樣的遊戲引擎,那時候我還不太清楚為什麼不喜歡,只是直覺的想「 這樣會變得很麻煩 」,就和我以前說過頗類似的感覺:「小寫一些 code,Bug 的出現也會減少」。但是近來有了一點點啟發,明白到一些減少用外加元件的好處。主要的啟發是來自 Microsoft Windows,那個 VC runtime distribution,可以說是 DLL 的災難。
那些惱人的外加元件,因為它們各自用的 Runtime 版本可能不一樣,為了歸一化,很多時候也要由 Source code 開始從新 Build 一次。這些問題雖然可以解決,但也不是一件容易事。而最大的一個問題,就是要從一個開發平台,轉到另一個時 ( 例如:從 Windows 轉到 Linux ) ,這下可不是說笑的。
但是說了這麼多問題,那究竟要怎樣做才可以呢?說實話,我不是資深的軟件工程師,不太適合處理這種複雜的情況。但我一直堅持著用 C Language 的主要原因,或多或少也是因為上面所說的問題。
p.s. 回想 Ngan-GINE'3D,其實也是一個全 C Language ( + DirectX ) 的遊戲引擎。如果我能力夠的話,亦希望繼續用 C Language 做一個全面的 Game Engine。可惜的是,自己的能力不太夠罷了。
Tuesday, September 23, 2008
Loading Progress Bar
我一直以來,都想做一個 Loading screen 的,因為玩家 ( 包括我 ) 都喜歡看「 究竟遊戲 Loading 進度如何?」的顯示。
所以我便用了差不多整個週末的時間,做了一個 Loading screen 功能,用上了 OGRE 中的 ResourceGroupListener 功能,當有 Resource 會 Load 時,便會發出 Event,這時便可以在已設定的 Listener 中,做一些 Loading 進度的表現。
這個 ResourceGroupListener,在使用之前要做些工作,就是首先要把準備 Load 的物件名字 declare 進去,OGRE 才能夠正確地發出 Event。幸運的是,我的 Ogng3D 引擎只需要修改一點點便可以,否則也不能夠在兩天完成這個新功能呢。
所以我便用了差不多整個週末的時間,做了一個 Loading screen 功能,用上了 OGRE 中的 ResourceGroupListener 功能,當有 Resource 會 Load 時,便會發出 Event,這時便可以在已設定的 Listener 中,做一些 Loading 進度的表現。
這個 ResourceGroupListener,在使用之前要做些工作,就是首先要把準備 Load 的物件名字 declare 進去,OGRE 才能夠正確地發出 Event。幸運的是,我的 Ogng3D 引擎只需要修改一點點便可以,否則也不能夠在兩天完成這個新功能呢。

Sunday, September 21, 2008
Multi-Thread Programming 的小體會
前幾天看過一些文章,說 Multi-Thread / Multi-Core 的程式技術,會是現時及未來的趨勢,剛好這幾天有些時間,便做一些這類的編程嘗試。初時看一些有關於 Multi-Thread 的概念文章,希望搞清楚一點才開始,但是看了一天後仍是有點不太明白,所以後來索性編寫一些東西出來試試。
首先很簡單地做一個測試,Function A 在主 Thread 中運行,Function B 被指派到另一個 Thread 中運行,然後 Function A 會問 Function B 拿一個在 Function B 中的數字。真的超級簡單,因為 Function A 只是讀取 Function B 的資料,所以運作很順利。但後來同事們也一起來討論,他們對這方面的認識比我深入很多,其中一個同事更改了我的簡單程式,變成互相在一個 Linked-list 中讀寫資料,就這樣,最基本的 Multi-Thread 問題出現了,就是讀寫同一個資料的動作,有機會在同一時間發生,導致資料錯誤,或是資料損毀的問題。
再深入一點地試了兩天,最後我還是放棄了,Multi-Thread 編程這些工作,還是留給對它有認識的人負責好了,自己還是回到 Event / Data Driven,及 GamePlay 的編程中努力吧。
p.s. 雖然 Multi-Thread 編程令我卻步,但是在當中學到了一些寫程式的技巧,雖然不是甚麼大發現,但卻令我在製作 Ogng3D 上很有幫助。另外亦想到,為什麼現時電腦科技這麼發達,還要為這些超級複雜的難題懊惱?!
首先很簡單地做一個測試,Function A 在主 Thread 中運行,Function B 被指派到另一個 Thread 中運行,然後 Function A 會問 Function B 拿一個在 Function B 中的數字。真的超級簡單,因為 Function A 只是讀取 Function B 的資料,所以運作很順利。但後來同事們也一起來討論,他們對這方面的認識比我深入很多,其中一個同事更改了我的簡單程式,變成互相在一個 Linked-list 中讀寫資料,就這樣,最基本的 Multi-Thread 問題出現了,就是讀寫同一個資料的動作,有機會在同一時間發生,導致資料錯誤,或是資料損毀的問題。
再深入一點地試了兩天,最後我還是放棄了,Multi-Thread 編程這些工作,還是留給對它有認識的人負責好了,自己還是回到 Event / Data Driven,及 GamePlay 的編程中努力吧。
p.s. 雖然 Multi-Thread 編程令我卻步,但是在當中學到了一些寫程式的技巧,雖然不是甚麼大發現,但卻令我在製作 Ogng3D 上很有幫助。另外亦想到,為什麼現時電腦科技這麼發達,還要為這些超級複雜的難題懊惱?!
Monday, September 15, 2008
精神食糧電視劇
近幾年來,不知為何的,已經很小看日本或其他外國的電視劇集。
在這幾個星期日,偶爾地看到一套日本電視劇「 Bambino 」( 無記電視台譯 "料理新鮮人" ),感覺很好看,其實她的情節很簡單,就是一個年青人追尋夢想的故事 ( 日劇就是這樣的了 )。
雖然這些情節看來好像不太實際,但有時間我們需要的,就是這種「 精神上的食糧 」。而不是那些每晚都鬧哄哄的拖拉情節 ...
在這幾個星期日,偶爾地看到一套日本電視劇「 Bambino 」( 無記電視台譯 "料理新鮮人" ),感覺很好看,其實她的情節很簡單,就是一個年青人追尋夢想的故事 ( 日劇就是這樣的了 )。
雖然這些情節看來好像不太實際,但有時間我們需要的,就是這種「 精神上的食糧 」。而不是那些每晚都鬧哄哄的拖拉情節 ...
Friday, August 22, 2008
棄用收費 3rd party LIB
一直以來,我都是用一些免費,或者價錢便宜的工具來做遊戲,雖然那些工具看起來都不是很專業,但確切地實用就已經足夠。
自從開始製作 Ogng'3D 引擎,我一直都在找一個便宜的聲效 LIB,本已找到一個叫做 irrKlang,但後來這個 LIB 要收費了,所以近來都在找代替品。後來在 OGRE3D 的 forum 裡,看到有個叫做 cAudio 的東西,是個 OpenSource 的聲效 LIB ( 使用了 OpenAL ),便拿來看看。
因為這個 cAudio 本身是給 Linux 使用的,我要自己將它轉為 Windows 平台,經過同事們的幫忙下,成功地將它轉為 Windows 的 DLL 了,現在正努力將它的功能完善化。
[ 更新 2008-08-27 ]
經過幾天的測試,發現其實 cAudio 中的資源管理比較薄弱,但整個架構是個很好的例子。看來還是要自己努力一點,重新做個稱心的聲音 / 音樂播放功能,放進 Ogng'3D 引擎了。
自從開始製作 Ogng'3D 引擎,我一直都在找一個便宜的聲效 LIB,本已找到一個叫做 irrKlang,但後來這個 LIB 要收費了,所以近來都在找代替品。後來在 OGRE3D 的 forum 裡,看到有個叫做 cAudio 的東西,是個 OpenSource 的聲效 LIB ( 使用了 OpenAL ),便拿來看看。
因為這個 cAudio 本身是給 Linux 使用的,我要自己將它轉為 Windows 平台,經過同事們的幫忙下,成功地將它轉為 Windows 的 DLL 了,現在正努力將它的功能完善化。
[ 更新 2008-08-27 ]
經過幾天的測試,發現其實 cAudio 中的資源管理比較薄弱,但整個架構是個很好的例子。看來還是要自己努力一點,重新做個稱心的聲音 / 音樂播放功能,放進 Ogng'3D 引擎了。

Wednesday, August 13, 2008
Game play 加 Control 仍是一切嗎 ?
當美國 SEGA 公佈,她們的 iPhone 遊戲「 Super Monkey Ball 」,在 20 天內在網上 App Store 賣出 30 萬套的驚人銷量 ( US$ 9.99 一套,總銷售額 US$ 2,997,000 ),令我更加相信,Game Play 及 Control ( Input ) 就是黃金組合。
曾經看過一篇文章,說現在的遊戲就是不停地「炒冷飯」,很冷很久的飯也會拿出來炒,又或者是不停地重複續作,加上超級美麗的圖像,就會拿出來賣。就這樣,不好玩但畫面美麗的遊戲滿街都是,這做就了現在一批遊戲玩家,只用畫面的美麗程度來判斷遊戲的好與壞。
沒了 Game Play,也沒了 Control 的配合,再好看的遊戲也是有缺憾的,更可笑的是,那裡丁點缺憾美也沒有。
很懷念以前 Super Nintendo 及 SEGA MegaDrive 年代 ( 及同時期的街機遊戲 ),好遊戲盡在那些時候。
曾經看過一篇文章,說現在的遊戲就是不停地「炒冷飯」,很冷很久的飯也會拿出來炒,又或者是不停地重複續作,加上超級美麗的圖像,就會拿出來賣。就這樣,不好玩但畫面美麗的遊戲滿街都是,這做就了現在一批遊戲玩家,只用畫面的美麗程度來判斷遊戲的好與壞。
沒了 Game Play,也沒了 Control 的配合,再好看的遊戲也是有缺憾的,更可笑的是,那裡丁點缺憾美也沒有。
很懷念以前 Super Nintendo 及 SEGA MegaDrive 年代 ( 及同時期的街機遊戲 ),好遊戲盡在那些時候。
Subscribe to:
Posts (Atom)