我正在编写一款多人游戏。有没有在服务器上使用 MatterJS 的快速方法(使用 nodejs
、ws
、express
)。我的主要问题是将世界从服务器发送到客户端以在 Canvas 上渲染它。世道艰难,有没有办法在前端使用内置的Matter.Engine
?
谁能帮忙?
如果这个问题有点不详细,请在评论中写问题。
最佳答案
理想情况下,对于权威服务器游戏,您希望引擎在服务器端运行,渲染器在客户端运行。 Matter.js 有单独的引擎和渲染对象,这很有帮助。
您可以采用以下几种方法:
为服务器端编写您自己的渲染器,它通过 websocket 连接发送更新而不是渲染到屏幕。为客户端编写您自己的引擎对象,它从服务器接收 websocket 更新以更新对象位置、 Angular 等以传递给真正的渲染器。然后,在服务器上,您将运行默认的 Matter.js 引擎,但使用您的自定义渲染器,在客户端上,您将使用默认的 Matter.js 渲染器,但使用您的自定义引擎。如果您想采用这种方法,Matter.js 文档将是一个好的开始。
或者,在客户端和服务器上运行默认引擎,但在客户端,将对象设置为静态。不要在服务器端将它们设置为静态。然后,服务器可以通过套接字发送更新,包括对象 ID、位置和 Angular 。然后客户端可以调用这样的代码来更新客户端引擎:
Matter.Body.setPosition(body, update.position);
Matter.Body.setAngle(body, update.angle);
方法 #1 需要更多的努力才能开始工作,因为您需要编写客户渲染器和引擎组件,但方法 #2 工作得相当好,可以快速开始工作。要记住的一件事是,在多人在线游戏中,延迟成为一个挑战。在这种情况下,让引擎在客户端和服务器上运行可能是一个优势,因为理论上您可以乐观地在客户端应用力/位置,然后在服务器发送下一批更新后“调整”这些更新.
除此之外,该架构看起来很像任何其他客户端/服务器游戏架构。
请注意,Matter.js 可以在 Node 环境中与 NPM 一起安装——它不必在浏览器中运行。您可以轻松地将其与 Express.js、ws 或 socket.io 连接起来,然后启动一个循环,您可以在其中调用这样的代码来定期更新引擎:
Matter.Engine.update(engine, 1000 / 60);
希望对您有所帮助。
关于javascript - 如何在带有客户端渲染器的服务器上使用 Matter.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59211642/