Saturday, January 31, 2009

玩遊戲的迷思

在 2D 遊戲的時代,遊戲都是簡單的操控:十字掣移動,A按鈕是跳躍,B按鈕是攻擊;關卡設計也是簡單的,在設計上就是要你不停地做出指定動作,如果玩家做不到,只是他不夠熟練,一旦玩家熟練後就可以駕輕就熟地完成。Sprite 也是充滿想像空間的,因為記憶體不足的問題,背景或是人物的 Animation 往往都是有限的,但這種有限也給與了玩家的想像空間。整個遊戲除了給玩家遊玩之外,也做就了玩家的一些正面心智成長。

在現今 3D 遊戲設計的道路上,已經很難看到一些和以前 2D 相比的例子。曾經和同事們討論過,究竟為什麼會有這種情況出現?那些簡單但令人中毒很深的遊戲,現在的 3D 遊戲中真的很難找到些例子,究竟問題出在哪裡?有同事的意見是,我年齡增長了,見識和玩過的遊戲也增多了,在要求上變了,但是我卻不太完全同意。

我喜愛玩的遊戲的模式,其實是很簡單的,我做的事情就是:攻擊 ( 連續攻擊 )、跳躍 ( 雙重跳 )、跳躍攻擊、抓住敵人再攻擊 ... 等等。加一點點攻擊或武器的強化工具,遊戲的進程速度爽快,變化慢慢增加 ( 不是難度 )。

想一想,玩遊戲就是想跳出現實,玩樂一會兒,但是歐美大型 3D 遊戲卻以「 真實 」作為賣點,在玩遊戲的時候要跳入另一個「( 偽 ) 真實環境」,究竟哪裡能帶來一些正面的心智成長?

相關網頁:
Opinion: How Mega Man 9 Resembles… Real Life ?
那些洛克人教我們的事

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 方便使用,速度高便可以的了。

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 ,及傳送接收資料而已。

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 還是免不了的。

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 年更開心、更健康。