設計模式在一些大型的軟體系統中非常常用,用來處理復雜的結構和邏輯,游戲其實也是一個軟體系統,也會有龐大的系統,復雜的邏輯關系,對設計模式的合理使用可以幫助我們更好的去組織各個系統模塊,優化邏輯關系,使之可以更好的維護和拓展,本文對常用的設計模式在游戲中的應用進行討論,而不對設計模式的原理進行過多的闡述了,本文的例子代碼也是偽代碼,不能夠運行,
命令模式
1.通俗的定義
將一組行為抽象為物件,使用不同的組合方式來執行命令,以實作解耦,本文介紹的命令模式可能與GoF上的稍有不同,是我自己對游戲開發中設計模式應用的理解,
2.結構圖如下(圖片來源與網路):

3.游戲開發中的使用
考慮以下場景,假如我們在設計一款RPG游戲,在野外地圖肯定會有野怪,野怪會有一些AI邏輯,我們打算設計一套合理的怪物模塊,大概如下:

大體設計包含了怪物行走、攻擊和逃跑三個通用的行為特征,很快策劃提出了新需求,要加入精英怪物型別,并且精英怪物有他自己獨特的邏輯,嗯,幸好我們抽象出了怪物基類,只要繼承過來,再增加新的行為即可,新增的精英怪物如下:

這樣就很快的實作了新的需求,EliteMonster繼承了Monster基礎行為,并且增加了新的行為,接著沒過多久策劃又提出我們要有BOSS,是的,游戲怎么能沒有BOSS呢,好吧我們來添加,畢竟我們設計好了基礎行為,只要繼承過來,在添加新的行為就好了:

看來我們的代碼還是挺健壯的,每次都可以快速的增加新的怪物,但是緊接著新都修改需求提出來了:我們要讓BOSS擁有精英怪物的行為,怎么辦?還好,我們的程式足夠健壯,修改一下繼承關系就好了,我們讓BossMonster來繼承EliteMonster,雖然修改繼承關系看起來很危險,但是我們還是完美的解決了問題,BOSS擁有了新的行為,經過一段時間,我們有設計了新的怪物:

這時不幸的訊息傳來了:我們想讓BOSS同時擁有精英怪物和普通怪物的行為!現在我們有幾種解決方案:
1.把精英怪物的行為和普通怪物的行為,封裝到Monster里,作為基礎行為,但是這樣的話,就是所有怪物都會繼承這兩種行為,這種多余的基礎是我們不想看到的,
2.就是把SimpleMonster的行為復制一份給BOSS,讓BOSS在繼承EliteMonster的同時擁有SimpleMonster的行為,但是這樣就會有代碼的冗余,后面我們修改這種行為的時候就要在兩個地方修改,
3.就是期望你使用的語言可以多繼承,然而多繼承并不是一個好的特性和方案,
這時我們想一想,算了,代碼冗余就冗余一下吧,畢竟大多數需求我們還是可以很好的實作的,就在我們覺得可以滿足需求時,更糟糕的需求又提交過來了:我們需要掛機功能,玩家的角色需要實作一部分AI功能,這時就麻煩了,我們怎么調整這個繼承關系,讓Player繼承誰?看起來繼承誰都不太合理,這時我們就要思考一下到底該怎么設計行為這部分,才能讓我們適應各種需求的改動,看一下下面這種設計:

行為物件都繼承GameActor,可以隨時增加新的物件,行為命令需要傳入一個行為物件來執行行為動作,這里命令與物件進行了解耦,命令與物件可以隨意增加與組合,CommondInvoke也可以進一步優化,可以執行多條命令,可以倒序或順序執行,可以同步或異步,甚至可以隨時添加、洗掉和修改,多個命令的組合也是命令模式的一個特點,此外命令模式還可以處理事務回滾:

事務回滾這個特性在服務器中比較常用,比如玩家的一次購買行為,肯定是要保障金錢扣除,道具添加同時打成,否則就算是事務失敗,要把修改的內容還原,這時就可以呼叫undo進行回滾,
最后邀請大家參與一個skynet的分享直播:
十年游戲開發大佬直播分享:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/246624.html
標籤:其他
上一篇:C++迷宮游戲
