C#服务端的微信小游戏——多人在线角色扮演(六)
C#服務(wù)端的微信小游戲——多人在線角色扮演(六)
- 地圖上來了只小狗
- 優(yōu)化代碼
用內(nèi)容清單來實現(xiàn)地圖的刷新,根據(jù)開發(fā)需求的細化來優(yōu)化代碼結(jié)構(gòu)。
——茂叔
地圖上來了只小狗
上一篇里,我們成功讓游戲世界有了心跳,然而地圖上任然空空如也。現(xiàn)在我們要在地圖上加入內(nèi)容GameObject了。
最開始,還是要先把GameObject的基本需求整理一下。由于GameObject繼承自Existence,所以標(biāo)識、名稱這些可以不考慮了。除此之外,GameObject還需要下面這些信息:
……
別的以后再補充吧。 給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;由于我們需要從地圖內(nèi)容清單來生成內(nèi)容,這種工作其他地方也會用到,因此,我們定義一個ObjectFactory來完成這個工作。
在GameLib項目中添加一個ObjectFactory類。
然后修改GameMap的Refresh方法如下:
public void Refresh()//刷新{LOG("重新生成地圖(" + EID + ")內(nèi)容");lock (this){gObjects.Clear();foreach (MapItem item in MapItems){GameObject obj = ObjectFactory.Make(item.ClassID, LOG);if (obj != null){obj.X = item.X;obj.Y = item.Y;gObjects.Add(obj);LOG("加入 " + obj.Name + " 成功");}}}LastRefreshTime = DateTime.Now;}在GameWorld類的構(gòu)造函數(shù)里面去配置第一張地圖的內(nèi)容清單。
public GameWorld(Action<string> LOGFUN = null) : base(LOGFUN){gMaps = new List<GameMap>();LOG("GameWorld(" + EID + ")創(chuàng)建成功");GameMap Map = new GameMap(LOG);Map.MapItems.Add(new GameMap.MapItem(){ClassID= 0,X = 1,Y = 1});Map.Refresh();gMaps.Add(Map);}修改GameObject的心跳:
public override void HeartBeat(){LOG("GameObject[" + Name + "](" + EID + ")正在心跳 " + G.GlobeTime);}調(diào)試看看效果:
嗯,完全如我們的預(yù)期,因為我在寫這篇文章的時候已經(jīng)把坑都填了……
優(yōu)化代碼
在完成上面的工作的時候,我們發(fā)現(xiàn)了一些問題。
為了解決上述問題,并有利于之后的開發(fā),我們將所有需要制定的類型都放在一個叫Type.cs的文件里面,讓代碼看起來更有逼格。在GameLib項目新建一個Type類,刪除缺省的class Type將文件內(nèi)容修改如下:
public enum ObjectCategory : ushort{NONE = 0,ANIMAL = 1,TERRAIN = 2}public enum ObjectClassID : ushort{NONE = 0,DOG = 1,CAT = 2,GRASS = 3,ROCK = 4}public enum ObjectStatus : byte{IDEL = 0,MOVING = 1,FIGHTING = 2}public struct MapItem{public ObjectClassID ClassID;public sbyte X;public sbyte Y;}public struct ExistenceID{private string value;public ExistenceID(string v){if (v == null)value = "";else if (Regex.Match(v, @"^[A-Z0-9]{64}$").Success)value = v;elsethrow new InvalidCastException("ExistenceID只能為64位大寫字母和數(shù)字構(gòu)成的字符串");}public struct ExistenceID{private string value;public ExistenceID(string v){if (v == null || v == "")value = "";else if (Regex.Match(v, @"^[A-Z0-9]{64}$").Success)value = v;elsethrow new InvalidCastException("ExistenceID只能為64位大寫字母和數(shù)字構(gòu)成的字符串");}public static ExistenceID NewValue{get{return G.MakeMD5(DateTime.Now.ToString("yyyyMMddHHmmssffff") + G.RND(10000, 99999).ToString() + G.RND(10000, 99999).ToString())+ G.MakeMD5(G.RND(10000, 99999).ToString() + G.RND(10000, 99999).ToString());}}public static ExistenceID Null{get{return "";}}public override bool Equals(object obj)=> value == obj.ToString();public override int GetHashCode(){return base.GetHashCode();}public override string ToString(){return value;}public static implicit operator ExistenceID(string v){return new ExistenceID(v);}}這樣我們就可以把GameObject的成員寫成這樣:
public string Description;public ExistenceID MapEID;public sbyte X;public sbyte Y;public ObjectCategory Category;public ObjectClassID ClassID;public ObjectStatus Status;public byte StatusStep;public byte ImgFileID;public byte ImgID;public bool CanPass;public GameObject[] Inventory;public ExistenceID OwnerEID;ObjectFactory的Make方法寫成這樣:
…… switch (ClassID){case ObjectClassID.NONE:break;case ObjectClassID.DOG:{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 ObjectClassID.CAT:break;case ObjectClassID.GRASS:break;case ObjectClassID.ROCK:break;default:break;} ……在GameWorld的構(gòu)造函數(shù)里添加地圖內(nèi)容清單也不用引用GameMap了:
Map.MapItems.Add(new MapItem(){ClassID= ObjectClassID.DOG,X = 1,Y = 1}別忘了還有GameMap哦:
public ExistenceID NorthMap = ExistenceID.Null;public ExistenceID SouthMap = ExistenceID.Null;public ExistenceID WestMap = ExistenceID.Null;public ExistenceID EastMap = ExistenceID.Null;改完調(diào)試一下,調(diào)試結(jié)果一模一樣,但是這樣的代碼,是不是好看多了,而且將來維護擴充都更方便,也不容易出錯。
好了,下一篇我們將實現(xiàn)更多的內(nèi)容細節(jié),并進一步討論各種內(nèi)容的組織架構(gòu)。
上一篇:C#服務(wù)端的微信小游戲——多人在線角色扮演(五)
下一篇:C#服務(wù)端的微信小游戲——多人在線角色扮演(七)
總結(jié)
以上是生活随笔為你收集整理的C#服务端的微信小游戏——多人在线角色扮演(六)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过智能一体化管理系统自定义表单和自定义
- 下一篇: 儿子懂得心痛他爸爸了