• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十) 大法师 – 华丽经 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

仅以此文献给曾经的旷世经典 大法师(T4C 又名第四次审判)

从红白机到PS3,从286到奔腾N核;曾记否孩时的回忆?与玩伴并肩闯关。往日的经典已化为过眼烟云,那些神话般的游戏角色是否仍徘徊于你的梦里?UO开创了网络游戏新时代,虚拟世界敞开了魔幻华丽的心扉;于是我坚定了信念,用自己的双手去开启这道华丽的轮回!

在传统的MMORPG游戏中,魔法种类大致分为:单攻魔法、群攻魔法、辅助魔法、地图魔法等,其中单攻魔法又可以细分为带过程的(如飞箭),不带过程的(如闪电),多段单体等等;群攻魔法就更多了,以圆形区域群攻为主流,还有多边形区域群攻,穿梭群攻,多段群攻等等;辅助魔法主要就是BUFF加成与减持,如加血、加防、加攻、加防护罩等等;地图魔法则以陷阱为主要代表,还有其他的例如瞬移等等。

本节我将为大家讲解最华丽且又是最易于实现的圆形范围群攻魔法的实现。

魔法控件是实现魔法的前提,因此我们首先建立一个名为QXMagic的魔法控件,并为之赋予一些属性(具体内容看源码)。这些属性都有注释这里就不详讲了;其中比较关键的是每个魔法同样拥有一个生命线程,用于播放及触发攻击效果,因为魔法从产生到结束是由一系列帧组成的:

有了魔法控件,接着就是考虑该如何实现功能。在通常的MMORPG中,我们主动施放魔法有两个途径:鼠标右键或键盘快捷键,过程其实大同小异,那么本节就以鼠标右键施放魔法为例进行讲解。

首先我们需要为游戏窗体注册鼠标右键事件,然后在里面这样写:

        private void Window_MouseRightButtonDown(object sender, MouseButtonEventArgs e) {

            if (Leader.Action == Actions.Death) { return; }

            ……

            Leader.MagicTarget = p;

            //假如点击的地方太远则先跑到施法范围再施法,否则直接施法

            if (Super.InCircle(Leader.X, Leader.Y, p.X, p.Y, Leader.MagicRange)) {

                ChangeDirection(Leader, p);

                DoMagic(Leader);

            } else {

                Leader.IsMagicMove = true;

                double n = Math.Sqrt(Math.Pow(p.Y - Leader.Y, 2) + Math.Pow(p.X - Leader.X, 2));

                double x = p.X - (p.X - Leader.X) * Leader.MagicRange / n;

                double y = p.Y - (p.Y - Leader.Y) * Leader.MagicRange / n;

                MoveTo(Leader, new Point(x, y));

            }

        }

当我们在地图上点击鼠标右键时,首先判断主角与施放点之间的距离是否在施法距离内,如果是则放出魔法,否则我们计算出能该方向上与释放点距离刚好为主角施法距离的点,然后主角向该点跑去,到达后再施法:

同时,我将法术的参数定义在xml参数文件中:

    <Magics>

      <Magic Code="0" HasDirection="false" FrameNum="19" EffectiveFrame="4" SingleWidth="320" SingleHeight="344" Radius="140" CenterX="154" CenterY="214">

        <Level Value="1" ATK="120" Consumption="10"/>

        <Level Value="2" ATK="160" Consumption="15"/>

        <Level Value="3" ATK="200" Consumption="20"/>

        <Level Value="4" ATK="240" Consumption="25"/>

        <Level Value="5" ATK="280" Consumption="30"/>

        <Level Value="6" ATK="320" Consumption="35"/>

        <Level Value="7" ATK="380" Consumption="40"/>

        <Level Value="8" ATK="500" Consumption="50"/>

        <Level Value="9" ATK="700" Consumption="60"/>

      </Magic>

    ……

<Magics>

大家可以看到,每个法术都拥有一个法术代号用于法术标识(上面的法术代号为Code="0")并且分列出法术各等级的附加攻击力(ATK)与消耗的魔法值(Consumption),然后在施放魔法之前首先判断施法者的魔法值与该魔法的魔法消耗值之间的大小关系以判断施法者当前魔法值是否足够支持施法者施法:

……

if (VSpell < consumption) {

        Super.ShowText(this, true, true, "NotEnough", "魔法值不足", 22, Colors.Green, 0.5);

}

……

这样施法前的步骤就完成了,下面就是伤害计算与结果处理。

伤害计算与前面章节中的物理攻击伤害计算很类似,只是由于本例魔法为群攻魔法,所以需要循环遍历所有在魔法攻击范围内(以魔法有效距离Radius为半径的圆内)的所有敌对精灵,然后进行攻防计算最终产生伤害并输出显示出来:

并且,主角在杀死怪物后会获得怪物的经验值,同样的需要显示输出:

额外的,主角自身的经验值属性也同时增加,并且当达到下一级所需的升级经验时即会触发升级效果,每一级所需的经验值我一并放在xml系统参数文件中:

    <LevelUp>

      <Experience Level="0" Value="0" />

      <Experience Level="1" Value="0" />

      <Experience Level="2" Value="400" />

      <Experience Level="3" Value="1280" />

      <Experience Level="4" Value="2720" />

      <Experience Level="5" Value="4800" />

      <Experience Level="6" Value="7600" />

      <Experience Level="7" Value="11200" />

      <Experience Level="8" Value="15680" />

      <Experience Level="9" Value="21120" />

      <Experience Level="10" Value="27600" />

      <Experience Level="11" Value="35200" />

      <Experience Level="12" Value="44000" />

      <Experience Level=


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#获取web.config配置文件内容发布时间:2022-07-14
下一篇:
C++/CLI发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap