drawRoad(); drawObstacles(); drawCar(); if(checkCollision()){ running = false; gameOver = true; showOverlay('ゲームオーバー\nスコア: '+score+'', true); return; } requestAnimationFrame(loop); } // 入力 window.addEventListener('keydown', e => { if(gameOver) return; if(e.key === 'ArrowLeft' || e.key === 'a' || e.key === 'A') car.lane = Math.max(0, car.lane-1); if(e.key === 'ArrowRight' || e.key === 'd' || e.key === 'D') car.lane = Math.min(lanes-1, car.lane+1); if(e.key === 'p' || e.key === 'P') togglePause(); }); leftBtn.addEventListener('pointerdown', ()=>{ if(!gameOver) car.lane = Math.max(0, car.lane-1); }); rightBtn.addEventListener('pointerdown', ()=>{ if(!gameOver) car.lane = Math.min(lanes-1, car.lane+1); }); // タッチスライドで操作 let startX = null; canvas.addEventListener('pointerdown', e => { startX = e.clientX; }); canvas.addEventListener('pointerup', e => { if(startX === null) return; const dx = e.clientX - startX; if(Math.abs(dx) > 20){ if(dx < 0) car.lane = Math.max(0, car.lane-1); else car.lane = Math.min(lanes-1, car.lane+1); } startX = null; }); // ポーズ pauseBtn.addEventListener('click', ()=>{ togglePause(); }); function togglePause(){ if(gameOver) return; running = !running; if(running) { hideOverlay(); loop(); } else { showOverlay('一時停止', false); } } function showOverlay(text, showRestart){ overlay.style.display='flex'; panel.innerHTML = '
'+text+'
' + (showRestart?'':''); if(showRestart){ document.getElementById('restartBtn').addEventListener('click', ()=>{ reset(); }); } else { document.getElementById('resumeBtn').addEventListener('click', ()=>{ running=true; hideOverlay(); loop(); }); } } function hideOverlay(){ overlay.style.display='none'; } // 初期配置 car.x = car.lane*laneW + (laneW-car.w)/2; // レスポンシブにキャンバスを最適化 (function adapt(){ const rect = root.getBoundingClientRect(); const ratio = rect.width/rect.height; // 強制的に高さを調整したい場合はここで追加 requestAnimationFrame(adapt); })(); // 初回開始 reset(); // フォールバック: ページが非表示になったら停止 document.addEventListener('visibilitychange', ()=>{ if(document.hidden){ running=false; showOverlay('一時停止 (フォーカスが外れました)', false); } });