diff --git a/apps/server/src/handlers/GameHandler.ts b/apps/server/src/handlers/GameHandler.ts index 6477919..c26cf65 100644 --- a/apps/server/src/handlers/GameHandler.ts +++ b/apps/server/src/handlers/GameHandler.ts @@ -45,6 +45,14 @@ x: updatedPlayer.x, y: updatedPlayer.y }); + + // ② 【新規】マス目の更新と差分送信のテスト + const cellUpdates = gameManager.paintAndGetUpdates(socket.id); + if (cellUpdates.length > 0) { + io.to(targetRoom).emit(SocketEvents.UPDATE_MAP_CELLS, cellUpdates); + // ログを出してサーバー側で送信されているか確認すると便利です + console.log(`[MAP_UPDATE] Sent ${cellUpdates.length} updates to room ${targetRoom}`); + } } } }); diff --git a/apps/server/src/managers/GameManager.ts b/apps/server/src/managers/GameManager.ts index 73c7dd2..152cbe0 100644 --- a/apps/server/src/managers/GameManager.ts +++ b/apps/server/src/managers/GameManager.ts @@ -1,12 +1,17 @@ import { Player } from "../entities/Player.js"; import { GAME_CONFIG } from "@repo/shared/src/config/gameConfig"; +import { MapStore } from "../states/MapStore"; +import { getGridIndexFromPosition } from "@repo/shared/src/domains/gridMap/gridMap.logic"; +import type { CellUpdate } from "@repo/shared/src/domains/gridMap/gridMap.type"; // プレイヤー集合の生成・更新・参照管理クラス export class GameManager { private players: Map; + private mapStore: MapStore; constructor() { this.players = new Map(); + this.mapStore = new MapStore(); } // 新規プレイヤー登録と初期位置設定処理 @@ -55,4 +60,17 @@ getAllPlayers() { return Array.from(this.players.values()); } + + // 【一時的】移動したプレイヤーの足元を塗り、差分を返すメソッド + public paintAndGetUpdates(playerId: string): CellUpdate[] { + const player = this.players.get(playerId); + if (!player) return []; + + const gridIndex = getGridIndexFromPosition(player.x, player.y); + if (gridIndex !== null) { + this.mapStore.paintCell(gridIndex, player.teamId); + } + + return this.mapStore.getAndClearUpdates(); + } } \ No newline at end of file diff --git a/apps/server/src/states/MapStore.ts b/apps/server/src/states/MapStore.ts new file mode 100644 index 0000000..4f6f2be --- /dev/null +++ b/apps/server/src/states/MapStore.ts @@ -0,0 +1,36 @@ +// apps/server/src/states/MapStore.ts +import type { CellUpdate } from "@repo/shared/src/domains/gridMap/gridMap.type"; +import { GAME_CONFIG } from "@repo/shared/src/config/gameConfig"; + +export class MapStore { + // 全マスの現在の色(teamId)を保持 + private gridColors: number[]; + // 次回の送信ループで送る差分リスト + private pendingUpdates: CellUpdate[]; + + constructor() { + // 初期状態は -1 (無色) などで初期化 + const totalCells = GAME_CONFIG.GRID_COLS * GAME_CONFIG.GRID_ROWS; + this.gridColors = new Array(totalCells).fill(-1); + this.pendingUpdates = []; + } + + /** + * マスを塗り、色が変化した場合のみ差分キューに追加する + */ + public paintCell(index: number, teamId: number): void { + if (this.gridColors[index] !== teamId) { + this.gridColors[index] = teamId; + this.pendingUpdates.push({ index, teamId }); + } + } + + /** + * 溜まっている差分を取得し、キューをクリアする(ループ送信時に使用) + */ + public getAndClearUpdates(): CellUpdate[] { + const updates = [...this.pendingUpdates]; + this.pendingUpdates = []; + return updates; + } +} \ No newline at end of file