C#服务端的微信小游戏——多人在线角色扮演(五)
每一次心跳,都会带来改变。从浩瀚的宇宙到渺小的尘埃,都将在时间的维度上不断的改变自己。
——茂叔
谁在心跳?
上一篇讲到了心跳,这是我们游戏世界的一切发生变化的核心,因此,无论GameWorld
、GameMap
还是GameObject
都应该有心跳HeartBeat
,也都应该有向监控窗体报告信息的LOG
。HeartBeat
是自我存在的内在基础,而LOG
就是自我存在对外界的反射。
于是,很自然的,我们可以用一个抽象类来将三者统一起来,我们可以把这个类就叫做“存在”Existence
。
为了判别每一个实例,我们在实例化的时候还要为他们生成一个唯一的EID
,以及为他们预留一个Name
属性,方便必要时为其命名。为了实现EID
,我们需要在G
类里面添加两个静态方法以及一个静态成员:
……
private static readonly Random r = new Random(DateTime.Now.Millisecond);
public static string MakeMD5(string input)
{
MD5 md5 = MD5.Create();
byte[] inputBytes = Encoding.ASCII.GetBytes(input);
byte[] hashBytes = md5.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("X2"));
}
return sb.ToString();
}
public static int RND(int min, int max)
{
return r.Next(min, max + 1);
}
……
修改GameWorld
的HeartBeat
让其遍历所有地图,并调用GameMap
的HeartBeat
。
同样道理,修改GameMap
的HeartBeat
,让其遍历所有内容,并调用GameObject
的HeartBeat
。
经过调整之后的代码如下:
Existence.cs
abstract class Existence
{
private string eID;