本文只有兩個主題:
1、遊戲設計清晰的必要
2、迴圈邏輯的代碼設計
遊戲設計:
未寫代碼先設計,這是一個非常重要的建議,如果在寫代碼前還不知道要開發一個什麼遊戲,那麼會遇上很多問題,這些問題包括:
- 代碼編寫異常艱難
- 半路重構
- 工作量無法估計
- 預算嚴重超支
- ……
如果第一次開發遊戲,那麼就容易有兩種情況,第一,遊戲就那樣還用的著設計嗎,第二,無從下手,到底該怎麼設計,第一種肯定考慮不周全,這是大多數情況,第二種比第一種更悲慘,啟示無論那種情況,把問題羅列出來,到一起回答就可以解決很多,比如說,可以嘗試回答如下問題:
- 遊戲主題是什嗎?
- 是什麼類型的遊戲,RPG?SLG?FPS?MMO?
- 有沒有劇情?
- 是單機的還是網路的?
- 單機的話,單人還是雙人的?
- 網路的話,是區域網路還是互連網?
- 遊戲風格是什麼樣的?
- 如何操控?
- 2D還是3D?
- 打算讓玩家玩多久到頭?
- 都是什麼玩家玩?
- 應用技術是那些?
- 目標終端是否可承載?
- 能夠滿足玩家什麼需求?
- ……
確切來說,以上的問題僅僅是遊戲設計的一個小部分,按照經驗,可能為一個或者多個問題要研究很久,舉例來說,遊戲類型將制約代碼的主要邏輯,比如說劇情類的遊戲就必須要需要一個劇情指令碼,而相應的策略遊戲相比劇情指令碼更加需要智能指令碼,這樣的情況下,你的代碼和處理就需要有很多的考慮。
比如以前我們在開發網路遊戲的時候,有一個項目地圖是一個整體,不需要獨立的地圖編輯器去編輯,只需要在3DMAX中將物體名稱起好,所有的行為對應到一張Excel表,如果是這樣的一種模式,地圖編輯工具就不需要花太大力氣……
可能所在的團隊有策劃的支援,可以省去很多力氣,然而最佳的情況下是開發人員就是策劃,哈,也許會著磚頭吧。
代碼設計
首先得瞭解遊戲啟動並執行機制,在考慮更加深層次的東西,任何遊戲都是一個迴圈體,就如所示:
可能覺得,這和Silverlight遊戲開發有什麼關係呢,這不是用戶端遊戲的開發做法嗎?在遊戲誕生的那天起,它本身就是一個迴圈,在程式中更加是一個迴圈體,這個基礎理論是都適用,我們瞭解了迴圈機制,就可以依據這個流程設計代碼,上面就夠了嗎?讓我們展開來看看:
上面只是寫了一個大概,如果你打算開發一個遊戲的話,需要考慮的更多,如果轉換到最簡單的虛擬碼的話則是:
GameLoop
while( Game.State != emGameState.Exit)
{
switch(Game.State) {
case emGameState.Init:
Game.Init();
break;
case emGameState.Loop:
Game.Loop();
break;
case emGameState.Exit:
Game.Exit();
break; }
}
上面是一個最簡單的代碼設計,只需要在Game類中執行相應的邏輯即可,但是是否想過這樣肯定不行,如果按照這個樣子寫下去,那麼就不是一個完整的遊戲,最多隻是一個展示品,要做成一個完整的遊戲,就得在主要迴圈裡加入更多的行為,最好的方法莫過於先構想流程:
按照上面的流程圖,那麼迴圈代碼可能是這樣的:
while( Game.State != emGameState.Exit)
{
switch(Game.State)
{
case emGameState.Init:
Game.Init();
break;
case emGameState.Menu:
Game.Menu();
break;
case emGameState.Starting:
Game.Starting();
break;
case emGameState.Loop:
Game.LoopLogic();
break;
case emGameState.Rest:
Game.Rest();
break;
case emGameState.Exit:
Game.Exit();
break;
}
}
可是問題又來了,無端的迴圈是不是造成了系統浪費,確實,無論在什麼技術上都是在考慮如何解決不必要的開銷,而且我們用的Silverlight來開發,c#又是這麼物件導向的語言,這麼寫太不進階,引入進階編程理論該如何做呢,這個部分以後再說,在這裡拋磚引玉,看看也許會有啟示:)