将服务器生成的地图传达给客户端的最佳方式
Best way to communicate server-generated map to client
我从 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;
}
}
该映射是一个双精度整数数组,可能非常大,所以我想避免将其作为网络方案的一部分实现(无论如何我认为我在这里做的不正确),因为它没有需要经常更新。我还想在游戏世界中保留对它的引用,以使其与实际改变位置的对象分开。
最好的方法是什么?
Lance 只会在网络方案数据发生变化时广播游戏对象。当新用户连接时,Lance 还将广播所有游戏对象。
在您的情况下,这意味着如果地图只是每隔几分钟更改一次,那么您应该可以将其保留为游戏对象,并依靠 Lance 检测更改并在必要时进行广播。
另一种方法是使用 socket.emit
方法将地图数据直接发送给用户,如堆栈溢出问题中所述:.
我从 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;
}
}
该映射是一个双精度整数数组,可能非常大,所以我想避免将其作为网络方案的一部分实现(无论如何我认为我在这里做的不正确),因为它没有需要经常更新。我还想在游戏世界中保留对它的引用,以使其与实际改变位置的对象分开。
最好的方法是什么?
Lance 只会在网络方案数据发生变化时广播游戏对象。当新用户连接时,Lance 还将广播所有游戏对象。
在您的情况下,这意味着如果地图只是每隔几分钟更改一次,那么您应该可以将其保留为游戏对象,并依靠 Lance 检测更改并在必要时进行广播。
另一种方法是使用 socket.emit
方法将地图数据直接发送给用户,如堆栈溢出问题中所述: