export class IntroScene extends Phaser.Scene { constructor() { super({ key: 'IntroScene' }); } preload() { this.load.video('menu-bg', './assets/video/menu.mp4'); this.load.audio('music-menu', './assets/music/menuBackground.mp3'); this.load.image('logo', './assets/images/logo.png'); } create() { const W = this.scale.width; const H = this.scale.height; // Background video sized exactly to the canvas, looping const video = this.add.video(W / 2, H / 2, 'menu-bg').setDepth(0); //video.setDisplaySize(W, H); video.play(true); // true = loop // Dark overlay so text stays readable this.add.rectangle(W / 2, H / 2, W, H, 0x000000, 0.45).setDepth(1); const logo = this.add.image(W / 2 + 200, H / 5 + 25, 'logo').setOrigin(0.5).setScale(0.6).setAlpha(0).setDepth(2); // Fade in, then yoyo scale between 0.6 and 0.7 this.tweens.add({ targets: logo, alpha: 1, duration: 1200, ease: 'Sine.easeIn', onComplete: () => { this.tweens.add({ targets: logo, scaleX: 0.65, scaleY: 0.65, duration: 1800, yoyo: true, repeat: -1, ease: 'Sine.easeInOut', }); }, }); const prompt = this.add.text(W / 2 + 190, H / 2 + 80, 'Press ENTER or click to start', { fontSize: '22px', fill: '#ffffff', }).setOrigin(0.5).setDepth(2); // Blink the prompt this.tweens.add({ targets: prompt, alpha: 0, duration: 600, yoyo: true, repeat: -1, }); // Controls hint this.add.text(W / 2 + 190, H - 60, 'WASD — Move Mouse — Aim Left Click — Fire', { fontSize: '14px', fill: '#666666', }).setOrigin(0.5).setDepth(2); this._menuMusic = this.sound.add('music-menu', { loop: true, volume: 1.0 }); this._menuMusic.play(); // Attempt fullscreen immediately; browsers that require a user gesture will // ignore this and the _start() fallback will catch it instead. if (!this.scale.isFullscreen) this.scale.startFullscreen(); this.input.keyboard.once('keydown-ENTER', () => this._start()); this.input.once('pointerdown', () => this._start()); } _start() { if (!this.scale.isFullscreen) this.scale.startFullscreen(); this._menuMusic.stop(); this.scene.start('GameScene'); } }