多人聯機射擊遊戲中的設計模式應用(二)
(6) 觀察者模式
聯機射擊遊戲可以實時顯示隊友和敵人的存活資訊,如果有隊友或敵人陣亡,所有線上遊戲玩家將收到相應的訊息,可以提供一個統一的中央角色控制類(CenterController)來實現訊息傳遞機制,在中央角色控制器中定義一個集合用於儲存所有的玩家資訊,如果某玩家角色(Player)陣亡,則呼叫CenterController的通知方法notifyPlayers(),該方法將遍歷使用者資訊集合,呼叫每一個Player的display()方法顯示陣亡資訊,隊友陣亡和敵人陣亡的提示資訊有所不同,在使用notifyPlayers()方法通知其他使用者的同時,陣亡的角色物件將從使用者資訊集合中被刪除。可使用觀察者模式來實現資訊的一對多傳送,類圖如圖6所示:
圖6 觀察者模式例項類圖
在圖6中,CenterController充當觀察目標,Observer充當抽象觀察者,Player充當具體觀察者。在Player類中,name屬性表示角色名,type屬性表示角色型別,如“戰隊A”或“戰隊B”等。Player的die()方法執行時將呼叫CenterController的notifyPlayers()方法,在notifyPlayers()方法中呼叫其他Player物件的提示方法,如果是隊友陣亡則呼叫displayTeam(),如果是敵人陣亡則呼叫displayEnemy();還將呼叫detach()方法刪除陣亡的Player物件,其中CenterController類的notifyPlayers()方法程式碼片段如下所示:
for(Object player : players) {
if(player.getName().equals(name)) {
this.detach(player); //刪除陣亡的角色
}
else {
if(player.getType().equals(type)) {
player.displayTeam(name); //隊友顯示提示資訊
}
else {
player.displayEnemy(name); //敵人顯示提示資訊
}
}
}
(7) 單例模式
為了節約系統資源,在聯機射擊遊戲中可以使用單例模式來實現一些管理器(Manager),如場景管理器(SceneManager)、聲音管理器(SoundManager)等,如圖7所示的場景管理器SceneManager類:
圖7 單例模式例項類圖
SceneManager類的實現程式碼片段如下所示【注:以下程式碼未考慮多執行緒訪問的問題】:
class SceneManager {
private static SceneManager sManager = null;
private SceneManager() {
//初始化程式碼
}
public synchronized static SceneManager getInstance() {
if(sManager==null) {
sManager = new SceneManager();
}
return sManager;
}
public void manage() {
//業務方法
}
}
(8) 狀態模式
在射擊遊戲中,遊戲角色存在幾種不同的狀態,如正常狀態、暫停狀態、陣亡狀態等,在不同狀態下角色物件的行為不同,可使用狀態模式來設計和實現角色狀態的轉換,類圖如圖8所示:
圖8 狀態模式例項類圖
在圖8中,遊戲角色類Player充當環境類,State充當抽象狀態類,其子類NormalState、PauseState和DeathState充當具體狀態類,在具體狀態類的pause()、start()、beAttacked()等方法中可實現狀態轉換,其中NormalState類的程式碼片段如下所示:
class NormalState extends State
{
public void pause() //遊戲暫停
{
//暫停程式碼省略
player.setState(new PauseState(this)); //轉為暫停狀態
}
public void start() //遊戲啟動
{
//遊戲程式正在執行中,該方法不可用
}
public void beAttacked() //被攻擊
{
//其他程式碼省略
if(lifeValue<=0)
{
player.setState(new DeathState(this)); //轉為陣亡狀態
}
}
public void shot() //射擊
{
//程式碼省略
}
public void move() //移動
{
//程式碼省略
}
}
(9) 介面卡模式
為了增加遊戲的靈活性,某些射擊遊戲還可以通過遊戲手柄來進行操作,遊戲手柄的操作程式和驅動程式由遊戲手柄製造商提供,為了讓當前的射擊遊戲可以與遊戲手柄相容,可使用介面卡模式來進行設計,類圖如圖9所示:
圖9 介面卡模式例項類圖
在圖9中,GamepadsAdapter充當介面卡,它將遊戲手柄中按鍵(GamepadsKey)的方法適配到現有系統中,在其move()方法中可以呼叫MoveKey類的handle()方法,在其shot()方法中可以呼叫ShotKey的handle()方法,從而實現通過手柄來控制遊戲執行。
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 分析“英雄射擊遊戲”的角色設計遊戲
- 從STG射擊遊戲歷史看遊戲設計的演化遊戲設計
- 設計模式在vue中的應用(二)設計模式Vue
- <多人PvP射擊遊戲融入開放世界玩法>地圖與關卡設計要點遊戲地圖
- 漫談第一人稱射擊遊戲(FPS)中角色的機制設計遊戲
- 動作與射擊漫談:格鬥遊戲中的動作設計遊戲
- 在遊戲設計中引導玩家 剖析2D射擊遊戲設計中的壓縮和漏斗理論遊戲設計
- 射擊遊戲PVP關卡設計及融入開放世界玩法設計遊戲
- 攻防大戰場地圖規劃與設計 | 射擊遊戲·設計篇地圖遊戲
- 這款多人生存射擊遊戲,可以利用AI去陷害對手遊戲AI
- 從《Apex Legends》看FPS遊戲手感的塑造(二):射擊篇遊戲
- 設計模式在 TypeScript 中的應用 – 策略模式設計模式TypeScript
- 戰鬥,射擊!探尋射擊遊戲發展的這些年遊戲
- Golang+Protobuf+PixieJS 開發 Web 多人線上射擊遊戲(原創翻譯)GolangJSWeb遊戲
- 淺談遊戲中槍械:什麼因素影響射擊遊戲中的槍?遊戲
- 【射擊遊戲】TPS對比FPS戰鬥設計差異與心得遊戲
- 世界觀架構之射擊遊戲技能設定架構遊戲
- 如何為射擊遊戲設計令人難忘的戰術戰鬥區域?遊戲設計
- 設計模式在vue中的應用(一)設計模式Vue
- 設計模式在vue中的應用(七)設計模式Vue
- 設計模式在vue中的應用(六)設計模式Vue
- 設計模式在vue中的應用(三)設計模式Vue
- 設計模式在vue中的應用(四)設計模式Vue
- 設計模式在vue中的應用(五)設計模式Vue
- 遊戲設計裡的那些色彩應用遊戲設計
- 遊戲基礎知識——“非絕對平衡設計”在多人遊戲中的影響遊戲
- 遊戲機制中的介面設計遊戲
- 射擊遊戲的原始模型——牛仔決鬥遊戲模型
- 設計模式應用場景之Model設計中可以用到的設計模式設計模式
- 設計模式之--策略模式及其在JDK中的應用設計模式JDK
- 乾貨:射擊遊戲中強烈的手感如何營造出來?遊戲
- .net core 中的經典設計模式的應用設計模式
- 用Swoole來寫個聯機對戰遊戲呀!(二)單機遊戲架構遊戲架構
- 設計模式 - 命令模式詳解及其在JdbcTemplate中的應用設計模式JDBC
- 遊戲機制設計:資源管理挑戰與遊戲中的AI設計遊戲AI
- 如何在程式碼中應用設計模式設計模式
- 【遊戲設計】淺談快速反應事件(QTE)的應用遊戲設計事件QT
- Unity射擊遊戲例項—物理碰撞的實現Unity遊戲
- 設計模式 - 迭代器模式詳解及其在ArrayList中的應用設計模式