下面我想來談談關於伺服器上npc的設計以及npc智慧型等一些方面涉及到的問題。首先,我們需要知道什麼是npc,npc需要做什麼。npc的全稱是(non-player character),很顯然,他是乙個character,但不是玩家,那麼從這點上可以知道,npc的某些行為是和玩家類似的,他可以行走,可以戰鬥,可以呼吸(這點將在後面的npc智慧型裡面提到),另外一點和玩家物件不同的是,npc可以復生(即npc***以後在一定時間內可以重新出來)。其實還有最重要的一點,就是玩家物件的所有決策都是玩家做出來的,而npc的決策則是由計算機做出來的,所以在對npc做何種決策的時候,需要所謂的npc智慧型來進行決策。
下面我將分兩個部分來談談npc,首先是npc智慧型,其次是伺服器如何對npc進行組織。之所以要先談npc智慧型是因為只有當我們了解清楚我們需要npc做什麼之後,才好開始設計伺服器來對npc進行組織。
npc智慧型
npc智慧型分為兩種,一種是被動觸發的事件,一種是主動觸發的事件。對於被動觸發的事件,處理起來相對來說簡單一些,可以由事件本身來呼叫npc身上的函式,比如說npc的死亡,實際上是在npc的hp小於一定值的時候,來主動呼叫npc身上的ondie() 函式,這種由事件來觸發npc行為的npc智慧型,我稱為被動觸發。這種型別的觸發往往分為兩種:
一種是由別的物件導致的npc的屬性變化,然後屬性變化的同時會導致npc產生一些行為。由此一來,npc物件裡面至少包含以下幾種函式:
class npc
這是乙個基本的npc的結構,這種被動的觸發npc的事件,我稱它為npc的反射。但是,這樣的結構只能讓npc被動的接收一些資訊來做出決策,這樣的npc是愚蠢的。那麼,怎麼樣讓乙個npc能夠主動的做出一些決策呢?這裡有一種方法:呼吸。那麼怎麼樣讓npc有呼吸呢?
一種很簡單的方法,用乙個計時器,定時的觸發所有npc的呼吸,這樣就可以讓乙個npc有呼吸起來。這樣的話會有乙個問題,當npc太多的時候,上一次npc的呼吸還沒有呼吸完,下一次呼吸又來了,那麼怎麼解決這個問題呢。這裡有一種方法,讓npc非同步的進行呼吸,即每個npc的呼吸週期是根據npc出生的時間來定的,這個時候計時器需要做的就是隔一段時間檢查一下,哪些npc到時間該呼吸了,就來觸發這些npc的呼吸。
上面提到的是系統如何來觸發npc的呼吸,那麼npc本身的呼吸頻率該如何設定呢?這個就好象現實中的人一樣,睡覺的時候和進行激烈運動的時候,呼吸頻率是不一樣的。同樣,npc在戰鬥的時候,和平常的時候,呼吸頻率也不一樣。那麼就需要乙個breath_ticker來設定npc當前的呼吸頻率。
那麼在npc的呼吸事件裡面,我們怎麼樣來設定npc的智慧型呢?大體可以概括為檢查環境和做出決策兩個部分。首先,需要對當前環境進行數字上的統計,比如說是否在戰鬥中,戰鬥有幾個敵人,自己的hp還剩多少,以及附近有沒有敵人等等之類的統計。統計出來的資料傳入本身的決策模組,決策模組則根據npc自身的性格取向來做出一些決策,比如說野蠻型的npc會在hp比較少的時候仍然猛撲猛打,又比如說智慧型的npc則會在hp比較少的時候選擇逃跑。等等之類的。
至此,乙個可以呼吸,反射的npc的結構已經基本構成了,那麼接下來我們就來談談系統如何組織讓乙個npc出現在世界裡面。
npc的組織
小談Online game伺服器端設計(3)
下面我想來談談關於伺服器上npc的設計以及npc智慧型等一些方面涉及到的問題。首先,我們需要知道什麼是npc,npc需要做什麼。npc的全稱是 non player character 很顯然,他是乙個character,但不是玩家,那麼從這點上可以知道,npc的某些行為是和玩家類似的,他可以行走,...
小談Online game伺服器端設計(4)
在這一章節,我想談談關於伺服器端的指令碼的相關設計。因為在上一章節裡面,談npc智慧型相關的時候已經接觸到一些指令碼相關的東東了。還是先來談談指令碼的作用吧。在基於編譯的伺服器端程式中,是無法在程式的執行過程中構建一些東西的,那麼這個時候就需要指令碼語言的支援了,由於指令碼語言涉及到邏輯判斷,所以光...
小談Online game伺服器端設計(4)
在這一章節,我想談談關於伺服器端的指令碼的相關設計。因為在上一章節裡面,談npc智慧型相關的時候已經接觸到一些指令碼相關的東東了。還是先來談談指令碼的作用吧。在基於編譯的伺服器端程式中,是無法在程式的執行過程中構建一些東西的,那麼這個時候就需要指令碼語言的支援了,由於指令碼語言涉及到邏輯判斷,所以光...