多人聯機射擊遊戲中的設計模式應用(一)

Liuwei-Sunny發表於2012-12-05

     為了方便大家更加系統地學習和掌握各種常用的設計模式,下面通過一個綜合例項——“多人聯機射擊遊戲”來學習如何在實際開發中綜合使用設計模式。

 

      反恐精英(Counter-Strike, CS)、三角洲部隊、戰地等多人聯機射擊遊戲廣受玩家歡迎,在多人聯機射擊遊戲的設計中,可以使用多種設計模式。下面我選取一些較為常用的設計模式進行分析:

 

      (1) 抽象工廠模式

      在聯機射擊遊戲中提供了多種遊戲場景,不同的遊戲場景提供了不同的地圖、不同的背景音樂、不同的天氣等,因此可以使用抽象工廠模式進行設計,類圖如圖1所示:

1 抽象工廠模式例項類圖

       在圖1中,SceneFactory充當抽象工廠,其子類SceneAFactory等充當具體工廠,可以建立具體的地圖(Map)、背景音樂(Music)和天氣(Weather)等產品物件,如果需要增加新場景,只需增加新的具體場景工廠類即可。

 

      (2) 建造者模式

      在聯機射擊遊戲中每一個遊戲人物角色都需要提供一個完整的角色造型,包括人物造型、服裝、武器等,可以使用建造者模式來建立一個完整的遊戲角色,類圖如圖2所示:

2 建造者模式例項類圖

      在圖2中,PlayerCreatorDirector充當指揮者角色,PlayerBuilder是抽象建造者,其子類PlayerBuilderAPlayerBuilderB是具體建造者,用於建立不同的遊戲角色,Player是所建立的完整產品,即完整的遊戲角色,它包含形體(body)、服裝(costume)和武器(weapon)等組成部分。

 

      (3) 工廠方法模式

      在射擊遊戲中,AK47衝鋒步槍、狙擊槍、手槍等不同武器(Weapon)的外觀、使用方法和殺傷力都不相同,玩家可以使用不同的武器,而且遊戲升級時還可以增加新的武器,無需對現有系統做太多修改,可使用工廠方法模式來設計武器系統,類圖如圖3所示:

3 工廠方法模式例項類圖

       在圖3中,WeaponFactory介面表示抽象武器工廠,其子類AK47GunFactory生產AK47GunSniperRifleFactory生產SniperRifle,不同的武器的display()use()fire()等方法有不同的實現。

 

      (4) 迭代器模式

      在射擊遊戲中,一個玩家可以擁有多種武器,如既可以擁有AK47衝鋒槍,還可以擁有手槍和匕首,因此係統需要定義一個彈藥庫(武器的集合),在遊戲過程中可以遍歷彈藥庫(Magazine),選取合適的武器,在遍歷彈藥庫時可使用迭代器模式,如類圖如圖4所示:

4 迭代器模式例項類圖

      在類Magazine中,可以通過迭代器遍歷彈藥庫,Magazine類的程式碼片段如下所示:

public class Magazine {
	private ArrayList weapons;
	private Iterator iterator;


	public Magazine() {
		weapons = new ArrayList();
		iterator = weapons.iterator();
	}

	public void display() {
		while(iterator.hasNext()) {
			((Weapon)iterator.next()).display();
		}
	}
	......
}


      除了遍歷彈藥庫外,迭代器模式還可以用於遍歷戰隊盟友等聚合物件。

 

      (5) 命令模式

      在射擊遊戲中,使用者可以自定義快捷鍵,根據使用習慣來設定快捷鍵,如“W”鍵可以設定為“開槍”的快捷鍵,也可以設定為“前進”的快捷鍵,可通過命令模式來實現快捷鍵設定,類圖如圖5所示:

5 命令模式例項類圖

      在圖5中,ShortcutKey充當請求呼叫者,在其press()方法中將判斷使用者按的是哪個按鍵,再呼叫命令物件的execute()方法,在具體命令物件的execute()方法中將呼叫接收者如ShotHandlerGoAheadHandleraction()方法來執行具體操作。在實現時可以將具體命令類類名和鍵盤按鍵的鍵碼(Keycode)儲存在配置檔案中,配置檔案格式如下所示:

……
<FunctionMapping keycode="87" commandClass="ShotCommand"/>
<FunctionMapping keycode="38" commandClass="GoAheadCommand"/>
……


      如果需要更換快捷鍵,只需修改鍵碼和具體命令類的對映關係即可;如果需要在遊戲的升級版本中增加一個新功能,只需增加一個新的具體命令類,可通過修改配置檔案來為其設定對應的按鍵,原有類庫程式碼無需任何修改,很好地符合開閉原則。

【作者:劉偉 http://blog.csdn.net/lovelion

相關文章