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

Liuwei-Sunny發表於2012-12-06

      (6) 觀察者模式

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

6 觀察者模式例項類圖

      在圖6中,CenterController充當觀察目標,Observer充當抽象觀察者,Player充當具體觀察者。在Player類中,name屬性表示角色名,type屬性表示角色型別,如“戰隊A”或“戰隊B”等。Playerdie()方法執行時將呼叫CenterControllernotifyPlayers()方法,在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充當抽象狀態類,其子類NormalStatePauseStateDeathState充當具體狀態類,在具體狀態類的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()方法中可以呼叫ShotKeyhandle()方法,從而實現通過手柄來控制遊戲執行。

 

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

相關文章