/****************************** * This file holds game states. ******************************/ /** [ENDING STATE] Ending screen shown when the player has completed all 4 levels and therefore completed the game. * * @namespace */ const endState = { ui: undefined, control: undefined, character: undefined, balloon: undefined, basket: undefined, /** * Main code */ create: function () { this.control = { animate: true, preAnimate: false, waitUserAction: false, endUpdate: false, counter: 0, direc: 1, }; this.ui = { continue: { button: undefined, text: undefined, }, }; renderBackground('end'); self.utils.renderProgressBar(); // Back trees game.add .image(-100, context.canvas.height - 200, 'tree_4', 1.05) .anchor(0, 1); game.add .image(360 + 400 + 400, context.canvas.height - 200, 'tree_4', 1.05) .anchor(0, 1); self.utils.renderCharacters(); if (this.control.animate) game.animation.play(this.character.animation[0]); // Front tree game.add .image(30 + 200 + 100, context.canvas.height - 30, 'tree_4', 1.275) .anchor(0, 1); game.event.add('click', this.events.onInputDown); game.event.add('mousemove', this.events.onInputOver); }, /** * Game loop */ update: function () { if (isDebugMode) { if (debugState.end.skip && debugState.end.stop) { self.control.animate = false; } if (debugState.moodle.emulate) { moodleVar = debugState.moodle.info; game.state.start('studentReport'); return; } } self.control.counter++; // Balloon falling if (self.control.preAnimate) { const speedY = 3, speedX = 2; if (self.basket.y < context.canvas.height - 240) { self.balloon.y += speedY; self.basket.y += speedY; self.character.y += speedY; self.balloon.x += speedX; self.basket.x += speedX; self.character.x += speedX; } else { self.control.preAnimate = false; self.control.animate = true; game.animation.play(self.character.animation[0]); } } if (gameName == 'circleOne') { if (self.control.counter % 40 === 0) { self.balloon.x += 5 * self.control.direc; self.control.direc *= -1; } } // Character running if (self.control.animate) { if (self.character.x <= 1550) { self.character.x += 4; } else { self.control.animate = false; game.animation.stop(self.character.animation[0]); self.character.alpha = 0; self.control.waitUserAction = true; self.utils.renderEndUI(); } } if (self.control.endLevel) { // FOR MOODLE if (!moodle) { completedLevels = 0; game.state.start('menu'); } else { // FOR MOODLE parent.location.reload(true); } } game.render.all(); }, utils: { renderProgressBar: () => { const x0 = 300; const y0 = 20; // Bar content for (let i = 0; i < 4; i++) { game.add.image( context.canvas.width - x0 + 37.5 * i, y0, 'progress_bar_tile' ); } // Bar wrapper game.add.geom.rect( context.canvas.width - x0 + 1, y0 + 1, 149, //150, //149, 34, //35, //34, 'transparent', 1, colors.blue, 3 ); // percentage label game.add.text( context.canvas.width - x0 + 160, y0 + 33, '100%', textStyles.h2_ ).align = 'left'; // Difficulty label game.add.text( context.canvas.width - x0 - 10, y0 + 33, game.lang.difficulty + ' ' + gameDifficulty, textStyles.h2_ ).align = 'right'; }, renderCharacters: () => { gameList[gameId].assets.end.building(); self.character = gameList[gameId].assets.end.character(); self.character.animation = gameList[gameId].assets.end.characterAnimation(); if (gameName === 'circleOne') { self.control.preAnimate = true; self.control.animate = false; // Balloon self.balloon = game.add.image(0, -350, 'balloon', 1.5); self.balloon.anchor(0.5, 0.5); self.basket = game.add.image(0, -150, 'balloon_basket', 1.5); self.basket.anchor(0.5, 0.5); self.character.curFrame = 6; } }, renderEndUI: () => { const btnY = context.canvas.height / 2; // Continue Button self.ui.continue.button = game.add.geom.rect( context.canvas.width / 2, btnY, 600, 100, colors.green ); self.ui.continue.button.anchor(0.5, 0.5); // Continue button text self.ui.continue.text = game.add.text( context.canvas.width / 2, btnY + 16, game.lang.back_to_menu, textStyles.btn ); // Title const font = { ...textStyles.btnLg }; font.fill = colors.blue; game.add.text( context.canvas.width / 2, btnY - 100, game.lang.congratulations, font ); }, }, events: { /** * Called by mouse click event * * @param {object} mouseEvent contains the mouse click coordinates */ onInputDown: function (mouseEvent) { const x = game.math.getMouse(mouseEvent).x; const y = game.math.getMouse(mouseEvent).y; if (self.control.waitUserAction) { if (game.math.isOverIcon(x, y, self.ui.continue.button)) { if (audioStatus) game.audio.popSound.play(); self.control.endLevel = true; } } }, /** * Called by mouse move event * * @param {object} mouseEvent contains the mouse move coordinates */ onInputOver: function (mouseEvent) { const x = game.math.getMouse(mouseEvent).x; const y = game.math.getMouse(mouseEvent).y; let overIcon; if (self.control.waitUserAction) { if (game.math.isOverIcon(x, y, self.ui.continue.button)) { // If pointer is over icon document.body.style.cursor = 'pointer'; self.ui.continue.button.scale = self.ui.continue.button.initialScale * 1.1; self.ui.continue.text.style = textStyles.btnLg; } else { // If pointer is not over icon self.ui.continue.button.scale = self.ui.continue.button.initialScale * 1; document.body.style.cursor = 'auto'; self.ui.continue.text.style = textStyles.btn; } } }, }, };