Fablewood/src/scenes/MenuScene.js

161 lines
5.3 KiB
JavaScript

export class MenuScene extends Phaser.Scene {
constructor() {
super({ key: 'MenuScene' });
}
preload() {
// Images
this.load.image('logo', 'assets/images/logo.png');
// Fonts
this.load.font('eraserDust', 'assets/fonts/EraserDust.ttf');
// Videos
this.load.video('mainMenu', 'assets/videos/mainMenu.mp4');
// Music
this.load.audio('menuMusic', 'assets/music/menuMusic.mp3');
}
create() {
// Add typing text
const fullText = "Yet Another AAA Fertig Game....";
const typingText = new TypingText(this,
this.game.config.width / 2,
this.game.config.height / 2,
fullText,
{
fontFamily: 'eraserDust, Arial',
fontSize: '32px',
color: '#ffffff',
align: 'center'
}
);
// Start typing animation
this.time.delayedCall(1000, () => {
typingText.startTyping();
});
// Maun Menu
this.time.delayedCall(7300, () => {
// Play mainMenu video on loop and stretch to fill background
this.mainMenuVideo = this.add.video(0, 0, 'mainMenu');
this.mainMenuVideo.setOrigin(0);
this.mainMenuVideo.scaleX = this.scale.width / 1280;
this.mainMenuVideo.scaleY = this.scale.height / 720;
this.mainMenuVideo.play(true);
const logo = this.physics.add.image(610, 225, 'logo').setScale(0).setOrigin(0.5);
this.tweens.add({
targets: logo,
angle: 360,
scale: .65,
duration: 3500,
ease: 'Bounce',
onComplete: () => {
this.tweens.add({
targets: logo,
scale: .7,
y: 250,
yoyo: true,
repeat: -1,
duration: 3000
});
const typingText2 = new TypingText(this,
this.game.config.width / 2,
this.game.config.height / 2 + 150,
"Use Mouse to Control your Character",
{
fontFamily: 'eraserDust, Arial',
fontSize: '32px',
color: '#ffffff',
align: 'center'
}
);
typingText2.startTyping();
const typingText3 = new TypingText(this,
this.game.config.width / 2,
this.game.config.height / 2 + 200,
"Click Here to Start",
{
fontFamily: 'eraserDust, Arial',
fontSize: '32px',
color: '#ffffff',
align: 'center'
}
);
typingText3.startTyping();
// Add click handler to start game
typingText3.typingText.setInteractive({ useHandCursor: true });
typingText3.typingText.on('pointerdown', () => {
// Stop video and music
if (this.mainMenuVideo) {
this.mainMenuVideo.stop();
}
if (this.bgMusic) {
this.bgMusic.stop();
}
// Start Game scene
this.scene.start('Game');
});
}
});
});
// Background Music
this.bgMusic = this.sound.add('menuMusic', { volume: 0.5 });
this.bgMusic.loop = true;
this.bgMusic.play();
}
update(time, delta) {
}
}
// Typing text class implementation
class TypingText {
constructor(scene, x, y, text, style = {}) {
this.scene = scene;
this.x = x;
this.y = y;
this.text = text;
this.style = style;
this.fullText = text;
// Create empty text object
this.typingText = scene.add.text(x, y, '', style).setShadow(3,3, '#333', 5);
this.typingText.setOrigin(0.5);
// Animation properties
this.currentCharIndex = 0;
this.isTyping = false;
this.typingDelay = 100; // milliseconds per character
}
startTyping() {
if (this.isTyping) return;
this.isTyping = true;
this.currentCharIndex = 0;
// Clear existing text and start typing animation
this.typingText.setText('');
const typeCharacter = () => {
if (this.currentCharIndex < this.fullText.length) {
this.typingText.text += this.fullText.charAt(this.currentCharIndex);
this.currentCharIndex++;
// Schedule next character
setTimeout(typeCharacter, this.typingDelay);
} else {
this.isTyping = false;
}
};
typeCharacter();
}
}