import Phaser from 'phaser'; /** * Scène de fin : lit une vidéo de victoire en mode paysage puis retourne au menu */ export class EndScene extends Phaser.Scene { private video?: Phaser.GameObjects.Video; private hasFinished: boolean = false; constructor() { super({ key: 'EndScene' }); } create(): void { const { width, height } = this.cameras.main; this.cameras.main.setBackgroundColor('#000000'); console.log('[EndScene] Création de la scène de fin'); console.log('[EndScene] Dimensions:', width, 'x', height); // Lancer directement la vidéo de fin this.playEndVideo(); } /** * Lit la vidéo de fin */ private playEndVideo(): void { const { width, height } = this.cameras.main; console.log('[EndScene] Vidéo dans cache?', this.cache.video.exists('end')); if (!this.cache.video.exists('end')) { console.warn('[EndScene] Vidéo de fin non trouvée → passage au menu.'); this.gotoMenu(); return; } console.log('[EndScene] Création de l\'objet vidéo'); this.video = this.add.video(width / 2, height / 2, 'end'); this.video.setOrigin(0.5); this.video.setDepth(1000); // Attendre que les métadonnées soient chargées this.video.on('metadata', () => { if (!this.video) return; const videoWidth = this.video.video?.videoWidth || 324; const videoHeight = this.video.video?.videoHeight || 720; console.log('[EndScene] Métadonnées vidéo chargées:', videoWidth, 'x', videoHeight); this.video.setSize(videoWidth, videoHeight); this.updateVideoSize(); }); // Activer l'audio this.video.setMute(false); this.video.setLoop(false); console.log('[EndScene] Démarrage de la lecture'); const started = this.video.play(true); // Autoplay console.log('[EndScene] Lecture démarrée?', started); if (!started) { console.warn('[EndScene] Lecture vidéo bloquée → passage au menu.'); this.gotoMenu(); return; } // Événement de fin de vidéo this.video.once('complete', () => { console.log('[EndScene] Vidéo terminée (événement complete) → passage au menu'); this.gotoMenu(); }); // Événement alternatif 'stop' au cas où 'complete' ne se déclenche pas this.video.once('stop', () => { console.log('[EndScene] Vidéo arrêtée (événement stop) → passage au menu'); this.gotoMenu(); }); this.video.once('error', (err: any) => { console.error('[EndScene] Erreur lecture vidéo:', err); this.gotoMenu(); }); // Sécurité : timer basé sur la durée de la vidéo + 2 secondes // Si la vidéo n'est pas finie après sa durée, forcer le passage au menu this.video.on('metadata', () => { if (!this.video || !this.video.video) return; const duration = this.video.getDuration(); console.log('[EndScene] Durée de la vidéo:', duration, 'secondes'); // Timer de sécurité : durée vidéo + 2 secondes this.time.delayedCall((duration + 2) * 1000, () => { if (!this.hasFinished) { console.warn('[EndScene] Timer de sécurité déclenché → passage au menu'); this.gotoMenu(); } }); }); // Ajuster si resize this.scale.on('resize', (gameSize: Phaser.Structs.Size) => { if (this.video && this.video.isPlaying()) { this.updateVideoSize(gameSize.width, gameSize.height); } }); } /** * Ajuste la vidéo à l'écran en mode paysage en respectant le ratio */ private updateVideoSize(targetW?: number, targetH?: number): void { if (!this.video) return; const w = targetW ?? this.cameras.main.width; const h = targetH ?? this.cameras.main.height; // Dimensions natives de la vidéo const nativeW = this.video.video?.videoWidth || 324; const nativeH = this.video.video?.videoHeight || 720; console.log('[EndScene] updateVideoSize - Écran:', w, 'x', h); console.log('[EndScene] updateVideoSize - Vidéo native:', nativeW, 'x', nativeH); // Ratio vidéo et écran const videoRatio = nativeW / nativeH; const screenRatio = w / h; let scale: number; // Mode "contain" : adapter pour que toute la vidéo soit visible if (screenRatio > videoRatio) { // L'écran est plus large que la vidéo → adapter à la HAUTEUR scale = h / nativeH; } else { // L'écran est plus étroit que la vidéo → adapter à la LARGEUR scale = w / nativeW; } const finalWidth = nativeW * scale; const finalHeight = nativeH * scale; console.log('[EndScene] updateVideoSize - Scale:', scale.toFixed(2)); console.log('[EndScene] updateVideoSize - Taille finale:', Math.round(finalWidth), 'x', Math.round(finalHeight)); this.video.setScale(scale); this.video.setPosition(w / 2, h / 2); } /** * Passe au menu */ private gotoMenu(): void { if (this.hasFinished) return; this.hasFinished = true; this.video?.stop(); this.video?.destroy(); this.scene.start('MenuScene'); } }