在完成了游戏角色的选择,地图的绘制后,下一步我们就要给游戏添加角色了。想必大家都认为上一节中我们在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
}
}
当然上面的都是各个角色的雏形,都只是继承了基类的基本属性和操作,还没有实现个性化,明天继续吧...