19-前端栈学习-MIT_Web终篇-Game实战
您提供的代码是一个多人游戏,玩家可以在画布上移动并实时与游戏世界交互。由于客户端和服务器端之间高度解耦,流程可能会较为复杂。我将从 客户端(输入、Socket、Canvas) 和 服务器端(游戏逻辑、Socket、API) 两个角度进行分解说明。
客户端流程
- 用户输入(
input.js
):handleInput(e)
监听按键事件(方向键)并调用client-socket.js
中的move()
函数,发送移动方向(如"up"
、"down"
、"left"
、"right"
)。
- 发送输入(
client-socket.js
):- 当玩家移动时,**
move()
** 函数通过 WebSocket 连接发送move
事件(socket.emit("move", dir)
)。 socket.emit()
将移动方向传递到服务器。
- 当玩家移动时,**
- 游戏组件(
Game.js
):- 此组件负责显示画布和游戏状态。
Socket.on("update", update)
监听服务器发送的游戏状态更新(如玩家位置、食物位置、获胜者)。processUpdate()
处理接收到的更新,通过canvasManager.js
中的drawCanvas()
函数绘制游戏状态(玩家、食物、获胜者)到画布上。
- 画布管理(
canvasManager.js
):drawCanvas()
渲染游戏状态到 HTML 的<canvas>
元素上,包括玩家、食物以及其他动态元素(如获胜者)。drawPlayer()
和drawCircle()
使用来自服务器的坐标绘制玩家和食物,使用各自的图像或形状。
- 用户操作:
- 玩家按方向键进行移动,每次移动触发一个
move
事件发送至服务器,服务器更新游戏状态后将新状态发送给所有客户端。 - 画布实时更新以反映这些变化。
- 玩家按方向键进行移动,每次移动触发一个
服务器端流程
- Socket 连接(
server-socket.js
):- 当用户连接时,服务器初始化该用户的 Socket,并通过
addUser()
将用户加入游戏状态。 - 服务器监听
move
事件,在接收到事件时调用gameLogic.movePlayer()
更新玩家的位置。
- 当用户连接时,服务器初始化该用户的 Socket,并通过
- 游戏逻辑(
game-logic.js
):- 服务器维护游戏状态
gameState
,包括玩家位置、大小以及食物位置。 movePlayer(id, dir)
根据玩家的移动方向更新其位置。- 服务器处理玩家交互(如“吃掉”其他玩家或食物)。
updateGameState()
每帧(每秒60次)调用,更新游戏状态、检查胜利条件并生成新食物。
- 服务器维护游戏状态
- 向客户端发送更新:
- 通过
io.emit("update", gameLogic.gameState)
将游戏状态发送给所有连接的客户端。 - 触发客户端的
socket.on("update", update)
处理程序,重绘游戏状态。
- 通过
- 用户管理:
- 服务器通过用户ID与 Socket ID 的映射(
userToSocketMap
,socketToUserMap
)管理用户连接。 - 根据用户的连接和断开情况添加/移除玩家,确保游戏状态与当前玩家匹配。
- 服务器通过用户ID与 Socket ID 的映射(
- API 路由(
API.js
):- 这些路由与后端交互,用于处理用户登录、在游戏中生成玩家、发送/接收消息以及获取活跃用户。
- 例如,
/api/spawn
路由将玩家加入游戏,/api/initsocket
路由为已登录用户注册 Socket ID。
整体流程:从输入到展示
- 玩家操作:
- 玩家按下方向键。
handleInput()
捕获按键并调用move()
。move()
通过 Socket 发送"move"
事件,附带移动方向(如"up"
、"down"
等)。
- 服务器接收移动请求:
- 服务器监听
"move"
事件。 server-socket.js
接收事件并调用gameLogic.movePlayer()
更新玩家位置。
- 服务器监听
- 更新游戏状态:
- 更新玩家位置后,服务器更新游戏状态(包括玩家位置、食物及交互情况,如“吃掉”)。
- 服务器通过
io.emit("update", gameState)
将更新后的游戏状态发送给所有客户端。
- 客户端接收更新:
- 客户端通过
socket.on("update", update)
监听"update"
事件。 - 客户端处理更新并调用
canvasManager.js
中的drawCanvas()
函数重绘游戏。
- 客户端通过
- 画布显示游戏状态:
- 根据更新后的玩家、食物等状态重新绘制画布。如果有获胜者,也会在画布上显示。
各组件的交互总结:
- 客户端:
- 输入处理:捕获按键(方向键)以确定玩家的移动。
- Socket 通信:向服务器发送移动指令并监听游戏状态更新。
- 画布管理:根据服务器的更新重绘游戏状态。
- 服务器端:
- Socket 管理:接收客户端的移动指令并更新游戏状态。
- 游戏逻辑:更新玩家位置,处理交互(如吃掉、胜利条件),并定期生成新食物。
- 广播游戏状态:将更新后的游戏状态发送给所有客户端以进行渲染。
游戏采用客户端-服务器模型,客户端响应用户输入并持续接收更新以渲染游戏世界,而服务器管理游戏逻辑、玩家操作及状态一致性。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 云泥小窝!
评论