摘要:文章以網絡游戲對戰平臺為背景,介紹了設計模式在網絡游戲中的應用。在傳統的面向過程或者面向對象的編程中,各個不同的角色從產生到銷毀的全過程,主要使用數組或鏈表或集合來進行控制,程序邏輯復雜而不易修改和擴展。該文引入了設計模式的概念,使得控制游戲中各個角色的操作更加簡便、更加富有邏輯性。該文對從事設計模式研究、游戲制作的技術人員有一定幫助,實現代碼采用微軟的C#語言。
關鍵詞:設計模式;網絡游戲;C#
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)26-1620-03
The Appliation of the Design Pattern in Online Games
CHU Wang-hui, GONG Yi-fan, CHEN Yun
(Shenzhen Institute of Technology, Shenzhen 518045, China)
Abstract: According to the background of the network battle game system built, the paper introduces the Application of Design Pattern technology in Online Games. In the traditional programming of process-oriented or object-oriented, mainly use the array or collection or chain to control the entire process from generation to the destruction of various roles. This paper introduces the Design Patterns. The Design Patters can controls the various roles more convenient, more full of logic. The paper is availability to the man who engages on the programming of game or the research of Design Patterns.
Key words: design pattern; online games; C#
1 引言
在傳統的面向對象或者面向過程的教學中,很多人都難于明白為什么要使用面向對象技術,教師也只能按照書上的示例給大家生搬硬套的講解面向對象,難以講解清楚使用面向對象技術的好處,在某些書籍的講解示例中,用面向過程技術很快能實現的功能非要套上面向對象的光環,使得學生很難理解面向對象技術的實際作用。此時,在國外很多計算機專家的努力下,總結出了很多成功應用面向對象的范例,并提出了設計模式的概念。在此背景下,本文闡述了使用設計模式技術制作多人對戰平臺的方法,望能起到拋磚引玉之用。
2 系統設計
網絡游戲設計的難點在于:每個游戲角色都需要知道在當前屏幕范圍內存在多少個其他角色,而其他角色可能是和登陸角色一樣的游戲玩家,也可能是游戲當中的怪物或者其他劇情人物。如下圖所示:
由前面描述和上面的圖形我們可以得出以下幾點:
1) 當角色新登入對戰平臺,此時,新登陸的角色應該能夠知道屏幕中已經存在了哪些角色,同時,屏幕中已經存在的角色也應該能夠知道新登陸的角色的信息。
2) 當角色退出系統時,屏幕中的所有其他角色都能夠知道哪個角色退出了系統。
3) 當角色產生了動作,如攻擊、移動等,其他角色能夠得知該角色的具體方位,和角色攻擊對自己產生的影響。
上面的需求類似于.net的ui框架設計,在.net窗體程序中,可以任意的在Form中添加文本框TextBox,標簽Lable,按鈕Button,數據綁定控件DataGrid等。不管添加了哪種類型的控件。.net框架都能夠自知。并且,當單擊了Button按鈕時,.net框架能夠感知事件的發生,這和網絡游戲當中當一個角色發動攻擊時,其他角色能夠感知攻擊是一樣的道理。基于以上分析,查閱了net框架事件的實現,得知.net框架采用了委托來實現事件機制,而委托采用了設計模式當中的Observer模式,于是,決定對Observer模式進行改進,實現多人網絡對戰。
4) Observer模式。
Observer模式意圖的描述是:“定義對象間的一種一對多依賴關系,使得每當一個對象改變裝態,則其相關依賴對象皆得到通知并自動更新。”
在軟件的構建過程中,我們常常要為一些對象建立一種通知依賴關系:當一個對象(Subject)的狀態發生改變或某一特定事件發生時,所有的依賴對象(Observer)都需要得到通知。由于需求的變化,需要得到通知的Observer對象可能會發生變化,這時我們就需要使用面向對象的設計方法來封裝這種變化,使觀察者和被觀察者形成一種松散的耦合關系。
基于Observer模式的描述,我們可以對其進行改進,實現網絡游戲對戰。具體描述如下:每當一個角色登陸游戲服務器,即把該角色添加到屏幕中現存角色的依賴關系中,同時把屏幕上的所有角色添加到登陸角色的依賴關系當中,這樣就達到了多對多依賴的效果。
有了這種多對多的依賴關系,當其中一個角色狀態發生改變時,就能夠通知屏幕中現存的所有對象,使其產生相應的動作。
當一個角色誕生的時候、我們使用Add(Role role)函數把它添加到屏幕集合中。
當角色發生事件、例如角色移動位置、發動攻擊,則調用NotifyRole()函數通知所有其他相關對象。
當角色消亡、調用Remove(Role role)函數把角色從屏幕集合中清除。
具體UML圖如下所示。
3 具體實現
1) 根據以上分析,建立ScreenObject類。
public class ScreenObject {
private static ArrayList _list_Roles = new ArrayList();
public static void Add(IRole role){ //實現添加角色到當前屏幕
_list_Roles.Add(role);}
public static void Remove(IRole role) {//實現從屏幕中移除角色
_list_Roles.Remove(role);}
public string GetState() { return 1; }//獲取角色狀態
public string SetState() { return 1; }//設置角色狀態
public void NotifyRole() {//通知所有角色
foreach (IRole role in _list_Roles){
role.Update(this);}
throw new System.NotImplementedException();}}
2) 建立角色接口。并更加此接口定義派生人物、怪物等不同角色類。
public interface IRole { //接口
void Update(ScreenObject sObj); //當角色發生改變,能通知到所有其他角色}
public abstract class Roles:IRole{ //基類
public abstract void Update(ScreenObject sObj);}
public abstract class PersonRole :Roles{//人物類
public PersonRole() { }
public override void Update(ScreenObject sObj){}}
public class MainRole:PersonRole{//具體類
public override void Update(ScreenObject sObj) {}}
4 結束語
在面向對象概念面世以后,很多人都研究他、探索他,但后來發現很多程序用結構化程序設計方法比面向對象技術來得更加簡便、特別是沒有大項目開發經驗的人對面向對象技術深感迷惑。直到設計模式面世以后。才發現學習面向對象技術最好從設計模式學起,只有從學習設計模式技術開始,才能真正理解掌握面向對象,并喜歡上面向對象。本文采用設計模式中的一些技術對網絡游戲的設計進行了探討,忘能拋磚引玉。
參考文獻:
[1] Eric J Braude.軟件設計[M].李仁發,譯.北京:電子工業出版社,2007.
[2] Alan Shalloway.設計模式解析[M].許言聲,譯.北京:人民郵電出版社,2006.
[3] 云風.游戲之旅——我的編程感悟[M].北京:電子工業出版社,2005.
[4] Martin L Shoemaker.UML實戰教程[M].高猛,譯.北京:清華大學出版社,2006.