從服務器角度分析RPG游戲——NPC的AI


  最近主程有些忙,甩給我一些服務器的代碼,零零散散總結了一些要素。

  java程序架構也是層層分析,先羅列出需要做的工作,然后從主干到細節依次實現。就這點而言,程序和繪畫有很多類似的地方。

  關於怪物AI類型,一般可以分為下列幾類:

// NPCai性格
	public static final int MONSTER_CHARACTER_PASSIVITY = 1; // 被動怪,不打我我不打你,打我我打你
	public static final int MONSTER_CHARACTER_ACTIVITY = 2; // 主動怪,見誰打誰
	public static final int MONSTER_CHARACTER_TIMID = 3; // 木樁怪,不移動,不攻擊,不回血
	public static final int MONSTER_CHARACTER_STANDING = 4; // 站樁輸出怪(防御塔)
	public static final int MONSTER_CHARACTER_PITFALL = 5; // 機關型怪物
	public static final int MONSTER_CHARACTER_TIMIDOC = 6; // 木樁怪,不移動,不攻擊,脫戰回血
	public static final int MONSTER_CHARACTER_PURPOSE = 7; // 目標列表主動怪 優先攻擊設定好的目標
	public static final int MONSTER_CHARACTER_TRUCK = 8; //鏢車型怪物,只做特定路徑移動,不攻擊。可被攻擊。

  怪物AI的狀態,可以分為:

// npc狀態
	public static final int NPCSTATE_INVALID = -1;//無效
	public static final int NPCSTATE_PATROL = 1; // 休閑態
	public static final int NPCSTATE_TRACE = 2; // 追擊態
	public static final int NPCSTATE_ATTACK = 3; // 攻擊態
	public static final int NPCSTATE_OUTCOMBAT = 4; // 脫戰
	public static final int NPCSTATE_RETREAT = 5; // 后退
	public static final int NPCSTATE_FORCE_TRANSFER = 6;// 強制轉移到某點,清空怪物仇恨列表,不攻擊,不追擊,可被擊
	public static final int NPCSTATE_FORBID = 7; //禁身狀態 站着不動挨打掉血

  怪物歸屬,一般可以分為:

// 怪物歸屬相關
	public static final int NPC_OWNER_PLAYER = 1; // 怪物屬於個人
	public static final int NPC_OWNER_TEAM = 2; // 怪物屬於隊伍

  怪物的類型,這里需要用到表中的數據。事實上,策划負責配表和設計,程序負責功能的實現。這里用到了MonsterBase這張表,就接觸到的策划而言,也都喜歡在繼承的表前加Base,之后所有的子表都繼承於這套總表。閑話少說,接着分析怪物的類型:

 

public static final int MONSTER_TYPE_COPY_MONSTER = 2;//MonsterBase表怪物類型:副本小怪
	public static final int MONSTER_TYPE_COPY_ELITE = 4;//MonsterBase表怪物類型:副本精英
	public static final int MONSTER_TYPE_COPY_BOSS = 6;//MonsterBase表怪物類型:副本BOSS
	public static final int MONSTER_TYPE_WORLDBOSS = 7; // 世界Boss的MonsterType,對應MonsterBase表
	public static final int MONSTER_TYPE_BOX_ELITE = 8; // 寶箱精英怪MonsterType,他死了所有打他的人都有獎勵
	public static final int MONSTER_TYPE_GANG_BEAST = 9; //幫會神獸的類型

 

  怪物/NPC的生成是在服務器控制的,客戶端除了表現畫面外,不負責任何邏輯的處理。這里把不同怪物生成數量固定為不同的數組,所謂殺怪,就是對這些數組中的數據進行操作(如果要我來寫這段代碼的話,會用list<class>+number的形式來處理,而不會這樣對數組進行操作)。

  接下來處理怪物的AI,這里給了一個父類,具體功能都是在這個父類延伸出來的。這個父類中中添加了項目工程所需要的大量邏輯判斷,這里不便直接給出腳本,而且腳本中引用了很多其他類,也無法直接使用。

  在服務器的邏輯中,無需處理顯示表現部分,但是對於邏輯的處理必須要保持嚴謹。具體的行為邏輯,需要了解策划的需求后再定,爾后每個怪物會有哪些行為,也是由策划配表決定。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM