多人聯機射擊遊戲中的設計模式應用(一)
為了方便大家更加系統地學習和掌握各種常用的設計模式,下面通過一個綜合例項——“多人聯機射擊遊戲”來學習如何在實際開發中綜合使用設計模式。
反恐精英(Counter-Strike, CS)、三角洲部隊、戰地等多人聯機射擊遊戲廣受玩家歡迎,在多人聯機射擊遊戲的設計中,可以使用多種設計模式。下面我選取一些較為常用的設計模式進行分析:
(1) 抽象工廠模式
在聯機射擊遊戲中提供了多種遊戲場景,不同的遊戲場景提供了不同的地圖、不同的背景音樂、不同的天氣等,因此可以使用抽象工廠模式進行設計,類圖如圖1所示:
圖1 抽象工廠模式例項類圖
在圖1中,SceneFactory充當抽象工廠,其子類SceneAFactory等充當具體工廠,可以建立具體的地圖(Map)、背景音樂(Music)和天氣(Weather)等產品物件,如果需要增加新場景,只需增加新的具體場景工廠類即可。
(2) 建造者模式
在聯機射擊遊戲中每一個遊戲人物角色都需要提供一個完整的角色造型,包括人物造型、服裝、武器等,可以使用建造者模式來建立一個完整的遊戲角色,類圖如圖2所示:
圖2 建造者模式例項類圖
在圖2中,PlayerCreatorDirector充當指揮者角色,PlayerBuilder是抽象建造者,其子類PlayerBuilderA和PlayerBuilderB是具體建造者,用於建立不同的遊戲角色,Player是所建立的完整產品,即完整的遊戲角色,它包含形體(body)、服裝(costume)和武器(weapon)等組成部分。
(3) 工廠方法模式
在射擊遊戲中,AK47衝鋒步槍、狙擊槍、手槍等不同武器(Weapon)的外觀、使用方法和殺傷力都不相同,玩家可以使用不同的武器,而且遊戲升級時還可以增加新的武器,無需對現有系統做太多修改,可使用工廠方法模式來設計武器系統,類圖如圖3所示:
圖3 工廠方法模式例項類圖
在圖3中,WeaponFactory介面表示抽象武器工廠,其子類AK47GunFactory生產AK47Gun,SniperRifleFactory生產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()方法中將呼叫接收者如ShotHandler、GoAheadHandler的action()方法來執行具體操作。在實現時可以將具體命令類類名和鍵盤按鍵的鍵碼(Keycode)儲存在配置檔案中,配置檔案格式如下所示:
……
<FunctionMapping keycode="87" commandClass="ShotCommand"/>
<FunctionMapping keycode="38" commandClass="GoAheadCommand"/>
……
如果需要更換快捷鍵,只需修改鍵碼和具體命令類的對映關係即可;如果需要在遊戲的升級版本中增加一個新功能,只需增加一個新的具體命令類,可通過修改配置檔案來為其設定對應的按鍵,原有類庫程式碼無需任何修改,很好地符合開閉原則。
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 多人聯機射擊遊戲中的設計模式應用(二)遊戲設計模式
- 設計模式在vue中的應用(一)設計模式Vue
- 設計模式在 TypeScript 中的應用 – 策略模式設計模式TypeScript
- 設計模式在vue中的應用(六)設計模式Vue
- 設計模式在vue中的應用(七)設計模式Vue
- 設計模式在vue中的應用(五)設計模式Vue
- 設計模式在vue中的應用(三)設計模式Vue
- 設計模式在vue中的應用(四)設計模式Vue
- 設計模式在vue中的應用(二)設計模式Vue
- 設計模式,及在Java中的應用設計模式Java
- 設計模式應用場景之Model設計中可以用到的設計模式設計模式
- 設計模式之--策略模式及其在JDK中的應用設計模式JDK
- .net core 中的經典設計模式的應用設計模式
- 設計模式 - 命令模式詳解及其在JdbcTemplate中的應用設計模式JDBC
- 如何在程式碼中應用設計模式設計模式
- 設計模式之Decorator在餐館中的應用設計模式
- 聊一聊BEM設計模式在Vue元件開發中的應用設計模式Vue元件
- 設計模式 - 迭代器模式詳解及其在ArrayList中的應用設計模式
- 對設計模式應用的疑惑設計模式
- 漫談第一人稱射擊遊戲(FPS)中角色的機制設計遊戲
- 淺談設計模式在建安系統中的應用設計模式
- 物聯網的應用模式模式
- 設計模式 | 策略模式及典型應用設計模式
- javascript設計模式與應用JavaScript設計模式
- 設計模式應用舉例設計模式
- 設計複合應用程式:設計模式設計模式
- Web應用的快取設計模式Web快取設計模式
- 【設計模式】Java服務開發應用策略模式的一個例子設計模式Java
- 設計模式及其在spring中的應用(含程式碼)設計模式Spring
- Opendaylight 中 關於工廠設計模式的應用設計模式
- Java中的設計模式(一):觀察者模式Java設計模式
- 聯合體在微控制器程式設計中的應用程式設計
- Java設計模式——觀察者模式的靈活應用Java設計模式
- 設計模式 | 外觀模式及典型應用設計模式
- 設計模式 | 享元模式及典型應用設計模式
- 設計模式 | 模板方法模式及典型應用設計模式
- 設計模式 | 組合模式及典型應用設計模式
- 設計模式 | 觀察者模式及典型應用設計模式