登录游戏房间设计

登录游戏房间概述

无论计算机端游戏,还是移动端游戏,在游戏开始前,通常都要求用户进行登录。同样,本游戏中提供了游戏的登录入口,以便游戏双方进行登录,页面效果如图 18.11 所示。

image 2024 04 18 11 30 03 787
Figure 1. 图18.11 登录游戏房间

登录游戏房间的实现

服务器端的登录游戏房间功能是在 index.js 文件中实现的,在该文件中,首先需要引入需要的 Node.js 模块,并创建服务器监听,进行一些初始化设置,代码如下:

let express = require('express')
let http = require('http')
let app = express()
let path = require('path')
let server = http.createServer(app)
let io = require('socket.io').listen(server)

let port = process.env.PORT || 3000

server.listen(port, () => {
    console.log('Server listening at port %d', port);
});

app.use(express.static(path.join(__dirname, 'public')))

let connectRoom = {}

const changeAuth = (currentRoom, currentUser) => {
    for (let user in currentRoom) {
        if (user === currentUser) {
            currentRoom[user].canDown = false
        } else {
            currentRoom[user].canDown = true
        }
    }
}

通过监听事件判断是否有玩家进入房间,并且设置进入房间后的操作,主要处理 4 种情况,分别是第一个玩家进入、第二个玩家进入且不与第一个玩家重名、第二个玩家进入但与第一个玩家重名、房间中已经存在两个玩家(即满员)。关键代码如下:

io.on('connection', (socket) => {
     console.log('connected')
     socket.on('enter', (data) => {
          //第一个用户进入,新建房间
          if (connectRoom[data.roomNo] === undefined) {
               connectRoom[data.roomNo] = {}
               connectRoom[data.roomNo][data.userName] = {}
               connectRoom[data.roomNo][data.userName].canDown = false
               connectRoom[data.roomNo].full = false
               console.log(connectRoom)
               socket.emit('userInfo', {
                     canDown: false
                     //roomInfo:connectRoom[data.roomNo]
               })
               socket.emit('roomInfo', {
                     roomNo: data.roomNo,
                     roomInfo: connectRoom[data.roomNo]
               })
               socket.broadcast.emit('roomInfo', {
                     roomNo: data.roomNo,
                     roomInfo: connectRoom[data.roomNo]
               })
          } //第二个用户进入且不重名
          else if (!connectRoom[data.roomNo].full &&
               connectRoom[data.roomNo][data.userName] === undefined) {
               connectRoom[data.roomNo][data.userName] = {}
               connectRoom[data.roomNo][data.userName].canDown = true
               connectRoom[data.roomNo].full = true
               console.log(connectRoom)
               socket.emit('userInfo', {
                     canDown: true
               })
               socket.emit('roomInfo', {
                     roomNo: data.roomNo,
                     roomInfo: connectRoom[data.roomNo]
               })
               socket.broadcast.emit('roomInfo', {
                     roomNo: data.roomNo,
                     roomInfo: connectRoom[data.roomNo]
             })
        } //第二个用户进入但重名
        else if (!connectRoom[data.roomNo].full &&
             connectRoom[data.roomNo][data.userName]) {
             socket.emit('userExisted', data.userName)
        } //房间已满
        else if (connectRoom[data.roomNo].full) {
             socket.emit('roomFull', data.roomNo)
        }
    })
})