zoukankan      html  css  js  c++  java
  • 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
        }
    }

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

  • 相关阅读:
    聊聊mysql中的int(1)
    如何有效防止sql注入
    微信小程序WXML页面常用语法(讲解+示例)
    Spring Boot 2.x基础教程:使用集中式缓存Redis
    基于.NetCore3.1系列 —— 日志记录之自定义日志组件
    精讲RestTemplate第10篇-使用代理作为跳板发送请求
    使用Java API进行tar.gz文件及文件夹压缩解压缩
    精讲RestTemplate第9篇-如何通过HTTP Basic Auth认证
    精讲RestTemplate第8篇-请求失败自动重试机制
    精讲RestTemplate第7篇-自定义请求失败异常处理
  • 原文地址:https://www.cnblogs.com/zcftech/p/3006322.html
Copyright © 2011-2022 走看看