用内容清单来实现地图的刷新,根据开发需求的细化来优化代码结构。
——茂叔
地图上来了只小狗
上一篇里,我们成功让游戏世界有了心跳,然而地图上任然空空如也。现在我们要在地图上加入内容GameObject
了。
最开始,还是要先把GameObject
的基本需求整理一下。由于GameObject
继承自Existence
,所以标识、名称这些可以不考虑了。除此之外,GameObject
还需要下面这些信息:
- 位置,地图标识、X、Y
- 介绍描述,这是一个程序猿……
- 对应清单的
ObjectClassId
,有了这个,就知道是具体个什么东西或者不是个东西了。例如,这是一把剑,还是一把刀,是关云长的冷艳锯还是是吕奉先的方天戟。 - 类型,这是一种武器、一个角色还是一种药物……同一类型的东西具有某些共性,例如武器就都可以装备,而药品都可以服用。
- 图像,在客户端显示出来是个什么样子。我们把图像信息分解为图像文件编号和图像编号,这样可以把不同类型的东西放在不同的图像文件里面,方便维护。
- 状态,这个东西目前是什么状态,是已经腐烂,还是正在移动,或者是遭到了攻击。
- 动作阶段,一个动作可能需要不同的阶段,即便是静止的,也需要有云舒云展或者花开花落,我们需要根据不同的动作阶段在客户端显示不同的图像。
- 能不能穿过,一堵墙和一颗小草的区别。
- 主人,这是谁扔的?
- 物品……怀璧其罪。
……
别的以后再补充吧。 给GameObject
添加以下成员:
public string Description;
public string MapEID;
public sbyte X;
public sbyte Y;
public ushort Category;//类型
public ushort ClassID;
public byte Status;
public byte StatusStep;
public byte ImgFileID;
public byte ImgID;
public bool Passable;
public GameObject[] Inventory;
public string OwnerEID;
由于我们需要从地图内容清单来生成内容,这种工作其他地方也会用到,因此,我们定义一个ObjectFactory
来完成这个工作。
在GameLib
项目中添加一个ObjectFactory
类。
class ObjectFactory
{
public static GameObject Make(ushort ClassID, Action<string> LOGFUN = null)
{
GameObject ret = null;
switch (ClassID)
{
case 0://生成一只小狗
{
ret = new GameObject(LOGFUN)
{
Name = "小狗旺财",
Description = "一只小狗,就是你",
CanPass = false,
ClassID = ClassID,
Category = ObjectCategory.ANIMAL,
ImgFileID = 0,
ImgID = 0,
Status = ObjectStatus.IDEL,
StatusStep = 0,
OwnerEID = null,
Inventory = new GameObject[8]//可以带8个物品
};
}
break;
case 1://生成一只小猫
break;
case 3://生成一块石头
break;
case 4:/