为 HTML 游戏构建可演化世界地图的最有效方法
Most efficient way to build an evoluable world map for an HTML game
我有一个多人合作游戏项目,我主要关心的是游戏地图。
一点上下文
玩家与世界地图互动。这张地图是第一次预先生成。这张地图应该是基于瓦片的(每个瓦片代表世界的一部分)。然而,玩家应该有能力改变地图(在这里建造一些东西,在这里摧毁另一个东西)。地图的这些修改应该对所有其他玩家可见。
问题
执行此操作的有效方法是什么?
- 经典数组存储服务器端并在用户执行操作时更新此数组?从该数组构建地图时,在客户端消耗的资源不是 CPU 吗? (图像映射?
<map></map>
)
- 使用游戏 "engine" 例如 gdevelop or babylonjs?
在我看来,要能够完全自定义我的地图,阵列解决方案似乎是完成它的简单方法。但是我没有这方面的经验。
我最近看过这个 map generator 并尝试在其上构建地图 (<map></map>
),但这不允许我在生成地图后对其进行自定义。
我认为你最好的选择是:
将地图数据存储在一个简单的可序列化数据结构中。例如,带有一些整数的双对象数组 - 瓷砖类型枚举、建筑类型、状态数据(如果需要)等。这将使您可以轻松地在服务器和客户端之间序列化和发送数据。
使用游戏引擎/canvas渲染器/webgl渲染器通过数据数组向客户端渲染视图。我有 PIXI.js(使用 WebGL 或 Canvas 的 2D 渲染框架)和 Phaser(基于 PIXI 构建的 2D 游戏引擎)的经验。所以如果你的游戏是 2D,我可以推荐你这两个。 PIXI 仅用于渲染,其中没有游戏逻辑,您必须实现它。如果游戏不是那么复杂或者您想学习如何自己做事,那很好。另一方面,Phaser 是一个完整的游戏引擎,具有各种游戏开发功能,但这也意味着它因您可能不需要的东西而变得更加臃肿。
当用户点击发送到 "user x clicked tile x,y" 服务器的内容时,处理输入,编辑主数据数组并将其发送回所有客户端。您可以为此使用 Web 套接字或仅使用普通 HTTP 请求
或者,您可以使用 "big" 游戏引擎之一,然后将其编译为 js 并从那里 html - Unity、Godot、Cocos creator(在这个游戏中,您实际上是用JS写的)
我有一个多人合作游戏项目,我主要关心的是游戏地图。
一点上下文
玩家与世界地图互动。这张地图是第一次预先生成。这张地图应该是基于瓦片的(每个瓦片代表世界的一部分)。然而,玩家应该有能力改变地图(在这里建造一些东西,在这里摧毁另一个东西)。地图的这些修改应该对所有其他玩家可见。
问题
执行此操作的有效方法是什么?
- 经典数组存储服务器端并在用户执行操作时更新此数组?从该数组构建地图时,在客户端消耗的资源不是 CPU 吗? (图像映射?
<map></map>
) - 使用游戏 "engine" 例如 gdevelop or babylonjs?
在我看来,要能够完全自定义我的地图,阵列解决方案似乎是完成它的简单方法。但是我没有这方面的经验。
我最近看过这个 map generator 并尝试在其上构建地图 (<map></map>
),但这不允许我在生成地图后对其进行自定义。
我认为你最好的选择是:
将地图数据存储在一个简单的可序列化数据结构中。例如,带有一些整数的双对象数组 - 瓷砖类型枚举、建筑类型、状态数据(如果需要)等。这将使您可以轻松地在服务器和客户端之间序列化和发送数据。
使用游戏引擎/canvas渲染器/webgl渲染器通过数据数组向客户端渲染视图。我有 PIXI.js(使用 WebGL 或 Canvas 的 2D 渲染框架)和 Phaser(基于 PIXI 构建的 2D 游戏引擎)的经验。所以如果你的游戏是 2D,我可以推荐你这两个。 PIXI 仅用于渲染,其中没有游戏逻辑,您必须实现它。如果游戏不是那么复杂或者您想学习如何自己做事,那很好。另一方面,Phaser 是一个完整的游戏引擎,具有各种游戏开发功能,但这也意味着它因您可能不需要的东西而变得更加臃肿。
当用户点击发送到 "user x clicked tile x,y" 服务器的内容时,处理输入,编辑主数据数组并将其发送回所有客户端。您可以为此使用 Web 套接字或仅使用普通 HTTP 请求
或者,您可以使用 "big" 游戏引擎之一,然后将其编译为 js 并从那里 html - Unity、Godot、Cocos creator(在这个游戏中,您实际上是用JS写的)