【轉】多人聯機射擊遊戲中的設計模式應用(二)

(6)觀察者模式java

     聯機射擊遊戲能夠實時顯示隊友和敵人的存活信息,若是有隊友或敵人陣亡,全部在線遊戲玩家將收到相應的消息,能夠提供一個統一的中央角色控制類(CenterController)來實現消息傳遞機制,在中央角色控制器中定義一個集合用於存儲全部的玩家信息,若是某玩家角色(Player)陣亡,則調用CenterController的通知方法notifyPlayers(),該方法將遍歷用戶信息集合,調用每個Playerdisplay()方法顯示陣亡信息,隊友陣亡和敵人陣亡的提示信息有所不一樣,在使用notifyPlayers()方法通知其餘用戶的同時,陣亡的角色對象將從用戶信息集合中被刪除。可以使用觀察者模式來實現信息的一對多發送,類圖如圖6所示:web

6 觀察者模式實例類圖多線程

      在圖6中,CenterController充當觀察目標,Observer充當抽象觀察者,Player充當具體觀察者。在Player類中,name屬性表示角色名,type屬性表示角色類型,如「戰隊A」或「戰隊B」等。Playerdie()方法執行時將調用CenterControllernotifyPlayers()方法,在notifyPlayers()方法中調用其餘Player對象的提示方法,若是是隊友陣亡則調用displayTeam(),若是是敵人陣亡則調用displayEnemy();還將調用detach()方法刪除陣亡的Player對象,其中CenterController類的notifyPlayers()方法代碼片斷以下所示:app

[java]   view plain copy
  1. for(Object player : players) {  
  2.     if(player.getName().equals(name)) {  
  3.       this.detach(player);  //刪除陣亡的角色  
  4.      }  
  5.     else {  
  6.         if(player.getType().equals(type)) {  
  7.             player.displayTeam(name);  //隊友顯示提示信息  
  8.          }  
  9.         else {  
  10.             player.displayEnemy(name);  //敵人顯示提示信息  
  11.           }  
  12.     }  
  13. }  

 

 

 

      (7)單例模式ide

      爲了節約系統資源,在聯機射擊遊戲中能夠使用單例模式來實現一些管理器(Manager),如場景管理器(SceneManager)、聲音管理器(SoundManager)等,如圖7所示的場景管理器SceneManager類:oop

7 單例模式實例類圖this

       SceneManager類的實現代碼片斷以下所示【注:如下代碼未考慮多線程訪問的問題】:url

[java]   view plain copy
  1. class SceneManager {  
  2.     private static SceneManager sManager = null;  
  3.   
  4.     private SceneManager() {  
  5.         //初始化代碼  
  6.     }  
  7.   
  8.     public synchronized static SceneManager getInstance() {  
  9.         if(sManager==null) {  
  10.             sManager = new SceneManager();  
  11.         }  
  12.         return sManager;  
  13.     }  
  14.   
  15.     public void manage() {  
  16.         //業務方法  
  17.     }  
  18. }  

 

 

(8)狀態模式spa

      在射擊遊戲中,遊戲角色存在幾種不一樣的狀態,如正常狀態、暫停狀態、陣亡狀態等,在不一樣狀態下角色對象的行爲不一樣,可以使用狀態模式來設計和實現角色狀態的轉換,類圖如圖8所示:.net

8 狀態模式實例類圖

       在圖8中,遊戲角色類Player充當環境類,State充當抽象狀態類,其子類NormalStatePauseStateDeathState充當具體狀態類,在具體狀態類的pause()start()beAttacked()等方法中可實現狀態轉換,其中NormalState類的代碼片斷以下所示:

[java]   view plain copy
  1. class NormalState extends State  
  2. {  
  3.     public void pause()  //遊戲暫停  
  4.     {  
  5.         //暫停代碼省略  
  6.         player.setState(new PauseState(this));  //轉爲暫停狀態  
  7.     }  
  8.     public void start()  //遊戲啓動  
  9.     {  
  10.         //遊戲程序正在運行中,該方法不可用  
  11.     }  
  12.     public void beAttacked()  //被攻擊  
  13.     {  
  14.         //其餘代碼省略  
  15.         if(lifeValue<=0)  
  16.         {  
  17.             player.setState(new DeathState(this));  //轉爲陣亡狀態  
  18.         }  
  19.     }  
  20.     public void shot()  //射擊  
  21.     {  
  22.         //代碼省略  
  23.     }  
  24.     public void move()  //移動  
  25.     {  
  26.         //代碼省略  
  27.     }  
  28. }  

 

(9)適配器模式

       爲了增長遊戲的靈活性,某些射擊遊戲還能夠經過遊戲手柄來進行操做,遊戲手柄的操做程序和驅動程序由遊戲手柄製造商提供,爲了讓當前的射擊遊戲能夠與遊戲手柄兼容,可以使用適配器模式來進行設計,類圖如圖9所示:

9 適配器模式實例類圖

       在圖9中,GamepadsAdapter充當適配器,它將遊戲手柄中按鍵(GamepadsKey)的方法適配到現有系統中,在其move()方法中能夠調用MoveKey類的handle()方法,在其shot()方法中能夠調用ShotKeyhandle()方法,從而實現經過手柄來控制遊戲運行。

 

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

相關文章
相關標籤/搜索