From 1ade2006754cee5fe1c4043871c2a134fa7b381d Mon Sep 17 00:00:00 2001 From: sli97 <775303361@qq.com> Date: Wed, 14 Dec 2022 20:25:40 +0800 Subject: [PATCH 1/6] update --- .../client/assets/Scripts/UI/PlayerManager.ts | 20 ++--- apps/server/src/biz/Player.ts | 18 ++-- apps/server/src/biz/Room.ts | 86 +++++++++---------- apps/server/src/index.ts | 1 + 4 files changed, 62 insertions(+), 63 deletions(-) diff --git a/apps/client/assets/Scripts/UI/PlayerManager.ts b/apps/client/assets/Scripts/UI/PlayerManager.ts index 3a8f6af..4caac51 100644 --- a/apps/client/assets/Scripts/UI/PlayerManager.ts +++ b/apps/client/assets/Scripts/UI/PlayerManager.ts @@ -1,19 +1,19 @@ -import { _decorator, Component, Node, Label } from "cc"; -import DataManager from "../Global/DataManager"; -const { ccclass, property } = _decorator; +import { _decorator, Component, Node, Label } from "cc" +import DataManager from "../Global/DataManager" +const { ccclass, property } = _decorator @ccclass("PlayerManager") export class PlayerManager extends Component { init({ id, nickname, rid }: { id: number; nickname: string; rid: number }) { - const label = this.getComponent(Label); - let str = nickname; + const label = this.getComponent(Label) + let str = nickname if (DataManager.Instance.myPlayerId === id) { - str += `(我)`; + str += `(我)` } - if (rid !== -1) { - str += `(房间${rid})`; + if (rid) { + str += `(房间${rid})` } - label.string = str; - this.node.active = true; + label.string = str + this.node.active = true } } diff --git a/apps/server/src/biz/Player.ts b/apps/server/src/biz/Player.ts index f375c38..e10eca6 100644 --- a/apps/server/src/biz/Player.ts +++ b/apps/server/src/biz/Player.ts @@ -1,16 +1,14 @@ -import { Connection } from "../Core"; +import { Connection } from "../Core" export default class Player { - id: number; - nickname: string; - connection: Connection; - rid: number; + id: number + nickname: string + connection: Connection + rid: number constructor({ id, nickname, connection }: Pick) { - this.id = id; - this.nickname = nickname; - this.connection = connection; - this.connection.playerId = this.id; - this.rid = -1; + this.id = id + this.nickname = nickname + this.connection = connection } } diff --git a/apps/server/src/biz/Room.ts b/apps/server/src/biz/Room.ts index 32d9bd3..d341dcb 100644 --- a/apps/server/src/biz/Room.ts +++ b/apps/server/src/biz/Room.ts @@ -1,57 +1,57 @@ -import { ApiMsgEnum, EntityTypeEnum, IClientInput, IMsgClientSync, InputTypeEnum, IState, toFixed } from "../Common"; -import { Connection } from "../Core"; -import type Player from "./Player"; -import PlayerManager from "./PlayerManager"; -import RoomManager from "./RoomManager"; +import { ApiMsgEnum, EntityTypeEnum, IClientInput, IMsgClientSync, InputTypeEnum, IState, toFixed } from "../Common" +import { Connection } from "../Core" +import type Player from "./Player" +import PlayerManager from "./PlayerManager" +import RoomManager from "./RoomManager" export default class Room { - id: number; - players: Set = new Set(); + id: number + players: Set = new Set() - private lastTime?: number; - private timers: NodeJS.Timer[] = []; - private pendingInput: Array = []; - private lastPlayerFrameIdMap: Map = new Map(); + private lastTime?: number + private timers: NodeJS.Timer[] = [] + private pendingInput: Array = [] + private lastPlayerFrameIdMap: Map = new Map() constructor(rid: number) { - this.id = rid; + this.id = rid } join(uid: number) { - const player = PlayerManager.Instance.getPlayerById(uid); + const player = PlayerManager.Instance.getPlayerById(uid) if (player) { - player.rid = this.id; - this.players.add(player); + player.rid = this.id + this.players.add(player) } } leave(uid: number) { - const player = PlayerManager.Instance.getPlayerById(uid); + const player = PlayerManager.Instance.getPlayerById(uid) if (player) { - player.rid = -1; - player.connection.unlistenMsg(ApiMsgEnum.MsgClientSync, this.getClientMsg, this); - this.players.delete(player); + player.rid = undefined + player.connection.unlistenMsg(ApiMsgEnum.MsgClientSync, this.getClientMsg, this) + this.players.delete(player) if (!this.players.size) { - RoomManager.Instance.closeRoom(this.id); + RoomManager.Instance.closeRoom(this.id) } } } close() { - this.timers.forEach((t) => clearInterval(t)); + this.timers.forEach((t) => clearInterval(t)) for (const player of this.players) { - player.rid = -1; - player.connection.sendMsg(ApiMsgEnum.MsgGameEnd, {}); - player.connection.unlistenMsg(ApiMsgEnum.MsgClientSync, this.getClientMsg, this); + player.rid = undefined + player.connection.sendMsg(ApiMsgEnum.MsgGameEnd, {}) + player.connection.unlistenMsg(ApiMsgEnum.MsgClientSync, this.getClientMsg, this) } - this.players.clear(); + this.players.clear() } sync() { for (const player of this.players) { player.connection.sendMsg(ApiMsgEnum.MsgRoom, { room: RoomManager.Instance.getRoomView(this), - }); + }) } } @@ -75,47 +75,47 @@ export default class Room { })), bullets: [], nextBulletId: 1, - }; + } for (const player of this.players) { player.connection.sendMsg(ApiMsgEnum.MsgGameStart, { state, - }); - player.connection.listenMsg(ApiMsgEnum.MsgClientSync, this.getClientMsg, this); + }) + player.connection.listenMsg(ApiMsgEnum.MsgClientSync, this.getClientMsg, this) } let t1 = setInterval(() => { - this.sendServerMsg(); - }, 100); + this.sendServerMsg() + }, 100) let t2 = setInterval(() => { - this.timePast(); - }, 16); - this.timers = [t1, t2]; + this.timePast() + }, 16) + this.timers = [t1, t2] } getClientMsg(connection: Connection, { frameId, input }: IMsgClientSync) { - this.lastPlayerFrameIdMap.set(connection.playerId, frameId); - this.pendingInput.push(input); + this.lastPlayerFrameIdMap.set(connection.playerId, frameId) + this.pendingInput.push(input) } sendServerMsg() { - const pendingInput = this.pendingInput; - this.pendingInput = []; + const pendingInput = this.pendingInput + this.pendingInput = [] for (const player of this.players) { player.connection.sendMsg(ApiMsgEnum.MsgServerSync, { lastFrameId: this.lastPlayerFrameIdMap.get(player.id) ?? 0, inputs: pendingInput, - }); + }) } } timePast() { - let now = process.uptime(); - const dt = now - (this.lastTime ?? now); + let now = process.uptime() + const dt = now - (this.lastTime ?? now) this.pendingInput.push({ type: InputTypeEnum.TimePast, dt: toFixed(dt), - }); - this.lastTime = now; + }) + this.lastTime = now } } diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts index 3e504b1..23cf2c1 100644 --- a/apps/server/src/index.ts +++ b/apps/server/src/index.ts @@ -50,6 +50,7 @@ server.setApi(ApiMsgEnum.ApiPlayerList, (connection: Connection, data: IApiPlaye server.setApi(ApiMsgEnum.ApiPlayerJoin, (connection: Connection, { nickname }: IApiPlayerJoinReq): IApiPlayerJoinRes => { const player = PlayerManager.Instance.createPlayer({ connection, nickname }) + connection.playerId = player.id PlayerManager.Instance.syncPlayers() return { player: PlayerManager.Instance.getPlayerView(player), -- Gitee From 3b17c318573c4ff1d850b480bc4cd73721f5380e Mon Sep 17 00:00:00 2001 From: sli97 <775303361@qq.com> Date: Thu, 15 Dec 2022 16:00:40 +0800 Subject: [PATCH 2/6] update --- apps/server/src/Core/MyServer.ts | 56 ++++++++++++++++---------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/apps/server/src/Core/MyServer.ts b/apps/server/src/Core/MyServer.ts index 15707d5..45b3fd2 100644 --- a/apps/server/src/Core/MyServer.ts +++ b/apps/server/src/Core/MyServer.ts @@ -1,10 +1,10 @@ -import { EventEmitter } from "stream"; -import WebSocket, { WebSocketServer } from "ws"; -import { ApiMsgEnum } from "../Common"; -import { Connection, ConnectionEventEnum } from "./Connection"; +import { EventEmitter } from "stream" +import WebSocket, { WebSocketServer } from "ws" +import { ApiMsgEnum, IModel } from "../Common" +import { Connection, ConnectionEventEnum } from "./Connection" export interface IMyServerOptions { - port: number; + port: number } export enum MyServerEventEnum { @@ -13,51 +13,51 @@ export enum MyServerEventEnum { } export class MyServer extends EventEmitter { - wss?: WebSocketServer; - port: number; - connections: Set = new Set(); - apiMap: Map = new Map(); + wss?: WebSocketServer + port: number + connections: Set = new Set() + apiMap: Map = new Map() constructor({ port = 8080 }: Partial) { - super(); - this.port = port; + super() + this.port = port } start() { return new Promise((resolve, reject) => { - this.wss = new WebSocketServer({ port: this.port }); - this.wss.on("connection", this.handleConnect.bind(this)); + this.wss = new WebSocketServer({ port: this.port }) + this.wss.on("connection", this.handleConnect.bind(this)) this.wss.on("error", (e) => { - reject(e); - }); + reject(e) + }) this.wss.on("close", () => { - console.log("MyServer 服务关闭"); - }); + console.log("MyServer 服务关闭") + }) this.wss.on("listening", () => { - resolve(true); - }); - }); + resolve(true) + }) + }) } handleConnect(ws: WebSocket) { //初始化 - const connection = new Connection(this, ws); + const connection = new Connection(this, ws) //向外告知有人来了 - this.connections.add(connection); - this.emit(MyServerEventEnum.Connect, connection); + this.connections.add(connection) + this.emit(MyServerEventEnum.Connect, connection) //向外告知有人走了 connection.on(ConnectionEventEnum.Close, (code: number, reason: string) => { - this.connections.delete(connection); - this.emit(MyServerEventEnum.DisConnect, connection, code, reason); - }); + this.connections.delete(connection) + this.emit(MyServerEventEnum.DisConnect, connection, code, reason) + }) } - setApi(apiName: ApiMsgEnum, cb: Function) { - this.apiMap.set(apiName, cb); + setApi(name: T, cb: (connection: Connection, args: IModel["api"][T]["res"]) => void) { + this.apiMap.set(name, cb) } } -- Gitee From 5628b0403e8827f0564292c33afad60281efb76f Mon Sep 17 00:00:00 2001 From: sli97 <775303361@qq.com> Date: Thu, 15 Dec 2022 16:19:00 +0800 Subject: [PATCH 3/6] update --- apps/server/src/Core/MyServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/Core/MyServer.ts b/apps/server/src/Core/MyServer.ts index 45b3fd2..0f77981 100644 --- a/apps/server/src/Core/MyServer.ts +++ b/apps/server/src/Core/MyServer.ts @@ -57,7 +57,7 @@ export class MyServer extends EventEmitter { }) } - setApi(name: T, cb: (connection: Connection, args: IModel["api"][T]["res"]) => void) { + setApi(name: T, cb: (connection: Connection, args: IModel["api"][T]["req"]) => IModel["api"][T]["res"]) { this.apiMap.set(name, cb) } } -- Gitee From dc8ce750ffa1712adea65c1cae6ef58d68670b61 Mon Sep 17 00:00:00 2001 From: sli97 <775303361@qq.com> Date: Thu, 15 Dec 2022 16:41:37 +0800 Subject: [PATCH 4/6] update --- apps/client/assets/Scripts/UI/PlayerManager.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/assets/Scripts/UI/PlayerManager.ts b/apps/client/assets/Scripts/UI/PlayerManager.ts index 4caac51..fe7f627 100644 --- a/apps/client/assets/Scripts/UI/PlayerManager.ts +++ b/apps/client/assets/Scripts/UI/PlayerManager.ts @@ -1,10 +1,11 @@ import { _decorator, Component, Node, Label } from "cc" +import { IPlayer } from "../Common" import DataManager from "../Global/DataManager" const { ccclass, property } = _decorator @ccclass("PlayerManager") export class PlayerManager extends Component { - init({ id, nickname, rid }: { id: number; nickname: string; rid: number }) { + init({ id, nickname, rid }: IPlayer) { const label = this.getComponent(Label) let str = nickname if (DataManager.Instance.myPlayerId === id) { -- Gitee From c7a859b9bb98b2bc518a54210b62d53be6a5e609 Mon Sep 17 00:00:00 2001 From: sli97 <775303361@qq.com> Date: Fri, 6 Jan 2023 18:58:10 +0800 Subject: [PATCH 5/6] update --- apps/server/src/biz/PlayerManager.ts | 49 ++++++++++++++-------------- apps/server/src/index.ts | 1 + 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/apps/server/src/biz/PlayerManager.ts b/apps/server/src/biz/PlayerManager.ts index 137baff..7e716bd 100644 --- a/apps/server/src/biz/PlayerManager.ts +++ b/apps/server/src/biz/PlayerManager.ts @@ -1,55 +1,54 @@ -import Singleton from "../Base/Singleton"; -import { ApiMsgEnum, IApiPlayerJoinReq } from "../Common"; -import { Connection } from "../Core"; -import Player from "./Player"; -import RoomManager from "./RoomManager"; +import Singleton from "../Base/Singleton" +import { ApiMsgEnum, IApiPlayerJoinReq } from "../Common" +import { Connection } from "../Core" +import Player from "./Player" +import RoomManager from "./RoomManager" export default class PlayerManager extends Singleton { static get Instance() { - return super.GetInstance(); + return super.GetInstance() } - players: Set = new Set(); + players: Set = new Set() - private nextPlayerId = 1; - private idMapPlayer: Map = new Map(); + private nextPlayerId = 1 + private idMapPlayer: Map = new Map() createPlayer({ connection, nickname }: IApiPlayerJoinReq & { connection: Connection }) { - const player = new Player({ id: this.nextPlayerId++, connection, nickname }); - this.players.add(player); - this.idMapPlayer.set(player.id, player); - return player; + const player = new Player({ id: this.nextPlayerId++, connection, nickname }) + this.players.add(player) + this.idMapPlayer.set(player.id, player) + return player } removePlayer(uid: number) { - const player = this.idMapPlayer.get(uid); + const player = this.idMapPlayer.get(uid) if (player) { - const rid = player.rid; + const rid = player.rid if (rid !== undefined) { - RoomManager.Instance.leaveRoom(rid, uid); - RoomManager.Instance.syncRooms(); - RoomManager.Instance.syncRoom(rid); + RoomManager.Instance.leaveRoom(rid, uid) + RoomManager.Instance.syncRooms() + RoomManager.Instance.syncRoom(rid) } - this.players.delete(player); - this.idMapPlayer.delete(uid); - this.syncPlayers(); + this.players.delete(player) + this.idMapPlayer.delete(uid) } } getPlayerById(uid: number) { - return this.idMapPlayer.get(uid); + return this.idMapPlayer.get(uid) } syncPlayers() { for (const player of this.players) { - player.connection.sendMsg(ApiMsgEnum.MsgPlayerList, { list: this.getPlayersView() }); + player.connection.sendMsg(ApiMsgEnum.MsgPlayerList, { list: this.getPlayersView() }) } } getPlayersView(players: Set = this.players) { - return [...players].map((player) => this.getPlayerView(player)); + return [...players].map((player) => this.getPlayerView(player)) } getPlayerView({ id, nickname, rid }: Player) { - return { id, nickname, rid }; + return { id, nickname, rid } } } diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts index 23cf2c1..e9781f3 100644 --- a/apps/server/src/index.ts +++ b/apps/server/src/index.ts @@ -40,6 +40,7 @@ server.on(MyServerEventEnum.DisConnect, (connection: Connection) => { console.log(`${getTime()}走人|人数|${server.connections.size}`) if (connection.playerId) { PlayerManager.Instance.removePlayer(connection.playerId) + PlayerManager.Instance.syncPlayers() } }) -- Gitee From 7bf55f9928f96bce780e7677bf2f4e3e2c2d3dd0 Mon Sep 17 00:00:00 2001 From: sli97 <775303361@qq.com> Date: Fri, 6 Jan 2023 20:30:08 +0800 Subject: [PATCH 6/6] update --- apps/client/assets/Scripts/UI/RoomManager.ts | 23 ++++++++++---------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/apps/client/assets/Scripts/UI/RoomManager.ts b/apps/client/assets/Scripts/UI/RoomManager.ts index c9c2ebf..6596b8a 100644 --- a/apps/client/assets/Scripts/UI/RoomManager.ts +++ b/apps/client/assets/Scripts/UI/RoomManager.ts @@ -1,19 +1,20 @@ -import { _decorator, Component, Node, Label } from "cc"; -import { EventEnum } from "../Enum"; -import EventManager from "../Global/EventManager"; -const { ccclass, property } = _decorator; +import { _decorator, Component, Node, Label } from "cc" +import { IRoom } from "../Common" +import { EventEnum } from "../Enum" +import EventManager from "../Global/EventManager" +const { ccclass, property } = _decorator @ccclass("RoomManager") export class RoomManager extends Component { - id: number; - init({ id, players }: { id: number; players: Array<{ id: number; nickname: string }> }) { - this.id = id; - const label = this.getComponent(Label); - label.string = `房间id:${id},当前人数:${players.length}`; - this.node.active = true; + id: number + init({ id, players }: IRoom) { + this.id = id + const label = this.getComponent(Label) + label.string = `房间id:${id},当前人数:${players.length}` + this.node.active = true } handleClick() { - EventManager.Instance.emit(EventEnum.RoomJoin, this.id); + EventManager.Instance.emit(EventEnum.RoomJoin, this.id) } } -- Gitee