多人聯機射擊遊戲中的設計模式應用(一)
為了方便大家更加系統地學習和掌握各種常用的設計模式,下面通過一個綜合例項——“多人聯機射擊遊戲”來學習如何在實際開發中綜合使用設計模式。
反恐精英(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】
相關文章
- 分析“英雄射擊遊戲”的角色設計遊戲
- 漫談第一人稱射擊遊戲(FPS)中角色的機制設計遊戲
- 從STG射擊遊戲歷史看遊戲設計的演化遊戲設計
- <多人PvP射擊遊戲融入開放世界玩法>地圖與關卡設計要點遊戲地圖
- 動作與射擊漫談:格鬥遊戲中的動作設計遊戲
- 在遊戲設計中引導玩家 剖析2D射擊遊戲設計中的壓縮和漏斗理論遊戲設計
- 設計模式在vue中的應用(一)設計模式Vue
- 射擊遊戲PVP關卡設計及融入開放世界玩法設計遊戲
- 攻防大戰場地圖規劃與設計 | 射擊遊戲·設計篇地圖遊戲
- 這款多人生存射擊遊戲,可以利用AI去陷害對手遊戲AI
- 設計模式在 TypeScript 中的應用 – 策略模式設計模式TypeScript
- 戰鬥,射擊!探尋射擊遊戲發展的這些年遊戲
- Golang+Protobuf+PixieJS 開發 Web 多人線上射擊遊戲(原創翻譯)GolangJSWeb遊戲
- 淺談遊戲中槍械:什麼因素影響射擊遊戲中的槍?遊戲
- 【射擊遊戲】TPS對比FPS戰鬥設計差異與心得遊戲
- 世界觀架構之射擊遊戲技能設定架構遊戲
- 如何為射擊遊戲設計令人難忘的戰術戰鬥區域?遊戲設計
- 設計模式在vue中的應用(七)設計模式Vue
- 設計模式在vue中的應用(六)設計模式Vue
- 設計模式在vue中的應用(三)設計模式Vue
- 設計模式在vue中的應用(二)設計模式Vue
- 設計模式在vue中的應用(四)設計模式Vue
- 設計模式在vue中的應用(五)設計模式Vue
- 遊戲設計裡的那些色彩應用遊戲設計
- 遊戲基礎知識——“非絕對平衡設計”在多人遊戲中的影響遊戲
- 遊戲機制中的介面設計遊戲
- 射擊遊戲的原始模型——牛仔決鬥遊戲模型
- 設計模式應用場景之Model設計中可以用到的設計模式設計模式
- 設計模式之--策略模式及其在JDK中的應用設計模式JDK
- 用Unity開發一款塔防遊戲(一):攻擊方設計Unity遊戲
- 乾貨:射擊遊戲中強烈的手感如何營造出來?遊戲
- .net core 中的經典設計模式的應用設計模式
- 設計模式 - 命令模式詳解及其在JdbcTemplate中的應用設計模式JDBC
- candy.one 新增一款射擊贏糖果遊戲遊戲
- 遊戲機制設計:資源管理挑戰與遊戲中的AI設計遊戲AI
- 如何在程式碼中應用設計模式設計模式
- 【遊戲設計】淺談快速反應事件(QTE)的應用遊戲設計事件QT
- 遊戲中那些新穎的設計(一)遊戲
- 格鬥、卡牌、射擊、手遊、漫畫,英雄聯盟已經不只是一個遊戲了遊戲