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

    }

}

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

你可能感兴趣的:(游戏开发)