Spaces:
Sleeping
Sleeping
// /$$$$$$ /$$$$$$ /$$ /$$ /$$$$$$$$ /$$ /$$ /$$$$$$$$ /$$$$$$ /$$$$$ /$$$$$$ /$$$$$$$ | |
// /$$__ $$|_ $$_/| $$ | $$| $$_____/ | $$$ /$$$| $$_____/ /$$__ $$ |__ $$ /$$__ $$| $$__ $$ | |
// | $$ \__/ | $$ | $$ | $$| $$ | $$$$ /$$$$| $$ | $$ \ $$ | $$| $$ \ $$| $$ \ $$ | |
// | $$ /$$$$ | $$ | $$ / $$/| $$$$$ | $$ $$/$$ $$| $$$$$ | $$$$$$$$ | $$| $$ | $$| $$$$$$$ | |
// | $$|_ $$ | $$ \ $$ $$/ | $$__/ | $$ $$$| $$| $$__/ | $$__ $$ /$$ | $$| $$ | $$| $$__ $$ | |
// | $$ \ $$ | $$ \ $$$/ | $$ | $$\ $ | $$| $$ | $$ | $$ | $$ | $$| $$ | $$| $$ \ $$ | |
// | $$$$$$/ /$$$$$$ \ $/ | $$$$$$$$ | $$ \/ | $$| $$$$$$$$ | $$ | $$ | $$$$$$/| $$$$$$/| $$$$$$$/ | |
// \______/ |______/ \_/ |________/ |__/ |__/|________/ |__/ |__/ \______/ \______/ |_______/ | |
// | |
// Hi, I'm Roland and i'm looking for a job. | |
// Resume in /public/resume.pdf | |
// [email protected] | |
// https://www.linkedin.com/in/roland-vrignon/ | |
// | |
'use client'; | |
import { FC, useEffect, useRef } from 'react'; | |
import Image from 'next/image'; | |
interface Story { | |
accusation: { | |
description: string; | |
alibi: string[]; | |
}; | |
} | |
interface IntroSceneProps { | |
intro: { | |
fr: { | |
title: string; | |
description: string; | |
start: string; | |
}; | |
en: { | |
title: string; | |
description: string; | |
start: string; | |
}; | |
es: { | |
title: string; | |
description: string; | |
start: string; | |
}; | |
}, | |
language: 'fr' | 'en' | 'es'; | |
setNextScene: () => void; | |
story: Story | null; | |
} | |
const IntroScene: FC<IntroSceneProps> = ({ | |
intro, | |
language, | |
setNextScene, | |
story, | |
}) => { | |
const audioRef = useRef<HTMLAudioElement | null>(null); | |
useEffect(() => { | |
const audio = new Audio(); | |
audio.id = 'introAudio'; | |
document.body.appendChild(audio); | |
audioRef.current = audio; | |
const loadAndPlayAudio = async () => { | |
try { | |
if (language === 'en') { | |
audio.src = '/sounds/intro_en.mp3'; | |
} else if (language === 'fr') { | |
audio.src = '/sounds/intro_fr.mp3'; | |
} else if (language === 'es') { | |
audio.src = '/sounds/intro_es.mp3'; | |
} | |
await audio.load(); | |
await audio.play(); | |
} catch (error) { | |
console.log('Audio playback error:', error); | |
} | |
}; | |
loadAndPlayAudio(); | |
return () => { | |
if (audioRef.current) { | |
audioRef.current.pause(); | |
document.body.removeChild(audioRef.current); | |
audioRef.current = null; | |
} | |
}; | |
}, [language]); | |
const handleContinue = () => { | |
if (audioRef.current) { | |
audioRef.current.pause(); | |
document.body.removeChild(audioRef.current); | |
audioRef.current = null; | |
} | |
setNextScene(); | |
}; | |
return ( | |
<div className="relative w-screen h-screen"> | |
{/* Image de fond */} | |
<Image | |
src="https://ik.imagekit.io/z0tzxea0wgx/MistralGameJam/DD_BG1_rva-mKDVA.jpg?updatedAt=1737835881047https://ik.imagekit.io/z0tzxea0wgx/MistralGameJam/DD_BG1_rva-mKDVA.jpg?updatedAt=1737835881047" | |
alt="Background" | |
fill | |
className="object-cover" | |
priority | |
/> | |
{/* Overlay noir */} | |
<div className="absolute inset-0 bg-black/70"> | |
{/* Contenu */} | |
<div className="relative z-10 flex flex-col items-center justify-center h-full p-4"> | |
<p className="text-4xl text-white text-center mb-8 roboto-slab max-w-2xl"> | |
{intro[language].description} | |
</p> | |
<button | |
onClick={() => handleContinue()} | |
className={`px-8 py-4 text-xl font-bold text-white rounded-lg transition-colors roboto-slab | |
${story ? 'bg-blue-600 hover:bg-blue-700' : 'bg-gray-500 cursor-not-allowed'}`} | |
disabled={!story} | |
> | |
{intro[language].start} | |
</button> | |
</div> | |
</div> | |
</div> | |
); | |
}; | |
export default IntroScene; |