游戲策劃咨訊
          做一個游戲并不難,難的是做一個好游戲;完美在于積累!
           

          場景管理之消息發(fā)送

              好久沒有寫東西出來和大家共同揣摩,真是對不住大家了。現(xiàn)在終于騰了一些時間來繼續(xù)和大家研究網絡游戲制作技術,在這一節(jié)中,我就要向大家介紹網絡游戲服務器中World場景劃分和場景中消息分發(fā)問題。

              在前面我基本向大家講述的都是一些基本的技術問題,從某種意義上講。屬于純技術范疇的東西,但現(xiàn)在要向大家講的,應該是屬于服務器功能設計范疇的。在這里,我未必講的很好,有遺漏之處就請大家諒解和指正。

              對于有一定游戲服務器開發(fā)基礎的朋友而言,應該都明白一個網絡游戲服務器和客戶端之間的一個基本關系: 玩家客戶端是游戲服務器一個局部COPY表現(xiàn)。這個說法聽起來可能有一些繞口,簡單的解釋下也就是說:客戶端所具備的區(qū)域信息也就是游戲服務器相同區(qū)域數據的一份COPY,而表現(xiàn)的意思,也就是說,CLIENT端將這樣的數據信息圖形化,并且通過屏幕來進行顯示,從而來呈現(xiàn)出一個多姿多彩的游戲世界。這樣說大家應該能夠聽懂了吧?再不懂的話,就自己琢磨了。

              說了上面那么多,大家一定要問“SERVER和CLIENT這種關系和我們的消息發(fā)送又有什么關系呢?”。其實,我們要討論的問題點也就在這里。但現(xiàn)在我還不說場景消息到底該如何進行分發(fā)。我們還是再來研究一個問題:什么能夠使我們的游戲世界變的內容豐富?
          大家先不要看我所說的,先自己想想。

              大家應該都思考過了,我就來說一下我的個人想法和理解,可能和大家不一樣(我想到的你沒有想到的你補上,反之,我補上)。

              在我們的MMOPRG游戲世界中,造成游戲世界變的豐富多彩一般無外乎兩個大方面:NPC動作、玩家動作。呵呵,看起來就只有簡單的兩個方面,但具體分析這些動作起來,可就會讓各位包括我都會頭大的。先我們來說NPC動作吧,NPC動作通過AI邏輯進行控制,一般情況可以分為一下幾個動作:待機、移動、物理攻擊、技能攻擊、魔法攻擊、死亡等,而游戲中玩家動作的產生是由現(xiàn)實中玩家進行操控的,動作類型基本上也不外乎以上幾種。既然在服務器游戲世界中存在這樣的一些動作,那是如何進行獲取的呢?其實就只有兩個字:消息(Message)。而消息的產生方又分為兩種:Client消息,Server消息。既然有消息產生,我們就將涉及到另外一個問題:如何將產生的消息分發(fā)出去呢?

              下面通過我自己的實現(xiàn)經驗來簡單介紹場景消息的分發(fā)原理(詳細介紹寫的太多,有點懶!!),應該不是最佳的,我只是提一個開頭,更好的處理實現(xiàn)方式還是需要大家來共同研究。有好的想法也希望告訴我下,我也從中學習些新的東西。

              先看場景示范圖(我畫的,比較土,只是表明一個意思。呵呵)


           
              通過上面設計示范圖,我來具體介紹:關于場景消息分發(fā),我的設計和分析過程:
              第一步:將場景網絡化,也就是說將我們的游戲服務器大場景進行邏輯上的區(qū)域劃分,每個單獨區(qū)域所占的面積可以考慮比屏幕區(qū)域稍微大點。同時為每一個單獨的區(qū)域創(chuàng)建Player標志信息(SOCKET或者其他)列表。

              第二步:將單獨區(qū)域四分化,也就是說對于每一個小區(qū)域,再次劃分為四個更加小的區(qū)域,同時為每一個小的區(qū)域建立一個包含三個對象的整數數組。數組的作用是為了保存此小區(qū)域的親緣區(qū)域。例如: 小區(qū)域1的親緣區(qū)域就是: A、B、H,小區(qū)域2的親緣區(qū)域就是:B、C、D等。

              第三步:在上面兩步基礎上,就是實際處理消息分發(fā)了。如果Player/NPC在區(qū)域中進行消息動作,我們通過Player/NPC的當前位置就可以首先確定Player/NPC所在大地圖中的具體區(qū)域。在我們確定好了具體的區(qū)域后,我們要繼續(xù)確定在那個具體的小區(qū)域。在這些小區(qū)域都確定后,我們就可以將我們的動作消息發(fā)送到親緣區(qū)域中的Player(玩家)。

              第四步:對于第三步的改變優(yōu)化,用CPU處理量來換取消息數量,具體做法也就是,在親緣區(qū)域中繼續(xù)區(qū)域化。也就是說消息不是發(fā)送到親緣區(qū)域中的所有Player(玩家),而是有選擇的發(fā)送到自身一定區(qū)域的玩家。這種優(yōu)化改革從某種意義上講,可以減少服務器總消息數量,但增大CPU處理量,而對于具體實現(xiàn),就需要大家去權衡了。

              以上也就是這個分析和處理過程了。同時關于這個場景處理的.h文件,我也就簡單的寫下,大家參考了。


          Class    GmapRegion
          {
             public:
          GmapRegion();
          ~ GmapRegion();
          void   GetBoardCastMsgList(POINT current_pos,LIST *);  //獲取當前位置廣播消息的Player列表。
          ……..
             private:
                  void   Init();
                  voud   Release();
                  bool   InitMapRegion(int  map_wis,int map_hei);         //地圖區(qū)域化
                  
             protected:
          }


          posted on 2005-02-13 11:56 藍色雪焰 閱讀(584) 評論(1)  編輯  收藏 所屬分類: 網絡游戲
          Comments
           
          主站蜘蛛池模板: 台湾省| 大安市| 和龙市| 安国市| 南汇区| 和田县| 新蔡县| 体育| 马尔康县| 大邑县| 河北区| 亳州市| 泸州市| 英吉沙县| 通州市| 林州市| 山东省| 罗源县| 广饶县| 沂南县| 方正县| 饶河县| 买车| 安西县| 剑川县| 普格县| 通州市| 桃园市| 宁陕县| 砀山县| 屏东县| 远安县| 普兰店市| 迭部县| 新余市| 康马县| 上饶市| 巴塘县| 江都市| 延津县| 什邡市|