import 'package:flutter/material.dart'; import 'package:playwith_core/playwith_core.dart'; import 'package:playwith_game_quiz/quiz_game.dart'; // 퀴즈 모듈 import import 'intro_screen.dart'; void main() { // 1. 플러터 바인딩 초기화 WidgetsFlutterBinding.ensureInitialized(); // 2. 사운드 리소스 주입 (여기가 핵심!) // AssetSource는 'assets/' 접두어를 자동으로 붙이므로 그 하위 경로만 적습니다. SoundManager().initialize(soundPaths: { SoundKey.bgm: 'audio/bgm.mp3', SoundKey.correct: 'audio/correct.mp3', SoundKey.wrong: 'audio/wrong.mp3', SoundKey.win: 'audio/win.mp3', }); runApp(const PlayWithApp()); } class PlayWithApp extends StatefulWidget { const PlayWithApp({super.key}); @override State createState() => _PlayWithAppState(); } class _PlayWithAppState extends State { final _net = NetworkManager(); // 등록된 게임 목록 final List _games = [ QuizGame(), // 여기서 등록! ]; @override void initState() { super.initState(); // [전역 라우팅] 네트워크 메시지를 감시하다가 'GAME_START'가 오면 해당 게임 실행 _net.messageStream.listen((data) { if (data['type'] == 'GAME_START') { final String gameId = data['gameId']; // ID에 맞는 게임 찾기 final game = _games.firstWhere( (g) => g.id == gameId, orElse: () => throw Exception("Game not found: $gameId") ); // 게임 화면으로 이동 (네비게이터 키를 안 쓰고 있어서 간단히 처리 불가, 아래 설명 참조) // 실제로는 GlobalKey를 쓰거나, 현재 context를 찾아야 함. // MVP에서는 LobbyScreen 내부에서 처리하는 것이 안전함. } }); } @override Widget build(BuildContext context) { return MaterialApp( title: 'PlayWith', theme: ThemeData( primarySwatch: Colors.blue, useMaterial3: true, ), home: const IntroScreen(), ); } }