基于c#实现游戏装备系统(基础篇)
摘要
作为游戏中的重要组成部分,装备是重中之重,那么装备系统的代码应该怎么实现呢?
基础
-
我们先定义一个类,作为我们所定义的人物:
class People { public int Attack;//攻击 public int Defence;//防御 public int Speed;//速度 public Dictionary<EquipPlace, Equips> MyEquips = new Dictionary<EquipPlace, Equips>();//自身装备 }
作为例子,仅仅设定它的三个基础属性
-
对于装备,我们需要设定它的适配位置,用枚举来表示:
enum EquipPlace { Weapon,//武器 Clothes,//护甲 LHand,//左护腕 RHand//右护腕 }
作为例子,这里仅设定了4个类型
-
然后我们需要设定装备类:
class Equips
{
public string Name;//名称
public int ID;//编号
public string Attack;//攻击加成
public string Defence;//防御加成
public string Speed;//速度加成
public EquipPlace Adapt;//适配位置
public Equips Copy()//拷贝一份装备,用以装上装备时的计算
{
Equips e = new Equips();
FieldInfo[] fi = GetType().GetFields();//获取装备类的所有公共字段
foreach (FieldInfo field in fi)
{
field.SetValue(e, field.GetValue(this));//将自身的所有公共字段赋值给e的对应字段
}
return e;
}
}
至于为什么攻击、防御、速度加成类型是
string
而不是int
,有特殊用法,后续会讲到
-
紧接着我们需要设定装备的初始化,让每个装备都有不同的属性加成,这块用作初始化
Equips
类:public Equips(int ID)//以ID作为装备识别区分 { this.ID = ID; switch (ID) { case 0: Attack = "i80"; Defence = "i0"; Speed = "i0"; Adapt = EquipPlace.Head; break; case 1: Attack = "i0"; Defence = "i50"; Speed = "i20"; Adapt = EquipPlace.Clothes; break; case 2: Attack = "i0"; Defence = "i10"; Speed = "i15"; Adapt = EquipPlace.LHand; break; case 3: Attack = "i0"; Defence = "i10"; Speed = "i15"; Adapt = EquipPlace.RHand; break; case 4: Attack = "f0.3"; Defence = "i0"; Speed = "i0"; Adapt = EquipPlace.Head; break; case 5: Attack = "i0"; Defence = "f0.2"; Speed = "f0.05"; Adapt = EquipPlace.Clothes; break; } }
代码设定部分不作过多解释,因为举例,所有没有采用策划文案也仅仅只设计了六个装备,其中0-3为一整套。在此需要重点解释下加成中的
f
和i
:i
表示int
说明加成部分是以整数相加,即在原有的基础上直接加上一个数f
表示float
说明加成部分是浮点数相乘,即在原有基础上加上原有基础乘以一个表示百分比的浮点数 -
紧接着就可以写装上装备和卸下装备的函数了
装上装备:
public void EquipEquipments(Equips Equipment)
{
if (MyEquips.ContainsKey(Equipment.Adapt))//如果存在同位置的装备则先卸下原有装备
{
UnloadEquipments(MyEquips[Equipment.Adapt]);
}
Equipment = Equipment.Copy();//拷贝一份装备,防止修改原有属性
if (Equipment.Attack.Substring(0, 1) == "f")
{
Equipment.Attack = "i" + (int)(Attack * float.Parse(Equipment.Attack.Remove(0, 1)) + 0.5f);//将百分比加成改为整数加成,方便后续计算
}
Attack += int.Parse(Equipment.Attack.Remove(0, 1));//在原基础上加成
if (Equipment.Defence.Substring(0, 1) == "f")
{
Equipment.Defence = "i" + (int)(Defence * float.Parse(Equipment.Defence.Remove(0, 1)) + 0.5f);
}
Defence += int.Parse(Equipment.Defence.Remove(0, 1));
if (Equipment.Speed.Substring(0, 1) == "f")
{
Equipment.Speed = "i" + (int)(Speed * float.Parse(Equipment.Speed.Remove(0, 1)) + 0.5f);
}
Speed += int.Parse(Equipment.Speed.Remove(0, 1));
MyEquips.Add(Equipment.Adapt, Equipment);//添加装备到自身装备列表
}
卸下装备:
public void UnloadEquipments(Equips Equipment)
{
Attack -= int.Parse(Equipment.Attack.Remove(0, 1));//减去加成整数
Defence -= int.Parse(Equipment.Defence.Remove(0, 1));
Speed -= int.Parse(Equipment.Speed.Remove(0, 1));
MyEquips.Remove(Equipment.Adapt);//从自身装备列表中去掉该装备
}
以上两个函数均写在
People
这个类中
-
最后我们给
People
这个类添加个打印的函数:public void Print() { Console.WriteLine("装备列表:"); foreach (EquipPlace qp in MyEquips.Keys) { Console.WriteLine(qp.ToString() + ":" + MyEquips[qp].ID); } Console.WriteLine("攻击:" + Attack); Console.WriteLine("防御:" + Defence); Console.WriteLine("速度:" + Speed); Console.WriteLine(); }
这个函数用以输出人物的信息
-
最后我们在Main中测试下功能:
static void Main(string[] args) { People Me = new People(); Equips[] AllEquipments = new Equips[6]; for (int i = 0; i < 6; i++) { AllEquipments[i] = new Equips(i); } Me.Attack = 20; Me.Defence = 10; Me.Speed = 30; Me.Print(); Me.EquipEquipments(AllEquipments[0]); Me.Print(); Me.EquipEquipments(AllEquipments[1]); Me.Print(); Me.EquipEquipments(AllEquipments[2]); Me.Print(); Me.UnloadEquipments(AllEquipments[1]); Me.Print(); Me.EquipEquipments(AllEquipments[4]); Me.Print(); Me.EquipEquipments(AllEquipments[0]); Me.Print(); Console.Read(); }
输出信息如下:
到此为止,我们就实现了最基本的装备系统。
下一节将会讲解实现更为复杂的装备系统(包括不同职业加成,套装等等)