C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十九)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十九) 人工智能(AI)之追踪者

经过前面28节的不断完善,主角已经具备了MMORPG游戏中的大多数功能;但是其他精灵例如怪物等暂时还是无法行动的,上一节中它们无辜的充当了主角的肉靶子,它们开始呐喊:上帝呀,请给予我们灵魂与智慧吧!其实灵魂早就有了,就是精灵的生命线程。那么该如何赋予精灵智慧呢?

精灵智慧的实现其实就是为精灵赋予AI(人工智能)。完整的游戏引擎或多或少都必须拥有一定的AI,例如棋牌类型游戏有着它们独特出牌AI,射击类型游戏同样也拥有相应的计算AI等等。AI的类型在不同类型游戏中有着不同的体现与定位,可深可浅,甚至无限扩充的可能。在MMORPG类型的游戏中则以“追踪者”为最基础的精灵用AI,同时也是游戏中使用率高达80%以上的AI类型。何谓“追踪者”?简单的说就是当怪物发现敌对玩家或是其他敌对精灵时即会锁定目标并向其位置移动,一旦对方进入自己的攻击范围后即刻发起物理或魔法攻击;同时,如果对方跑开,自己会继续追击且循环重复前面过程,就好比一个幽灵缠着你。这段描述大家是否有种四曾相似的感觉?没错,“追踪者”AI其实就是上一节中主角战斗功能模块实现的最直接体现。下面我将为大家讲解如何通过代码实现怪物的“追踪者”人工智能。

游戏AI设计同样是对游戏引擎框架合理性的重要考验,大家回想一下,主角与怪物均为QXSpirit类型控件,通过前面的章节我们已经实现了主角大多数的功能,如移动、攻击、追击、伤害等等;同样的,我们是否可以将用于实现这些功能的方法为其他所有精灵通用?这是肯定的。比如障碍物预测使用的方法WillCollide(),直线移动方法StraightMoveTo(),寻路移动方法AstarMoveTo(),判断移动到达目的地方法ArriveTarget()等等,这些方法在前面章节中均是无参数的,里面的处理均以Leader为主元素进行相应的属性设置及修改。此时我们不妨为这些方法均添加一个QXSpirit spirit参数,然后将方法里的Leader全部改成spirit;如此,在除法AI后,所有的精灵对象就都可以重用这些方法了:

举个例子,好比原先的ArriveTarget()方法写法如下:

private bool ArriveTarget() {

 return (storyboard != null && storyboard.GetCurrentProgress(Leader) == 1) ? true : false;

}

改成AI通用的则为:

private bool ArriveTarget(QXSpirit spirit) {

 return (Super.storyboard.ContainsKey(spirit.Name) && SpiritStoryBoard(spirit.Name).GetCurrentProgress(spirit) == 1) ? true : false;

}

不光是多了个参数,同时大家是否有注意到我将storyboard定义成了一个字典以存放所有精灵的移动动画板:

public static Dictionary<string, Storyboard> storyboard = new Dictionary<string, Storyboard>();

每个精灵在移动的时候会首先判断以自身名字(spirit.Name)为键名的Storyboard键值是否存在,如果不存在则创建一个新的,接着在此Storyboard上执行移动属性动画,例如直线移动方法改为:

private void StraightMoveTo(QXSpirit spirit, Point p) {

 ……

 if (!Super.storyboard.ContainsKey(spirit.Name)) { Super.storyboard.Add(spirit.Name, new Storyboard()); }

……

}

使用字典来管理所有精灵的移动动画板即方便又高效,我们只需要通过Lambda即可以轻松获取指定键名的Storyboard:

private Storyboard SpiritStoryBoard(string key) {

 return Super.storyboard.Single(X => X.Key == key).Value;

}

同样的也可以在每次移动时这样创建新的Storyboard:

private void NewSpiritStoryboard(string key) {

 if (!Super.storyboard.ContainsKey(key)) {

  Super.storyboard.Add(key, new Storyboard());

 }

}

时间: 2024-10-26 05:58:38

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十九)的相关文章

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十九)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十九) 完美精灵之八面玲珑(WPF Only)③ 首先我要对C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十八) 完美精灵之八面玲珑(WPF Only)②中最后的ChangeAction()方法进行一些补充说明.该方法的作用之一是根据精灵的当前动作(Action)来设置精灵切图动画的起始帧和结束帧: 如上图,我们可以很清楚的看到精灵这5个动作所分别对应的CurrentSt

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十)斜度α地图的构造及算法 在当前的网络游戏中,地图基本都是采取一定斜度的拼装地图,这其中存在两种斜度地图的构造方式: 第一种我称之为伪斜度地图:该类型地图表现层图片为斜度的,但地图基底障碍物等的构造则实为正方形,如下图: 其实最典型的例子就是上一节所演示的内容了,地图是斜的,但是我们却用垂直的障碍物对其进行基底布局,这就是典型的伪斜度地图了. 这样的地图优点在于可以使用简单直接的地图构造算法(上一节中有详细的

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十八)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十八) 完美精灵之八面玲珑(WPF Only)② 紧接着上一节,首先得解释一下为什么需要将这272张图片合成为一张大图.因为如果游戏中还有装备.坐骑等其他设置,那么我们就需要对图片源进行时时的合成:同时对272张甚至更多的图片进行合成效率高还是对2张大图进行合成效率高这是显而易见的.在本节例子中,主角由身体(衣服)及武器两个部分组成:因此,我们还需要定义一个交错数组来保存已经加载的角色装备合成图到内存中: //

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十六)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十六) 牵引式地图移动模式② 精灵控件让游戏开发更美好!有了它,离完善牵引式地图移动模式可谓一步之遥.只剩下最后一个环节了,大家加油吧. 上一节,(C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十五) 精灵控件横空出世!② )我在界面线程中通过时时设置Canvas.SetLeft(Spirit, mapleft + Spirit.X);和Canvas.SetTop(Spi

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十五)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十五) 精灵控件横空出世!② 紧接着上一节,我们打开QXSpirit.xaml.cs文件.在游戏设计中,为了能够轻易控制及管理精灵的各项属性及功能等,我赋予每个精灵一个专属线程,它在精灵的使用中起到关键作用: public QXSpirit() { InitializeComponent(); InitThread(); //初始化精灵线程 } DispatcherTimer Timer = new Dispa

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十四)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十四) 精灵控件横空出世!① 在上一节中,我们实现了地图牵引式移动,同时还遗留着一个小尾巴:主角和障碍物该如何跟随着地图的移动而移动? 上节中有点到,只要在地图移动的同时,时时根据主角等对象物体的X,Y坐标进行相对于地图的X,Y坐标移动即可达到目的.但是由此又引来了新问题:主角为Image控件,障碍物则为矩形控件,它们都没有X,Y这两个属性,我们该如何对它们的坐标进行记录呢? 最简单且最直接的方法莫过于将它们的

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十二)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十二)神奇的副本地图 前面几节详细的讲解了游戏地图的完整构造,比较有难度的是关于地图内层如障碍物的实现.A*算法往往能让众多的初学者望而止步,斜度α地图则更需要一定的几何知识及抽象思维.很多朋友就问了:什么年代了,都在说面向对象.提高开发效率,难道就没有大众化可以让各层次能力的朋友们都能轻松制作地图引擎的方法吗?大家是否还记得上一节中遗留的一个小悬念,杀手涧就是它了:神奇的副本地图. 大家先看上图,左边的是地图

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十) 第一部分拓展小结篇 写了20节,一路向追着鬼子打一样都没停过,索性也想暂时休息一下整理整理思绪好完成后面的第二部分更为精彩的内容:诸如跟随式地图移动模式.NPC & 怪物 与主角的互动.对象AI.攻击与魔法.各种类型伤害计算.完美的RPG游戏界面--等等等等,激动吗?讲实话:我很激动! 读者声音:还没写就开始激动了,典型的傻子. ^_^||言归正传,本节就先来个承上启下的的小结吧,我打算分4个部分对前2

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十七)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十七) 完美精灵之八面玲珑(WPF Only)① 通过C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十四) 精灵控件横空出世!①.C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十五) 精灵控件横空出世!②的学习,我们掌握了如何创建一个初具雏形的精灵控件.目前我已经赋予了它少量的属性,但是离完美还有很长的距离.因此,我打算在后面的章节

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(三十二)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(三十二) 雷.混.冰.毒.火.风 - 幻化中的魔法魅力 本节,我将为大家演示如何为游戏中的魔法增加华丽的附加属性. 第一步,定义规则: 1)定义魔法附加属性分类:在本教程示例游戏中,我将魔法附加属性定义为6类:雷.混.冰.毒.火.风,为什么要以这样无规律的方式去命名?因为是教程,我们需要学习的是如何实现对应效果,此6类属性算是目前网游中最流行的六大魔法属性,如果大家都掌握了,无论是中国式5行还是诸如其他的风格设