zoukankan      html  css  js  c++  java
  • 从服务器角度分析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,这里给了一个父类,具体功能都是在这个父类延伸出来的。这个父类中中添加了项目工程所需要的大量逻辑判断,这里不便直接给出脚本,而且脚本中引用了很多其他类,也无法直接使用。

      在服务器的逻辑中,无需处理显示表现部分,但是对于逻辑的处理必须要保持严谨。具体的行为逻辑,需要了解策划的需求后再定,尔后每个怪物会有哪些行为,也是由策划配表决定。

  • 相关阅读:
    MySQL的字符编码体系(一)——数据存储编码
    poj 1659 Frogs&#39; Neighborhood 度序列可图化 贪心
    POJ 1083 &amp;&amp; HDU 1050 Moving Tables (贪心)
    cocos2d-x wp8 中文显示问题
    Linux多线程编程
    how tomcat works 五 servlet容器 上
    SecureCRT 选择Courier New等其他字体.
    如何设置secureCRT的鼠标右键为弹出文本操作菜单功能
    SecureCRT中文显示乱码
    ZooKeepr日志清理
  • 原文地址:https://www.cnblogs.com/yangyadong66/p/9290835.html
Copyright © 2011-2022 走看看