diff --git a/apps/client/src/app.tsx b/apps/client/src/app.tsx index df5cec0..ea6e82f 100644 --- a/apps/client/src/app.tsx +++ b/apps/client/src/app.tsx @@ -4,12 +4,12 @@ // シーン(画面)コンポーネント import { TitleScene } from "./scenes/TitleScene"; import { LobbyScene } from "./scenes/LobbyScene"; -import { GameScene } from "./scenes/GameScene"; // 👈 追加 +import { GameScene } from "./scenes/GameScene"; -import type { Room } from "@repo/shared/src/types/room"; +import { GameState, type Room } from "@repo/shared/src/types/room"; export default function App() { - const [gameState, setGameState] = useState<"title" | "lobby" | "playing">("title"); + const [gameState, setGameState] = useState(GameState.TITLE); const [room, setRoom] = useState(null); const [myId, setMyId] = useState(null); @@ -17,17 +17,17 @@ socketClient.onConnect((id) => setMyId(id)); socketClient.onRoomUpdate((updatedRoom) => { setRoom(updatedRoom); - setGameState("lobby"); + setGameState(GameState.LOBBY); }); - socketClient.onGameStart(() => setGameState("playing")); + socketClient.onGameStart(() => setGameState(GameState.PLAYING)); }, []); // レンダリング分岐 - if (gameState === "title") { + if (gameState === GameState.TITLE) { return socketClient.joinRoom(payload.roomId, payload.playerName)} />; } - if (gameState === "lobby") { + if (gameState === GameState.LOBBY) { return socketClient.startGame()} />; } diff --git a/apps/server/src/network/SocketManager.ts b/apps/server/src/network/SocketManager.ts index 5cc23da..a32636d 100644 --- a/apps/server/src/network/SocketManager.ts +++ b/apps/server/src/network/SocketManager.ts @@ -2,7 +2,7 @@ import { Server, Socket } from "socket.io"; import { GameManager } from "../managers/GameManager.js"; // shared側の型をインポート(※パスは実際の環境に合わせて修正してください) -import type { Room } from "@repo/shared/src/types/room"; +import { Room, RoomStatus } from "@repo/shared/src/types/room"; import { SocketEvents } from "@repo/shared/src/protocol/events"; type RoomPlayer = Room["players"][0]; @@ -40,7 +40,7 @@ roomId: roomId, ownerId: socket.id, // 最初に作った人がオーナー players: [], - status: 'waiting', + status: RoomStatus.WAITING, maxPlayers: 4 }; this.rooms.set(roomId, room); @@ -63,7 +63,7 @@ socket.on(SocketEvents.START_GAME, () => { for (const [roomId, room] of this.rooms.entries()) { if (room.ownerId === socket.id) { - room.status = 'playing'; + room.status = RoomStatus.PLAYING; // 🎮 全員を GameManager に追加する room.players.forEach(p => { diff --git a/packages/shared/src/types/room.ts b/packages/shared/src/types/room.ts index a952fa9..994fd39 100644 --- a/packages/shared/src/types/room.ts +++ b/packages/shared/src/types/room.ts @@ -1,21 +1,35 @@ +// 🌟 追加: アプリの画面遷移状態を定義 +export const GameState = { + TITLE: 'title', + LOBBY: 'lobby', + PLAYING: 'playing', +} as const; +export type GameState = typeof GameState[keyof typeof GameState]; + +// 🌟 追加・修正: ルームの進行状態を文字列から定数オブジェクトに変更 +export const RoomStatus = { + WAITING: 'waiting', + PLAYING: 'playing', + RESULT: 'result', +} as const; +export type RoomStatus = typeof RoomStatus[keyof typeof RoomStatus]; + export interface Player { - id: string; // Socket ID - name: string; // ユーザーが入力した名前 - isOwner: boolean; // ルームオーナーかどうか - isReady: boolean; // 準備完了状態 + id: string; + name: string; + isOwner: boolean; + isReady: boolean; } -export type RoomStatus = 'waiting' | 'playing' | 'result'; - export interface Room { - roomId: string; // ルームを識別するID - ownerId: string; // オーナーのPlayer ID - players: Player[]; // 参加中のプレイヤーリスト - status: RoomStatus; // 現在の状態 - maxPlayers: number; // 最大参加人数(デフォルト4など) + roomId: string; + ownerId: string; + players: Player[]; + status: RoomStatus; // 👈 ここで上記の型を使用する + maxPlayers: number; } export interface JoinRoomPayload { roomId: string; playerName: string; -} +} \ No newline at end of file