金魚すくい

クリックして開始

fishes.push(new Fish()); } // BGM再生 bgmPlayer.src = currentBgmPath; if (isAudioOn) { // play()は非同期。ファイルが存在しないエラーをキャッチして無視する bgmPlayer.play().catch(e => { console.warn("BGMファイルの読み込み・再生をスキップしました (ファイルパス: " + currentBgmPath + "). 詳細:", e.message); }); } // タイマー開始 clearInterval(timerId); if (timerDuration > 0) { let timeLeft = timerDuration; timerId = setInterval(() => { timeLeft--; // TODO: UIに残り時間を表示する if (timeLeft <= 0) { endGame(true); // 時間切れでゲームオーバー } }, 1000); } // ループ開始 cancelAnimationFrame(animationId); update(); } function endRound() { gameState = 'result'; cancelAnimationFrame(animationId); bgmPlayer.pause(); finalScoreDisplay.textContent = score; // リザルト画面表示 inGameUi.classList.add('hidden'); resultScreen.classList.remove('hidden'); // 破れた余韻のため少し遅らせて表示 setTimeout(() => { resultScreen.classList.remove('opacity-0'); }, 500); } function endGame(isTimeUp) { clearInterval(timerId); if (isTimeUp) { resultTitle.textContent = '時間切れ!'; resultMessage.textContent = '結果発表'; } else { resultTitle.textContent = '最後のポイが破れました'; resultMessage.textContent = '結果発表'; } retryBtn.textContent = 'もう一度遊ぶ'; backTitleBtn.textContent = 'タイトルへ戻る'; endRound(); } function showTitle() { gameState = 'title'; // AudioContextがユーザー操作で初期化された後でのみ再生 if (audioCtx && audioCtx.state === 'running') { bgmPlayer.pause(); // 他のBGMを停止 bgmPlayer.src = titleBgmPath; if (isAudioOn) { bgmPlayer.play().catch(e => { console.warn("タイトルBGMの再生に失敗しました: ", e.message); }); } } // 全てのオーバーレイを非表示にする titleScreen.classList.remove('hidden'); preGameScreen.classList.add('hidden'); settingsScreen.classList.add('hidden'); resultScreen.classList.add('opacity-0', 'hidden'); inGameUi.classList.add('hidden'); // 表示アニメーション用クラスをリセット titleScreen.classList.remove('opacity-0', 'pointer-events-none'); // 背景を描画しておく(静止画) resizeCanvas(); ctx.fillStyle = '#89cff0'; ctx.fillRect(0, 0, canvasWidth, canvasHeight); } // 初期化実行 function showPreGame() { titleScreen.classList.add('hidden'); // BGMは止めずに画面を切り替える preGameScreen.classList.remove('hidden'); } function showSettings() { titleScreen.classList.add('hidden'); // BGMは止めずに画面を切り替える settingsScreen.classList.remove('hidden'); } window.onload = () => { initUI(); // showTitle()は直接呼ばず、ロード画面を表示してユーザーのクリックを待つ resizeCanvas(); ctx.fillStyle = '#89cff0'; ctx.fillRect(0, 0, canvasWidth, canvasHeight); };