本节,我将完成本教程示例游戏的最终两个魔法:传说中的连锁闪电与暴风雪。如此经典与华丽的家伙无论在哪款好游戏中都少不了它们的踪影。
首先是连锁闪电,在《英雄无敌》中体现得尤为出色,击中一个怪物后,闪电会继续向它周围延续,连锁到下一个怪物并对其进行第二次攻击,接着重复前面步骤往周围延续,直到次数达到连锁次数上限或周围已没有其他怪物为止。当然,每一次攻击产生的伤害及附加属性都会少于前一次,例如在本教程示例游戏中,我将连锁闪电设定为每一级连锁攻击力都较头一次减半,且附加麻痹属性的时间也减半,这些数据均记录在Config.xml魔法配置文件中,非常有意思,大家可以通过AffectedNum来自由设定不同等级能连锁的次数上限,例如3级连锁闪电可最多3次连锁等等:
<Level Value="3" ATK="380" Consumption="20" AdditionalEffect="90" AdditionalEffectTime="8" AffectedNum="3"/>
那么在Silverlight中我们是如何进行这些连锁处理的呢?其实我们可以把整个释法过程分成3个步骤,第一步,捕捉要攻击对象及其周围在连锁闪电攻击半径Radius内小于或等于AffectedNum的敌对精灵对象,放入一个List<QXSprite>中(其中第一个即为被鼠标点中的攻击对象);第二步,类似第四十七节中的单体飞行魔法原理,通过Storyboard创建飞行动画,并在动画Completed事件时触发对第一个怪物的第一次伤害;第三步,以该怪物中心为起点,再次创建Storyboard飞行动画,将魔法飞行到List<QXSprite>中的第二个怪物中心,并触发连锁闪电的第二次攻击,后面的依次类推,直到连锁完成(List<QXSprite>中所有对象均伤害一次):
接下来是暴风雪,就好比《传奇》中的火墙,它的大致原理类似本教程中的群攻魔法,不同的是它的伤害性质为多段的,即该魔法将一直循环播放,不同等级的暴风雪持续时间不同,例如我将9级暴风雪持续时间设置为7000毫秒:
<Level Value="9" ATK="150" Consumption="100" AdditionalEffect="280" AdditionalEffectTime="4" AffectedNum="7000"/>
只要进入该魔法攻击范围内的所有敌对精灵均会遭受伤害,伤害间隔可以通过参数来设定,这里我设置为每间隔600毫秒定值进行一次伤害:
if (totalTime > AffectedNum) {
Timer.Tick -= Timer_Tick;
Super.RemoveObject(this, true);
} else {
if (totalTime == 0) { Super.DoInjure(this); }
totalTime += TimerInterval.Milliseconds;
count += TimerInterval.Milliseconds;
if (count >= 600) {
Super.DoInjure(this);
count = count - 600;
}
在本教程示例游戏中,暴风雪附加的是冰冻效果,由于我并未为系统加入魔法命中率及附加效果命中率系统,因此只要被该魔法击中基本上怪物只有死路一条,嘿嘿。实际制作中该类型魔法应该尽量少的附加效果,或者加入低附加效果命中,游戏才会更具趣味性,尤其在PK中:
魔法类型其实还有很多,本教程中的魔法类型基本上已经囊括了目前市面上游戏中的大多数种类,其他的如全屏魔法,联协魔法,镜象魔法等等更多高级的魔法大家可以自行尝试制作,游戏开发不需要拘泥于传统,新奇的事物更能吸引玩家的注意与兴趣。还是回到创新这个词上,有创意的事物都会体现出鲜活的生命力,它是进步的象征,将驱动一切的前进。
到此为止,完成了本教程物理攻击及魔法的所有设计与制作。由于此引擎设计之初就是为了配合教程教学的,因此功能模块都是时时的不断添加更新,代码难免有些丑陋,同时也少不了面向过程的内容与高耦合度。希望大家还是以理解为主,思想是一切的根源嘛。
最后感谢朋友们长期以来对我的支持,我一直在期待Silverlight4的降临,到时我将为此引擎重新来过,让其完全的面向对象,减少初级的成分,让朋友们都能参与到设计中来,一同体验一同进步。
当脑海中时常浮现未来的景色,那么,离它已不再遥远了。
出处:http://alamiye010.cnblogs.com/
教程目录及源码下载:点击进入(欢迎加入WPF/Silverlight小组 WPF/Silverlight博客团队)
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。