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

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

原文地址:https://www.cnblogs.com/yangyadong66/p/9290835.html

时间: 2024-11-01 18:47:23

从服务器角度分析RPG游戏——NPC的AI的相关文章

英雄传说3 白发魔女 作为RPG游戏的成就分析

通关了psp上的英雄传说3白发魔女,有些感想,这里记录一下. 英雄传说3白发魔女,讲述的故事非常简单,两个主角,杰立欧和克莉丝,由于村庄的风俗在成年之时离开村庄,环绕世界进行巡礼.经过五个特别的国家,每个国家都有一个称为夏路的建筑,在其中需要使用随行携带的银色短剑触发一面魔法镜,然后查看魔法镜中显示的 影像.这些影像是对未来的预测.看完每个夏路的影像后绕回村庄,完成巡礼,从此成人. 而在巡礼过程中,他们不断的得知关于20年前跨国巡礼的白发魔女的传言,白发魔女走了和他们相同的路,在每个国家都留下了

传奇源码分析-客户端(游戏逻辑处理源分析四)

现在假设玩家开始操作游戏:传奇的客户端源代码工程WindHorn一.CWHApp派生CWHWindow和CWHDXGraphicWindow.二.CWHDefProcess派生出CloginProcess.CcharacterProcess.CgameProcess客户端WinMain调用CWHDXGraphicWindow g_xMainWnd;创建一个窗口.客户端CWHDXGraphicWindow在自己的Create函数中调用了CWHWindow的Create来创建窗口,然后再调用自己的C

传奇源码分析-客户端(游戏逻辑处理源分析五 服务器端响应)

器执行流程:(玩家走动) GameSrv服务器ProcessUserHuman线程处理玩家消息:遍历UserInfoList列表,依次调用每个UserInfo的Operate来处理命令队列中的所有操作; pUserInfo->Operate()调用m_pxPlayerObject->Operate()调用.判断玩家if (!m_fIsDead),如果已死,则发送_MSG_FAIL消息.我们在前面看到过,该消息是被优先处理的.否则则调用WalkTo,并发送_MSG_GOOD消息给客户端.Walk

传奇源码分析-客户端(游戏逻辑处理源分析三)

6. 接收怪物,商人,其它玩家的消息:ProcessUserHuman:(其它玩家-服务器处理)CPlayerObject->SearchViewRange();CPlayerObject->Operate();遍历UserInfoList列表,依次调用每个UserInfo的Operate来处理命令队列中的所有操作; pUserInfo->Operate()调用m_pxPlayerObject->Operate()调用.根据分发消息(RM_TURN)向客户端发送SM_TURN消息.

RPG游戏设计(转自Gameres)

目录: 第一章 概述 第二章 场景 第三章 角色 第四章 道具 第五章 事件 第六章 对白 第七章 语音和音效 第八章 音乐 第九章 界面 第十章 规则 第十一章 命名 第一章:概述 RPG游戏即角色扮演游戏(Role Personate Game),玩家需要扮演游戏中的一位或者多位角色,在虚拟的世界中进行冒险.首先,让我们先来认识RPG游戏,从表现形式和玩法上,它可以分为以下几种: RPG:普通RPG游戏,有专门的战斗画面.战斗画面用不同的视角来表现: 采用斜45度视角,如台湾<仙剑奇侠传>

传奇源码分析-客户端(游戏逻辑处理源分析二)

5.接受登录成功后,接收GameSrv服务器发送的消息:接收GameGate发送的消息:CClientSocket::OnSocketMessage的FD_READ事件中,PacketQ.PushQ((BYTE*)pszPacket);把接收到的消息,压入PacketQ队列中.处理PacketQ队列数据是由CGameProcess::Load()时调用OnTimer在CGameProcess::OnTimer中处理的, 处理过程为:OnMessageReceive; ProcessPacket(

Cocos2D-ObjC:在RPG游戏中混合Swift代码

我之前写过一个RPG游戏<<熊猫之魂 SoulOfPanda>> 编译器使用的是SpriteBuilder,很好很强大!全部代码都由Objc完成,现在想尝试一下在其中混入Swift代码. 我的目的很简单,用Swift写一个GCMan9类,派生自Objc中的GameCharacter类,最后在Objc中使用GCMan9这个类. GameCharacter类是游戏人物的基类,我从中派生了十几个子类分别表示游戏主角,各种NPC,各种敌人等等. 下面是GCMan1类的头文件: #impor

从技术的角度分析我们到底需要什么样的CRM

尽管我们仍然对大数据以及所谓的"数字化决策"怀有戒心,但是我们对CRM的热情依然不减.在"营销即价值交换"的共识下,客户关系管理是数字营销的起点和终点,也是粉丝经济.体验经济等"新经济"的战略支点和实现平台.    上世纪80年代初,由Oracle.Siebel 带领的软件公司开创了CRM行业,把电讯科技带入了传统销售.90年代末,Salesforce.com在1999年第一次将CRM带入了云,用户通过浏览器即可使用.当年贝恩咨询的三位大牛 Da

unity商店demo学习:俯视视角RPG游戏

一下所有素材和源码都来自unity商店的实例 Top-Down RPG Starter Kit ,这个demo是unity商店上最好的入门级rpg游戏实例,麻雀虽小,五脏俱全,想要弄清楚一个标准的rpg游戏的方方面面,这个是很好的选择. ps:demo写得很高深,看得不是很懂,准备慢慢研究. 来一张工程全貌图. 这是一个俯视视角(可以调整视角)的卡通风格3D角色扮演游戏,配着动听又欢快的背景音乐,还有那萌萌哒的怪物,仿佛又回到了初中时玩冒险岛online的时候~~,额,不废话,主要模块如下: 游