2

我从 lance-gg 开始,正在构建一个游戏,每隔几分钟就会生成一个新的游戏地图。客户端游戏引擎需要接收生成的地图。目前我正在将地图注册为可序列化的对象,并在服务器启动时向游戏世界添加一个新实例。

class Map extends serialize.DynamicObject {
    constructor(id, width, height) {
        super(id);
        this.class = Map;
        this.width = width;
        this.height = height;
        this.netScheme = {
            tiles: { type: "CLASSINSTANCE" },
        };
    }
    randomTiles() {
        const tiles = [];
        _.forEach(_.range(this.width), (x) => {
            tiles[x] = [];
            _.forEach(_.range(this.height), (y) => {
                tiles[x][y] = _.random(0, 1);
            });
        });
        return tiles;
    }
}

该地图是一个双整数数组,可能非常大,所以我想避免将它作为网络方案的一部分来实现(无论如何我认为我在这里做得不正确),因为它不需要非常更新经常。我还想在游戏世界中保留对它的引用,以使其与实际改变位置的对象分开。

做这个的最好方式是什么?

4

1 回答 1

2

Lance 将仅在其网络方案数据已更改时广播游戏对象。当新用户连接时,Lance 还将广播所有游戏对象。

在您的情况下,这意味着如果地图仅每隔几分钟更改一次,那么您应该可以将其保留为游戏对象,并依靠 Lance 检测更改并在必要时进行广播。

另一种方法是使用socket.emit堆栈溢出问题中描述的方法直接向用户发送地图数据:向 Lance Game 中的单个玩家发送“秘密”数据

于 2017-12-23T11:27:38.787 回答