WEB开发网
开发学院软件开发C语言 C#开发WPF/Silverlight动画及游戏系列教程(Game C... 阅读

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

 2010-09-30 20:46:54 来源:WEB开发网   
核心提示: 同样的也可以在每次移动时这样创建新的Storyboard: private void NewSpiritStoryboard(string key) { if (!Super.storyboard.ContainsKey(key)) { Super.storyboard.Add(key, new

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

     private void NewSpiritStoryboard(string key) {

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

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

         }

     }

额外的,我们也可以使用类似的方法在精灵停止跑动时或死亡时移除掉对应的Storyboard以释放资源。

以创建精灵对象AI为目的的重构完成后,接下来需要进行具体功能的实现—如何启动AI?

从原理上我们可以这样设定:每个怪物精灵赋予一个索敌范围(视线距离)SeekRange,当玩家进入这个区域后他就会将攻击对象锁定为玩家并向其发起攻击;该索敌范围同样为以怪物精灵X、Y坐标为圆心,以视线距离为半径的圆,判断方法可以复用上一节中的InCircle():

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

大家在玩网游的时候是否注意到,玩家引怪容易,甩怪却需要更长一些的时间与距离。难道我们还得多设定一个OutRange来定义摆脱怪物视线的距离?这里其实有个小技巧,仅仅SeekRange一个参数就够了。我们可以将怪物索敌方法放在游戏的辅助线程的异步方法中,这样怪物每间隔1秒进行1次扫描,因此主角在与怪物距离小于SeekRange时即会引上怪,而只有当主角与怪物的距离大于SeekRange并持续1秒后才能甩掉怪物,这样就间接的产生了两个距离:索敌距离与摆脱距离:

private void RefreshFace(){

  ……

if (spirit.VLife != 0

&& Super.InCircle(Leader.X, Leader.Y, spirit.X, spirit.Y, spirit.SeekRange)

&& IsOpposition(spirit, Leader)) {

                            spirit.LockObject = Leader.Name;

                        } else {

                            spirit.LockObject = null;

                        }

  ……

}

当怪物视线范围内发现主角时,锁定它为攻击目标;一旦视线范围内无法找到主角且持续1秒以上则取消攻击锁定,此时怪物会停止追踪原地站立。

至此就全部完成了。“追踪者”AI的实现其实也不过如此,下面是三张运行测试图:

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

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

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

怪物们已经具备了索敌与战斗AI,尽管是简单的智慧,但这在MMORPG中占据着80%AI份额呢,嘿嘿,小有成就吧?仅仅的砍杀或许太过单调了一些,华丽即将登场,下一节我将为大家展示一场魔法盛宴,敬请期待。

出处:http://alamiye010.cnblogs.com/

上一页  1 2 3 

Tags:开发 WPF Silverlight

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接