diff --git a/apps/client/src/scenes/game/application/GameNetworkSync.ts b/apps/client/src/scenes/game/application/GameNetworkSync.ts index 0bf4f13..45b6e07 100644 --- a/apps/client/src/scenes/game/application/GameNetworkSync.ts +++ b/apps/client/src/scenes/game/application/GameNetworkSync.ts @@ -49,7 +49,7 @@ } }; - private handleUpdatePlayers = (changedPlayers: playerTypes.PlayerData[]) => { + private handlePlayerUpdates = (changedPlayers: playerTypes.PlayerData[]) => { // UPDATE_PLAYERS は差分のみ届くため,対象IDだけ上書き更新する changedPlayers.forEach((playerData) => { if (playerData.id === this.myId) return; @@ -88,7 +88,7 @@ socketManager.game.onCurrentPlayers(this.handleCurrentPlayers); socketManager.game.onNewPlayer(this.handleNewPlayer); socketManager.game.onGameStart(this.handleGameStart); - socketManager.game.onUpdatePlayers(this.handleUpdatePlayers); + socketManager.game.onUpdatePlayers(this.handlePlayerUpdates); socketManager.game.onRemovePlayer(this.handleRemovePlayer); socketManager.game.onUpdateMapCells(this.handleUpdateMapCells); @@ -101,7 +101,7 @@ socketManager.game.offCurrentPlayers(this.handleCurrentPlayers); socketManager.game.offNewPlayer(this.handleNewPlayer); socketManager.game.offGameStart(this.handleGameStart); - socketManager.game.offUpdatePlayers(this.handleUpdatePlayers); + socketManager.game.offUpdatePlayers(this.handlePlayerUpdates); socketManager.game.offRemovePlayer(this.handleRemovePlayer); socketManager.game.offUpdateMapCells(this.handleUpdateMapCells); diff --git a/apps/server/src/domains/game/application/services/GamePlayerOperationService.ts b/apps/server/src/domains/game/application/services/GamePlayerOperationService.ts index e00cf54..9874b80 100644 --- a/apps/server/src/domains/game/application/services/GamePlayerOperationService.ts +++ b/apps/server/src/domains/game/application/services/GamePlayerOperationService.ts @@ -42,20 +42,15 @@ return; } + const roomPlayerSet = this.roomToPlayers.get(roomId); const session = this.sessions.get(roomId); if (!session) { - this.playerToRoom.delete(id); - this.roomToPlayers.get(roomId)?.delete(id); - - if (this.roomToPlayers.get(roomId)?.size === 0) { - this.roomToPlayers.delete(roomId); - } + this.removePlayerFromIndexes(roomId, id, roomPlayerSet); return; } const removed = session.removePlayer(id); - this.playerToRoom.delete(id); - this.roomToPlayers.get(roomId)?.delete(id); + this.removePlayerFromIndexes(roomId, id, roomPlayerSet); if (removed && session.isEmpty()) { session.dispose(); @@ -69,4 +64,21 @@ }); } } + + private removePlayerFromIndexes( + roomId: string, + playerId: string, + roomPlayerSet: Set | undefined + ): void { + this.playerToRoom.delete(playerId); + + if (!roomPlayerSet) { + return; + } + + roomPlayerSet.delete(playerId); + if (roomPlayerSet.size === 0) { + this.roomToPlayers.delete(roomId); + } + } } \ No newline at end of file diff --git a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts index c3a31d2..d6e871f 100644 --- a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts @@ -31,8 +31,8 @@ roomId, playerIds, (tickData) => { - if (tickData.players.length > 0) { - output.publishUpdatePlayersToRoom(roomId, tickData.players); + if (tickData.playerUpdates.length > 0) { + output.publishUpdatePlayersToRoom(roomId, tickData.playerUpdates); } if (tickData.cellUpdates.length > 0) { diff --git a/apps/server/src/domains/game/loop/GameLoop.ts b/apps/server/src/domains/game/loop/GameLoop.ts index 18aa1d5..e34af53 100644 --- a/apps/server/src/domains/game/loop/GameLoop.ts +++ b/apps/server/src/domains/game/loop/GameLoop.ts @@ -12,7 +12,7 @@ // コールバックで渡すデータの型定義 /** 1ティック分のプレイヤー情報とマップ差分を表すデータ */ export interface TickData { - players: { + playerUpdates: { id: string; x: number; y: number; @@ -29,7 +29,7 @@ private endMonotonicTimeMs: number = 0; private nextTickAtMs: number = 0; private readonly maxCatchUpTicks: number = 3; - private lastSentPlayers: Map = new Map(); + private lastSentPlayers: Map = new Map(); constructor( private roomId: string, @@ -103,7 +103,7 @@ } private processSingleTick(): void { - const changedPlayers: TickData["players"] = []; + const changedPlayers: TickData["playerUpdates"] = []; // 1. 各プレイヤーの座標処理とマス塗りの判定 this.players.forEach((player) => { @@ -146,7 +146,7 @@ // 3. 通信層(GameHandler)へデータを渡す this.onTick({ - players: changedPlayers, + playerUpdates: changedPlayers, cellUpdates: cellUpdates, }); }