XNA之RPG游戏开发教程之九

在完成了游戏角色的选择,地图的绘制后,下一步我们就要给游戏添加角色了。想必大家都认为上一节中我们在StartMenuScreen页面上已经选择了玩家角色,并实现了根据选择的角色再游戏页面上呈现。但是,我们所做的仅仅是把一副图片加载到游戏中,而这个角色所具有的相关特性确是没有。玩游戏的朋友都知道,每个角色再游戏中都有自身一些独特的属性,像杀伤力,生命值,法宝等等,而这些都需要我们以类的形式去定义并实例化的。好了,下面就开始我们的代码操作

首先在RpgLibrary项目下添加一个新的文件夹CharacterClasses,在其中添加这些角色相关的属性类,第一个类就是角色属性类AttributePair类,在游戏中,一个角色它的属性往往也由很多的操作构成,例如怪物的法力属性,就要根据怪物等级的不同赋予不同的值,在玩家打怪的过程中,被打怪兽的生命力要不断下降,这些对属性的操作都可以封装起来,使得游戏逻辑更加清晰

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RpgLibrary.CharacterClasses
{
    public class AttributePair
    {
        #region Field Region
        int currentValue;//属性的当前值
        int maximumValue;//属性可被赋予的最大值
        #endregion
        #region Property Region//将这两个属性设置为只读属性
        public int CurrentValue
        {
            get { return currentValue; }
        }
        public int MaximumValue
        {
            get { return maximumValue; }
        }
        public static AttributePair Zero//针对属性值的零值
        {
            get { return new AttributePair(); }
        }
        #endregion
        #region Constructor Region
        private AttributePair()
        {
            currentValue = 0;
            maximumValue = 0;
        }
        public AttributePair(int maxValue)
        {
            currentValue = maxValue;
            maximumValue = maxValue;
        }
        #endregion
        #region Method Region//有关属性值的常见操作,Heal加生命值;Damage被虐,生命值减少;SetCurrent进入新的游戏场景,赋予新的属性值;
        public void Heal(ushort value)
        {
            currentValue += value;
            if (currentValue > maximumValue)
                currentValue = maximumValue;
        }
        public void Damage(ushort value)
        {
            currentValue -= value;
            if (currentValue < 0)
                currentValue = 0;
        }
        public void SetCurrent(int value)
        {
            currentValue = value;
            if (currentValue > maximumValue)
                currentValue = maximumValue;
        }
        public void SetMaximum(int value)//给MaximumValue这个属性字段赋值
        {
            maximumValue = value;
            if (currentValue > maximumValue)
                currentValue = maximumValue;
        }
        #endregion
    }
}

定义好了游戏角色属性类,下面就开始定义游戏中实体的数据类,主要是记录所对应实体的一些游戏数据

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RpgLibrary.CharacterClasses
{
    public class EntityData
    {
        #region Field Region
        public string ClassName;//实体的名称,实际上我们在StartMenuScreen页面都选择了角色的名称
        public int Strength;//你有多强壮
        public int Dexterity;//你有多敏捷
        public int Cunning;//你有多聪明
        public int Willpower;//你的魔法等级和战斗力
        public int Magic;//你发出的魔法的杀伤力
        public int Constitution;//你的生命力
        public string HealthFormula;//呈现生命力,法术和战斗力
        public string StaminaFormula;
        public string MagicFormula;
        #endregion
        #region Constructor Region
        
private EntityData()
        {
        }
        #endregion
        #region Static Method Region
//将实体数据写入filename文件中 public static void ToFile(string filename) { }
//从filename文件中读取实体数据,并实例化实体数据类,并返回
public static EntityData FromFile(string filename) { EntityData entity = new EntityData(); return entity; } #endregion } }

好吧,我们已经定义好了游戏中实体所应具有的一些基本的游戏数据,接下来就是定义一个游戏实体的基类,有的人会问了,为什么还是基类,因为游戏中的角色少则两个,多则几十几百,为了简化代码,真正实现OOP中的类的抽象封装,先定义一个抽象的基类,其他具体的角色类再继承实现;添加Entity类如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RpgLibrary.CharacterClasses
{
    public enum EntityGender { Male, Female, Unknown }//实体的性别属性枚举
    public abstract class Entity
    {
        #region Vital Field and Property Region
        protected string entityType;//实体类别
        protected EntityGender gender;//实体性别
        public string EntityType
        {
            get { return entityType; }
        }
        public EntityGender Gender
        {
            get { return gender; }
            protected set { gender = value; }
        }
        #endregion
        #region Basic Attribute and Property Region
        protected int strength;//实体所应具有的一些属性,在实体数据中都有了介绍
        protected int dexterity;
        protected int cunning;
        protected int willpower;
        protected int magic;
        protected int constitution;
        protected int strengthModifier;//属性的修正值
        protected int dexterityModifier;
        protected int cunningModifier;
        protected int willpowerModifier;
        protected int magicModifier;
        protected int constitutionModifier;
        public int Strength//实体对外的接口是修正后的属性值
        {
            get { return strength + strengthModifier; }
            protected set { strength = value; }
        }
        public int Dexterity
        {
            get { return dexterity + dexterityModifier; }
            protected set { dexterity = value; }
        }
        public int Cunning
        {
            get { return cunning + cunningModifier; }
            protected set { cunning = value; }
        }
        public int Willpower
        {
            get { return willpower + willpowerModifier; }
            protected set { willpower = value; }
        }
        public int Magic
        {
            get { return magic + magicModifier; }
            protected set { magic = value; }
        }
        public int Constitution
        {
            get { return constitution + constitutionModifier; }
            protected set { constitution = value; }
        }
        #endregion
        #region Calculated Attribute Field and Property Region
        protected AttributePair health;//Paired属性
        protected AttributePair stamina;
        protected AttributePair mana;
        public AttributePair Health
        {
            get { return health; }
        }
        public AttributePair Stamina
        {
            get { return stamina; }
        }
        public AttributePair Mana
        {
            get { return mana; }
        }
        protected int attack;//游戏的其它数据,攻击,破坏力,防卫能力
        protected int damage;
        protected int defense;
        #endregion
        #region Level Field and Property Region
        protected int level;//实体当前的级别,玩家都是奔着升级去的...
        protected long experience;//玩家经验值
        public int Level
        {
            get { return level; }
            protected set { level = value; }
        }
        public long Experience
        {
            get { return experience; }
            protected set { experience = value; }
        }
        #endregion
        #region Constructor Region//构造函数
        private Entity()
        {
            Strength = 0;
            Dexterity = 0;
            Cunning = 0;
            Willpower = 0;
            Magic = 0;
            Constitution = 0;
            health = new AttributePair(0);
            stamina = new AttributePair(0);
            mana = new AttributePair(0);
        }
        public Entity(EntityData entityData)//用游戏实体数据对象来初始化游戏实体
        {
            entityType = entityData.EntityName;
            Strength = entityData.Strength;
            Dexterity = entityData.Dexterity;
            Cunning = entityData.Cunning;
            Willpower = entityData.Willpower;
            Magic = entityData.Magic;
            Constitution = entityData.Constitution;
            health = new AttributePair(0);
            stamina = new AttributePair(0);
            mana = new AttributePair(0);
        }
        #endregion
    }
}

建立了基类现在就是我们去实现各类角色类的时候了,在我们这个游戏中有圣斗士Fighter类,怪兽rogues类,wizards术士类,以及priests牧师类.你会发现它们的实现十分相似

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RpgLibrary.CharacterClasses
{
    public class Fighter : Entity
    {
        #region Field Region
        #endregion
        #region Property Region
        #endregion
        #region Constructor Region
        public Fighter(EntityData entityData)
            : base(entityData)
        {
        }
        #endregion
        #region Method Region
        #endregion
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RpgLibrary.CharacterClasses
{
    public class Rogue : Entity
    {
        #region Field Region
        #endregion
        #region Property Region
        #endregion
        #region Constructor Region
        public Rogue(EntityData entityData)
            : base(entityData)
        {
        }
        #endregion
        #region Method Region
        #endregion
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RpgLibrary.CharacterClasses
{
    public class Priest : Entity
    {
        #region Field Region
        #endregion
        #region Property Region
        #endregion
        #region Constructor Region
        public Priest(EntityData entityData)
            : base(entityData)
        {
        }
        #endregion
        #region Method Region
        #endregion
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RpgLibrary.CharacterClasses
{
    public class Wizard : Entity
    {
        #region Field Region
        #endregion
        #region Property Region
        #endregion
        #region Constructor Region
        public Wizard(EntityData entityData)
            : base(entityData)
        {
        }
        #endregion
        #region Method Region
        #endregion
    }
}

当然上面的都是各个角色的雏形,都只是继承了基类的基本属性和操作,还没有实现个性化,明天继续吧...

原文地址:https://www.cnblogs.com/zcftech/p/3006322.html