多人聯機射擊遊戲中的設計模式應用(二)
(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】
相關文章
- 多人聯機射擊遊戲中的設計模式應用(一)遊戲設計模式
- 設計模式在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在餐館中的應用設計模式
- 設計模式 - 迭代器模式詳解及其在ArrayList中的應用設計模式
- 對設計模式應用的疑惑設計模式
- Spring框架中的設計模式(二)Spring框架設計模式
- 淺談設計模式在建安系統中的應用設計模式
- 物聯網的應用模式模式
- Attribute 在.NET程式設計中的應用(二) (轉)程式設計
- 設計模式 | 策略模式及典型應用設計模式
- javascript設計模式與應用JavaScript設計模式
- 設計模式應用舉例設計模式
- 設計複合應用程式:設計模式設計模式
- Web應用的快取設計模式Web快取設計模式
- 設計模式及其在spring中的應用(含程式碼)設計模式Spring
- Opendaylight 中 關於工廠設計模式的應用設計模式
- 聯合體在微控制器程式設計中的應用程式設計
- Java設計模式——觀察者模式的靈活應用Java設計模式
- 設計模式 | 外觀模式及典型應用設計模式
- 設計模式 | 享元模式及典型應用設計模式
- 設計模式 | 模板方法模式及典型應用設計模式
- 設計模式 | 組合模式及典型應用設計模式
- 設計模式 | 觀察者模式及典型應用設計模式
- 設計模式 | 中介者模式及典型應用設計模式
- <多人PvP射擊遊戲融入開放世界玩法>地圖與關卡設計要點遊戲地圖