C#服务端的微信小游戏——多人在线角色扮演(八)

本文介绍如何在C#服务端实现微信小游戏的动态加载地图功能,通过地图分块管理和事件机制处理角色跨地图移动,确保游戏空间无限拓展且资源高效利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C#服务端的微信小游戏——多人在线角色扮演(八)

动态加载地图虽然会消耗一定的系统资源,但是由此可以实现近似无限地图的游戏空间,让游戏乐趣达到人生的巅峰。
——茂叔

小狗小猫已经可以蹦蹦跳跳了,但是为了让它们跑得更远,我们需要把地图的空间尽量放大。当然,因为内存永远是有限的,所以要在有限的地图里面实现更大的空间,我们需要卸载那些没有玩家的空间,让系统资源为更多玩家服务。这就是为什么要把地图分成一块一块的原因。

每一块地图的大小为5个单位,即X,Y的取值范围是0-4。

我们定义两个全局变量来描述地图块的大小,这样如果将来想要变更起来也比较方便。

public static byte MapSize = 5;

这样一来,GameCharacterMove()可以修改为:

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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值