C#服务端的微信小游戏——多人在线角色扮演(八)
动态加载地图虽然会消耗一定的系统资源,但是由此可以实现近似无限地图的游戏空间,让游戏乐趣达到人生的巅峰。
——茂叔
小狗小猫已经可以蹦蹦跳跳了,但是为了让它们跑得更远,我们需要把地图的空间尽量放大。当然,因为内存永远是有限的,所以要在有限的地图里面实现更大的空间,我们需要卸载那些没有玩家的空间,让系统资源为更多玩家服务。这就是为什么要把地图分成一块一块的原因。
每一块地图的大小为5个单位,即X,Y的取值范围是0-4。
我们定义两个全局变量来描述地图块的大小,这样如果将来想要变更起来也比较方便。
public static byte MapSize = 5;
这样一来,GameCharacter
的Move()
可以修改为:
public bool Move(Direction dir)
{
switch (dir)
{
case Direction.NONE:
break;
case Direction.EAST:
if ((X + 1) == G.MapSize)
return false;
else
X++;
break;
case Direction.WEST:
if ((X - 1) < 0)
return false;
else
X--;
break;
case Direction.NORTH:
if ((Y - 1) < 0)
return false;
else
Y--;
break;
case Direction.SOUTH:
if ((Y + 1) == G.MapSize)
return false;
else
Y++;
break;
default:
break;
}
return true;
}
}
给Move()
一个返回值,这样就可以判断移动是否成功了。
通过这个修改,我们把地图的范围给确定出来了。但是我们还需要去判断这个方向上是不是有别的地图,对不对……还记得GameMap
类有四个成员用来记录各个方向的地图的么?
public ExistenceID NorthMap = ExistenceID.Null;
public ExistenceID SouthMap = ExistenceID.Null;
public ExistenceID WestMap = ExistenceID.Null;
public ExistenceID EastMap = ExistenceID.Null;
该它们上场了。
最简单的方法,就是在GameCharacter
里面增加一个方法,让它从所在地图的gObjects
系统到目标地图的gObjects
里去,再调整一下在目标地图里的坐标就可以了。
但是……
这样做,就势必需要GameCharacter
去访问GameMap
。我们知道,GameMap
其实是GameCharacter
的容器,如果让容器的内容直接操作容器本身,这既不符合软件基本逻辑,更有安全上的风险,如果多个内容都在访问自己的容器,很难保证容器的强度经得起这样折腾。所以,我们只知道有List.Add()
,很少有哪个对象提供Object.AddToList()
这样的方法的。
在这里,我们使用Event
机制来实现这个功能。
在GameCharacter
需要跨越地图的时候,我们发起一个Event
。让GameWorld
来处理,从而实现地图的跨越。
首先,我们在Type.cs
里定义一个事件代理类型:
delegate void CrossMapHandler(