Change All Guided Tracing Desgine
parent
3392dea286
commit
eab9dd370f
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
|
|
||||||
if(isMobile){
|
if(isMobile){
|
||||||
cloudeSize = 200;
|
cloudeSize = 200;
|
||||||
|
@ -91,6 +156,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -109,137 +196,64 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
// windowLoad();
|
||||||
font: '900 24px Quicksand',
|
submitUserData(this);
|
||||||
fill: '#05b3a4',
|
showAnimation();
|
||||||
backgroundColor : '#7c4c23',
|
parentMainContainer.classList.remove('hidden');
|
||||||
padding: {x: 10, y: 10},
|
})
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : T", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
// this.add.image(customWidth / 2, 50, 'cloud').setDepth(1.9);
|
|
||||||
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterT').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterT').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterT').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterT').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedT').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedT').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
const baseFontSize = 24;
|
this.add.text(window.innerWidth / 2, 80, 'Letter: T', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : T', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : T', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedTHeight, 'animatedT').setDepth(2).setScale(animatedVideoScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedTHeight, 'animatedT').setDepth(2).setScale(animatedVideoScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -253,11 +267,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Tall Down',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Tall Down',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -266,7 +280,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Slide',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Slide',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioTwo');
|
const audioTwoAudio = this.sound.add('audioTwo');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -321,7 +335,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -338,31 +351,14 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -371,3 +367,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
|
|
||||||
if(isMobile){
|
if(isMobile){
|
||||||
cloudeSize = 200;
|
cloudeSize = 200;
|
||||||
|
@ -91,6 +156,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -107,138 +194,64 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
// windowLoad();
|
||||||
font: '900 24px Quicksand',
|
submitUserData(this);
|
||||||
fill: '#05b3a4',
|
showAnimation();
|
||||||
backgroundColor : '#7c4c23',
|
parentMainContainer.classList.remove('hidden');
|
||||||
padding: {x: 10, y: 10},
|
})
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : U", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
// this.add.image(customWidth / 2, 50, 'cloud').setDepth(1.9);
|
|
||||||
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterU').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterU').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2 + 90, customHeight / 2 + letterHeight, 'letterU').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2 + 90, customHeight / 2 + letterHeight, 'letterU').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedU').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedU').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
animatedLetter.setVisible(true);
|
||||||
const baseFontSize = 24;
|
firstScreen.setVisible(true);
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : U', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedUHeight, 'animatedU').setDepth(2).setScale(animatedVideoScale);
|
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
|
this.add.text(window.innerWidth / 2, 80, 'Letter: U', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : U', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedUHeight, 'animatedU').setDepth(2).setScale(animatedVideoScale);
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -252,11 +265,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 12 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 12 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Tall Down Curve Up',{ font: '700 35px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Tall Down Curve Up',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -291,7 +304,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -308,30 +320,14 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -342,3 +338,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
|
|
||||||
if(isMobile){
|
if(isMobile){
|
||||||
cloudeSize = 200;
|
cloudeSize = 200;
|
||||||
|
@ -91,6 +156,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -108,140 +195,66 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
font: '900 24px Quicksand',
|
// console.log('Clicked');
|
||||||
fill: '#05b3a4',
|
// windowLoad();
|
||||||
backgroundColor : '#7c4c23',
|
submitUserData(this);
|
||||||
padding: {x: 10, y: 10},
|
showAnimation();
|
||||||
shadow: {
|
parentMainContainer.classList.remove('hidden');
|
||||||
offsetX : 2,
|
})
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitNotic.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : V", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
// this.add.image(customWidth / 2, 50, 'cloud').setDepth(1.9);
|
|
||||||
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterV').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterV').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterV').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterV').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedV').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedV').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
const baseFontSize = 24;
|
this.add.text(window.innerWidth / 2, 80, 'Letter: V', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : V', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : V', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedVHeight, 'animatedV').setDepth(2).setScale(animatedVideoScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedVHeight, 'animatedV').setDepth(2).setScale(animatedVideoScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -255,11 +268,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -268,7 +281,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioOne');
|
const audioTwoAudio = this.sound.add('audioOne');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -281,8 +294,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
let firstDragStartPoint = { x: 0, y: 0 };
|
let firstDragStartPoint = { x: 0, y: 0 };
|
||||||
let secondDragStartPoint = { x: 0, y: 0 };
|
let secondDragStartPoint = { x: 0, y: 0 };
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// Add this code for firstLayer
|
// Add this code for firstLayer
|
||||||
firstLayer.on('dragstart', (pointer) => {
|
firstLayer.on('dragstart', (pointer) => {
|
||||||
firstDragStartPoint.x = pointer.x;
|
firstDragStartPoint.x = pointer.x;
|
||||||
|
@ -304,7 +315,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
firstLayer.setAlpha(0.5);
|
firstLayer.setAlpha(0.5);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
``
|
|
||||||
// Repeat the above code for secondLayer and thirdLayer
|
// Repeat the above code for secondLayer and thirdLayer
|
||||||
|
|
||||||
// Add this code for secondLayer
|
// Add this code for secondLayer
|
||||||
|
@ -326,7 +336,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -343,30 +352,14 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false); firstScreen.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,3 +368,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer, fourthLayer;
|
let firstLayer, secondLayer, thirdLayer, fourthLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
|
|
||||||
if(isMobile){
|
if(isMobile){
|
||||||
cloudeSize = 200;
|
cloudeSize = 200;
|
||||||
|
@ -91,6 +156,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -108,139 +195,65 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
|
// windowLoad();
|
||||||
|
submitUserData(this);
|
||||||
|
showAnimation();
|
||||||
|
parentMainContainer.classList.remove('hidden');
|
||||||
|
})
|
||||||
|
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 10, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : W", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
// this.add.image(customWidth / 2, 50, 'cloud').setDepth(1.9);
|
|
||||||
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterW').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterW').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterW').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterW').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedW').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedW').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
const baseFontSize = 24;
|
this.add.text(window.innerWidth / 2, 80, 'Letter: W', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : W', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : W', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedWHeight, 'animatedW').setDepth(2).setScale(animatedVideoScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedWHeight, 'animatedW').setDepth(2).setScale(animatedVideoScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -254,11 +267,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -267,7 +280,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioOne');
|
const audioTwoAudio = this.sound.add('audioOne');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -277,7 +290,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
thirdLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer3').setScale(letterScale);
|
thirdLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer3').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
||||||
const thirdTextLayer = this.add.text(textX, textY, '3. Slant', { font: '700 40px quicksand', fill: '#05b3a4'});
|
const thirdTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '3. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioThreeAudio = this.sound.add('audioOne');
|
const audioThreeAudio = this.sound.add('audioOne');
|
||||||
thirdTextLayer.setVisible(false);
|
thirdTextLayer.setVisible(false);
|
||||||
thirdLayer.setDepth(1.1);
|
thirdLayer.setDepth(1.1);
|
||||||
|
@ -288,7 +301,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
fourthLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer4').setScale(letterScale);
|
fourthLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer4').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
||||||
const fourthTextLayer = this.add.text(textX, textY, '4. Slant', { font: '700 40px quicksand', fill: '#05b3a4'});
|
const fourthTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '4. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioFourthAudio = this.sound.add('audioOne');
|
const audioFourthAudio = this.sound.add('audioOne');
|
||||||
fourthTextLayer.setVisible(false);
|
fourthTextLayer.setVisible(false);
|
||||||
fourthLayer.setDepth(1.1);
|
fourthLayer.setDepth(1.1);
|
||||||
|
@ -389,7 +402,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -406,37 +418,55 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false); firstScreen.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
|
|
||||||
if(isMobile){
|
if(isMobile){
|
||||||
cloudeSize = 200;
|
cloudeSize = 200;
|
||||||
|
@ -91,6 +156,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -109,138 +196,64 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
// windowLoad();
|
||||||
font: '900 24px Quicksand',
|
submitUserData(this);
|
||||||
fill: '#05b3a4',
|
showAnimation();
|
||||||
backgroundColor : '#7c4c23',
|
parentMainContainer.classList.remove('hidden');
|
||||||
padding: {x: 10, y: 10},
|
})
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : X", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
// this.add.image(customWidth / 2, 50, 'cloud').setDepth(1.9);
|
|
||||||
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterX').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterX').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterX').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterX').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedX').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedX').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
})
|
||||||
const baseFontSize = 24;
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
this.add.text(window.innerWidth / 2, 80, 'Letter: X', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : X', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : X', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedXHeight, 'animatedX').setDepth(2).setScale(animatedVideoScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedXHeight, 'animatedX').setDepth(2).setScale(animatedVideoScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -254,11 +267,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -267,7 +280,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Cross',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Cross',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioTwo');
|
const audioTwoAudio = this.sound.add('audioTwo');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -280,8 +293,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
let firstDragStartPoint = { x: 0, y: 0 };
|
let firstDragStartPoint = { x: 0, y: 0 };
|
||||||
let secondDragStartPoint = { x: 0, y: 0 };
|
let secondDragStartPoint = { x: 0, y: 0 };
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// Add this code for firstLayer
|
// Add this code for firstLayer
|
||||||
firstLayer.on('dragstart', (pointer) => {
|
firstLayer.on('dragstart', (pointer) => {
|
||||||
firstDragStartPoint.x = pointer.x;
|
firstDragStartPoint.x = pointer.x;
|
||||||
|
@ -324,7 +335,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -341,31 +351,14 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -374,3 +367,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
// let x = 100;
|
// let x = 100;
|
||||||
|
|
||||||
// // Use x
|
// // Use x
|
||||||
|
@ -95,6 +160,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -113,136 +200,64 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
|
// windowLoad();
|
||||||
|
submitUserData(this);
|
||||||
|
showAnimation();
|
||||||
|
parentMainContainer.classList.remove('hidden');
|
||||||
|
})
|
||||||
|
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 10, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : Y", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2 - 10, customHeight / 2 + letterHeight, 'letterY').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2 - 10, customHeight / 2 + letterHeight, 'letterY').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterHeight, 'letterY').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterHeight, 'letterY').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedY').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedY').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
})
|
||||||
const baseFontSize = 24;
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
this.add.text(window.innerWidth / 2, 80, 'Letter: Y', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : Y', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : Y', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedYHeight, 'animatedY').setDepth(2).setScale(animatedYScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedYHeight, 'animatedY').setDepth(2).setScale(animatedYScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -255,12 +270,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Slant Right',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Slant Right',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5); const audioOneAudio = this.sound.add('audioOne');
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
firstLayer.setAlpha(0.5);
|
firstLayer.setAlpha(0.5);
|
||||||
|
@ -268,7 +282,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Slant Left',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Slant Left',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioTwo');
|
const audioTwoAudio = this.sound.add('audioTwo');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -278,7 +292,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
thirdLayer = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterHeight, 'layer3').setScale(letterScale);
|
thirdLayer = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterHeight, 'layer3').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
||||||
const thirdTextLayer = this.add.text(textX, textY, '3. Down', { font: '700 40px quicksand', fill: '#05b3a4'});
|
const thirdTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '3. Down',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioThreeAudio = this.sound.add('audioThree');
|
const audioThreeAudio = this.sound.add('audioThree');
|
||||||
thirdTextLayer.setVisible(false);
|
thirdTextLayer.setVisible(false);
|
||||||
thirdLayer.setDepth(1.1);
|
thirdLayer.setDepth(1.1);
|
||||||
|
@ -292,8 +306,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
let secondDragStartPoint = { x: 0, y: 0 };
|
let secondDragStartPoint = { x: 0, y: 0 };
|
||||||
let thirdDragStartPoint = { x: 0, y: 0 };
|
let thirdDragStartPoint = { x: 0, y: 0 };
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// Add this code for firstLayer
|
// Add this code for firstLayer
|
||||||
firstLayer.on('dragstart', (pointer) => {
|
firstLayer.on('dragstart', (pointer) => {
|
||||||
firstDragStartPoint.x = pointer.x;
|
firstDragStartPoint.x = pointer.x;
|
||||||
|
@ -355,7 +367,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -373,31 +384,14 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -405,3 +399,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
// let x = 100;
|
// let x = 100;
|
||||||
|
|
||||||
// // Use x
|
// // Use x
|
||||||
|
@ -95,6 +160,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -111,137 +198,66 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.image('topLogo', '/assets/top_logo.svg');
|
this.load.image('topLogo', '/assets/top_logo.svg');
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
|
// windowLoad();
|
||||||
|
submitUserData(this);
|
||||||
|
showAnimation();
|
||||||
|
parentMainContainer.classList.remove('hidden');
|
||||||
|
})
|
||||||
|
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 10, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : Z", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterZ').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterZ').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterZ').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterZ').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedZ').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedZ').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
const baseFontSize = 24;
|
this.add.text(window.innerWidth / 2, 80, 'Letter: Z', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : Z', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : Z', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedZHeight, 'animatedZ').setDepth(2).setScale(animatedZScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedZHeight, 'animatedZ').setDepth(2).setScale(animatedZScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -254,11 +270,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Slide',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Slide',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -267,7 +283,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioTwo');
|
const audioTwoAudio = this.sound.add('audioTwo');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -277,7 +293,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
thirdLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer3').setScale(letterScale);
|
thirdLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer3').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
||||||
const thirdTextLayer = this.add.text(textX, textY, '3. Slide', { font: '700 40px quicksand', fill: '#05b3a4'});
|
const thirdTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '3. Slide',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioThreeAudio = this.sound.add('audioOne');
|
const audioThreeAudio = this.sound.add('audioOne');
|
||||||
thirdTextLayer.setVisible(false);
|
thirdTextLayer.setVisible(false);
|
||||||
thirdLayer.setDepth(1.1);
|
thirdLayer.setDepth(1.1);
|
||||||
|
@ -291,8 +307,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
let secondDragStartPoint = { x: 0, y: 0 };
|
let secondDragStartPoint = { x: 0, y: 0 };
|
||||||
let thirdDragStartPoint = { x: 0, y: 0 };
|
let thirdDragStartPoint = { x: 0, y: 0 };
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// Add this code for firstLayer
|
// Add this code for firstLayer
|
||||||
firstLayer.on('dragstart', (pointer) => {
|
firstLayer.on('dragstart', (pointer) => {
|
||||||
firstDragStartPoint.x = pointer.x;
|
firstDragStartPoint.x = pointer.x;
|
||||||
|
@ -354,7 +368,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -371,31 +384,16 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
});
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -403,3 +401,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
|
|
||||||
if(isMobile){
|
if(isMobile){
|
||||||
cloudeSize = 200;
|
cloudeSize = 200;
|
||||||
|
@ -93,6 +158,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -111,141 +198,62 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
|
||||||
|
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
|
||||||
|
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 10, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
// console.log('Clicked');
|
// console.log('Clicked');
|
||||||
submitButton.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
submitUserData(this);
|
||||||
|
showAnimation();
|
||||||
|
parentMainContainer.classList.remove('hidden');
|
||||||
})
|
})
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : t", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
// this.add.image(customWidth / 2, 50, 'cloud').setDepth(1.9);
|
|
||||||
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2, customHeight / 2 + letterTeight, 'letterR').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2, customHeight / 2 + letterTeight, 'letterR').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2 , customHeight / 2 + letterTeight, 'letterR').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2 , customHeight / 2 + letterTeight, 'letterR').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterTeight, 'animatedT').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterTeight, 'animatedT').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
|
this.add.text(window.innerWidth / 2, 80, 'Letter: t', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : t', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
const baseFontSize = 24;
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedTHeight, 'animatedT').setDepth(2).setScale(animatedVideoScale);
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : t', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedTHeight, 'animatedT').setDepth(2).setScale(animatedVideoScale);
|
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -259,11 +267,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterTeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterTeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Tall Down',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Tall Down',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -272,7 +280,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterTeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterTeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Cross',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Cross',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioTwo');
|
const audioTwoAudio = this.sound.add('audioTwo');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -327,7 +335,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -344,31 +351,15 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
fill: '#05b3a4',
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
backgroundColor : '#7c4c23',
|
audioOneAudio.play();
|
||||||
padding: {x: 20, y: 10},
|
firstTextLayer.setVisible(true);
|
||||||
shadow: {
|
animatedLetter.setVisible(false);
|
||||||
offsetX : 2,
|
firstScreen.setVisible(false);
|
||||||
offsetY : 2,
|
graphics.setVisible(true);
|
||||||
color: '#000',
|
})
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
|
||||||
audioOneAudio.play();
|
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
graphics.setVisible(true);
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
|
@ -376,3 +367,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
|
|
||||||
if(isMobile){
|
if(isMobile){
|
||||||
cloudeSize = 200;
|
cloudeSize = 200;
|
||||||
|
@ -93,6 +158,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -111,140 +198,65 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
// windowLoad();
|
||||||
font: '900 24px Quicksand',
|
submitUserData(this);
|
||||||
fill: '#05b3a4',
|
showAnimation();
|
||||||
backgroundColor : '#7c4c23',
|
parentMainContainer.classList.remove('hidden');
|
||||||
padding: {x: 10, y: 10},
|
})
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitNotic.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : u", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
// this.add.image(customWidth / 2, 50, 'cloud').setDepth(1.9);
|
|
||||||
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2 + 20, customHeight / 2 + letterUeight, 'letterU').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2 + 20, customHeight / 2 + letterUeight, 'letterU').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2 + 20, customHeight / 2 + letterUeight, 'letterU').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2 + 20, customHeight / 2 + letterUeight, 'letterU').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterUeight, 'animatedU').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterUeight, 'animatedU').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
const baseFontSize = 24;
|
this.add.text(window.innerWidth / 2, 80, 'Letter: u', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : u', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : u', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedUHeight, 'animatedU').setDepth(2).setScale(animatedVideoScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedUHeight, 'animatedU').setDepth(2).setScale(animatedVideoScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -258,11 +270,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2 + 20, customHeight / 2 + letterUeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2 + 20, customHeight / 2 + letterUeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 25 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 25 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 6 : customHeight / 2.3;
|
textY = isMobile ? customHeight / 6 : customHeight / 2.3;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Small Down Curve Up',{ font: '700 35px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Small Down Curve Up',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -271,7 +283,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2 + 20, customHeight / 2 + letterUeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2 + 20, customHeight / 2 + letterUeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Small Down',{ font: '700 35px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Small Down',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioTwo');
|
const audioTwoAudio = this.sound.add('audioTwo');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -283,8 +295,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
let firstDragStartPoint = { x: 0, y: 0 };
|
let firstDragStartPoint = { x: 0, y: 0 };
|
||||||
let secondDragStartPoint = { x: 0, y: 0 };
|
let secondDragStartPoint = { x: 0, y: 0 };
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// Add this code for firstLayer
|
// Add this code for firstLayer
|
||||||
firstLayer.on('dragstart', (pointer) => {
|
firstLayer.on('dragstart', (pointer) => {
|
||||||
firstDragStartPoint.x = pointer.x;
|
firstDragStartPoint.x = pointer.x;
|
||||||
|
@ -327,7 +337,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -344,30 +353,14 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,3 +369,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
|
|
||||||
if(isMobile){
|
if(isMobile){
|
||||||
cloudeSize = 200;
|
cloudeSize = 200;
|
||||||
|
@ -93,6 +158,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -110,140 +197,63 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
|
||||||
|
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
// windowLoad();
|
||||||
font: '900 24px Quicksand',
|
submitUserData(this);
|
||||||
fill: '#05b3a4',
|
showAnimation();
|
||||||
backgroundColor : '#7c4c23',
|
parentMainContainer.classList.remove('hidden');
|
||||||
padding: {x: 10, y: 10},
|
})
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitNotic.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : v", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
// this.add.image(customWidth / 2, 50, 'cloud').setDepth(1.9);
|
|
||||||
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2, customHeight / 2 + letterVHeight, 'letterV').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2, customHeight / 2 + letterVHeight, 'letterV').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2 , customHeight / 2 + letterVHeight, 'letterV').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2 , customHeight / 2 + letterVHeight, 'letterV').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterVHeight, 'animatedV').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterVHeight, 'animatedV').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
this.add.text(window.innerWidth / 2, 80, 'Letter: v', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const baseFontSize = 24;
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : v', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : v', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedVHeight, 'animatedV').setDepth(2).setScale(animatedVideoScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedVHeight, 'animatedV').setDepth(2).setScale(animatedVideoScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
|
@ -259,11 +269,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterVHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterVHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 + 30 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 + 30 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -272,7 +282,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterVHeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterVHeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioOne');
|
const audioTwoAudio = this.sound.add('audioOne');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -284,8 +294,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
let firstDragStartPoint = { x: 0, y: 0 };
|
let firstDragStartPoint = { x: 0, y: 0 };
|
||||||
let secondDragStartPoint = { x: 0, y: 0 };
|
let secondDragStartPoint = { x: 0, y: 0 };
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// Add this code for firstLayer
|
// Add this code for firstLayer
|
||||||
firstLayer.on('dragstart', (pointer) => {
|
firstLayer.on('dragstart', (pointer) => {
|
||||||
firstDragStartPoint.x = pointer.x;
|
firstDragStartPoint.x = pointer.x;
|
||||||
|
@ -328,7 +336,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -345,30 +352,14 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,3 +368,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer, fourthLayer;
|
let firstLayer, secondLayer, thirdLayer, fourthLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
|
|
||||||
if(isMobile){
|
if(isMobile){
|
||||||
cloudeSize = 200;
|
cloudeSize = 200;
|
||||||
|
@ -93,6 +158,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -109,142 +196,63 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.image('topLogo', '/assets/top_logo.svg');
|
this.load.image('topLogo', '/assets/top_logo.svg');
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
|
||||||
|
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
// windowLoad();
|
||||||
font: '900 24px Quicksand',
|
submitUserData(this);
|
||||||
fill: '#05b3a4',
|
showAnimation();
|
||||||
backgroundColor : '#7c4c23',
|
parentMainContainer.classList.remove('hidden');
|
||||||
padding: {x: 10, y: 10},
|
})
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : w", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
// this.add.image(customWidth / 2, 50, 'cloud').setDepth(1.9);
|
|
||||||
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterW').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterW').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterW').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterW').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedW').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedW').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
})
|
||||||
const baseFontSize = 24;
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
this.add.text(window.innerWidth / 2, 80, 'Letter: w', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : w', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : w', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedWHeight, 'animatedW').setDepth(2).setScale(animatedVideoScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedWHeight, 'animatedW').setDepth(2).setScale(animatedVideoScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -257,12 +265,12 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
// You can add your code here for what to do when the video finishes.
|
// You can add your code here for what to do when the video finishes.
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 + 40: customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 + 40: customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -271,7 +279,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioOne');
|
const audioTwoAudio = this.sound.add('audioOne');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -281,7 +289,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
thirdLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer3').setScale(letterScale);
|
thirdLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer3').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
||||||
const thirdTextLayer = this.add.text(textX, textY, '3. Slant', { font: '700 40px quicksand', fill: '#05b3a4'});
|
const thirdTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '3. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioThreeAudio = this.sound.add('audioOne');
|
const audioThreeAudio = this.sound.add('audioOne');
|
||||||
thirdTextLayer.setVisible(false);
|
thirdTextLayer.setVisible(false);
|
||||||
thirdLayer.setDepth(1.1);
|
thirdLayer.setDepth(1.1);
|
||||||
|
@ -292,7 +300,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
fourthLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer4').setScale(letterScale);
|
fourthLayer = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'layer4').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
||||||
const fourthTextLayer = this.add.text(textX, textY, '4. Slant', { font: '700 40px quicksand', fill: '#05b3a4'});
|
const fourthTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '4. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioFourthAudio = this.sound.add('audioOne');
|
const audioFourthAudio = this.sound.add('audioOne');
|
||||||
fourthTextLayer.setVisible(false);
|
fourthTextLayer.setVisible(false);
|
||||||
fourthLayer.setDepth(1.1);
|
fourthLayer.setDepth(1.1);
|
||||||
|
@ -393,7 +401,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -410,33 +417,15 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
|
@ -444,3 +433,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
|
|
||||||
if(isMobile){
|
if(isMobile){
|
||||||
cloudeSize = 200;
|
cloudeSize = 200;
|
||||||
|
@ -93,6 +158,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -111,141 +198,64 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
|
||||||
|
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
// windowLoad();
|
||||||
font: '900 24px Quicksand',
|
submitUserData(this);
|
||||||
fill: '#05b3a4',
|
showAnimation();
|
||||||
backgroundColor : '#7c4c23',
|
parentMainContainer.classList.remove('hidden');
|
||||||
padding: {x: 10, y: 10},
|
})
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : x", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
// this.add.image(customWidth / 2, 50, 'cloud').setDepth(1.9);
|
|
||||||
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2, customHeight / 2 + letterXHeight, 'letterX').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2, customHeight / 2 + letterXHeight, 'letterX').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2 , customHeight / 2 + letterXHeight, 'letterX').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2 , customHeight / 2 + letterXHeight, 'letterX').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterXHeight, 'animatedX').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterXHeight, 'animatedX').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
})
|
||||||
const baseFontSize = 24;
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
this.add.text(window.innerWidth / 2, 80, 'Letter: x', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : x', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : x', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedXHeight, 'animatedX').setDepth(2).setScale(animatedXideoScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedXHeight, 'animatedX').setDepth(2).setScale(animatedXideoScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -259,11 +269,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterXHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterXHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -272,7 +282,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterXHeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2 , customHeight / 2 + letterXHeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Cross',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Cross',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioTwo');
|
const audioTwoAudio = this.sound.add('audioTwo');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -284,8 +294,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
let firstDragStartPoint = { x: 0, y: 0 };
|
let firstDragStartPoint = { x: 0, y: 0 };
|
||||||
let secondDragStartPoint = { x: 0, y: 0 };
|
let secondDragStartPoint = { x: 0, y: 0 };
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// Add this code for firstLayer
|
// Add this code for firstLayer
|
||||||
firstLayer.on('dragstart', (pointer) => {
|
firstLayer.on('dragstart', (pointer) => {
|
||||||
firstDragStartPoint.x = pointer.x;
|
firstDragStartPoint.x = pointer.x;
|
||||||
|
@ -328,7 +336,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -345,30 +352,15 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,3 +369,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
|
|
||||||
if(isMobile){
|
if(isMobile){
|
||||||
cloudeSize = 200;
|
cloudeSize = 200;
|
||||||
|
@ -93,6 +158,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -111,138 +198,64 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
|
// windowLoad();
|
||||||
|
submitUserData(this);
|
||||||
|
showAnimation();
|
||||||
|
parentMainContainer.classList.remove('hidden');
|
||||||
|
})
|
||||||
|
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 10, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : y", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
// this.add.image(customWidth / 2, 50, 'cloud').setDepth(1.9);
|
|
||||||
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2 - 10, customHeight / 2 + letterYHeight, 'letterY').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2 - 10, customHeight / 2 + letterYHeight, 'letterY').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterYHeight, 'letterY').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterYHeight, 'letterY').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterYHeight, 'animatedY').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterYHeight, 'animatedY').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
const baseFontSize = 24;
|
this.add.text(window.innerWidth / 2, 80, 'Letter: y', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : y', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : y', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedYHeight, 'animatedY').setDepth(2).setScale(animatedYideoScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedYHeight, 'animatedY').setDepth(2).setScale(animatedYideoScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
|
@ -258,11 +271,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterYHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterYHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Slant Right',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Slant Right',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -271,7 +284,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterYHeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2 - 10, customHeight / 2 + letterYHeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Slant Tail',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Slant Tail',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioTwo');
|
const audioTwoAudio = this.sound.add('audioTwo');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -283,8 +296,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
let firstDragStartPoint = { x: 0, y: 0 };
|
let firstDragStartPoint = { x: 0, y: 0 };
|
||||||
let secondDragStartPoint = { x: 0, y: 0 };
|
let secondDragStartPoint = { x: 0, y: 0 };
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// Add this code for firstLayer
|
// Add this code for firstLayer
|
||||||
firstLayer.on('dragstart', (pointer) => {
|
firstLayer.on('dragstart', (pointer) => {
|
||||||
firstDragStartPoint.x = pointer.x;
|
firstDragStartPoint.x = pointer.x;
|
||||||
|
@ -327,7 +338,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -344,32 +354,15 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
|
@ -377,3 +370,40 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -2,15 +2,78 @@
|
||||||
import Layout from "../../layouts/Layout.astro";
|
import Layout from "../../layouts/Layout.astro";
|
||||||
---
|
---
|
||||||
<Layout title="Guided Letter Tracing Game">
|
<Layout title="Guided Letter Tracing Game">
|
||||||
<main>
|
<main>
|
||||||
<div>
|
<div id="blurDisplay" class="w-full min-h-screen absolute backdrop-blur-[5px] z-50">
|
||||||
</div>
|
<div class="flex justify-center items-center h-screen ">
|
||||||
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
<button id="beforeStartBtn" class="bg-[#0348A8] px-10 py-2 rounded-[4px] text-[#FFFFFF] text-[32px] font-[700]">Start</button>
|
||||||
</main>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="parentMainContainer" class="hidden">
|
||||||
|
<div id="loadingMainContainer" class="w-full h-screen bg-[#00000070] absolute z-10" style="display: none;">
|
||||||
|
<div id="loadingState" style="display: none;" class="bg-white flex text-[#000] absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] items-center space-y-2 w-full px-6 py-16"></div>
|
||||||
|
</div>
|
||||||
|
<div id="scoreBoard" class="z-10 w-full h-screen bg-[#00000070] absolute" style="display: none;">
|
||||||
|
<div class="flex absolute left-1/2 top-1/2 -translate-y-1/2 -translate-x-1/2 max-w-lg flex-col rounded-[8px] bg-white space-y-2 w-full p-6" >
|
||||||
|
<div class="flex flex-row space-x-4 items-center justify-center">
|
||||||
|
<div id="star-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row" style="margin-top: 15px; margin-bottom: 15px;">
|
||||||
|
<img class="z-10" src="/assets/animate-clipart.gif" alt="" style="width: 90.21px; height: 86.24px;" />
|
||||||
|
<p class="text-[#0348A8] text-[12px] font-[700] p-6 rounded-[10px] -ml-[10px]" style="background: linear-gradient(270.05deg, #FFFFFF 4.67%, #DAEAFF 99.61%);">Well done! <span id="countStar"></span> stars for your effort! <br> Keep pushing, you’ve got this!</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col w-full max-w-sm items-center justify-center mx-auto gap-3">
|
||||||
|
<button onclick="history.back();" class="rounded-[4px] bg-[#0348A8] text-[#FFF] text-[12px] font-[700] p-2.5 w-full border-[1px] border-[#0348A8]">Wow, Lets Go</button>
|
||||||
|
<button class="border-[1px] border-[#0348A8] p-2.5 rounded-[4px] text-[#0348A8] w-full">Try Again</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clip-art-container absolute bottom-10 right-10" id="bottomAnimateClipart">
|
||||||
|
<div class="flex flex-row z-50 place-items-end clip-art">
|
||||||
|
<img src="/assets/clip-art-with-hand.svg" alt="Clip Art" class="">
|
||||||
|
<div class="relative bg-yellow-500 rounded-[4px] -ml-[10px]" style="background: linear-gradient(74.79deg, #E8EBFF 4.63%, #DDC9F1 97.93%); height: 200px; box-shadow: 0px 4px 8px 3px #CAD1F5;">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Left Star" class="absolute left-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
<img src="/assets/svg/bg-star.svg" alt="Right Star" class="absolute right-0 top-1/4 transform -translate-y-1/2 w-12 h-12">
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<div class="flex flex-col space-y-3 px-10 py-10 w-[348px] h-[187px] ">
|
||||||
|
<p class="text-center text-[14px] font-[600] text-[#394FC0]">Want to find how much stars you’ve earned?</p>
|
||||||
|
<button class="text-[12px] font-[700] text-white bg-[#394FC0] rounded-[4px] w-full py-2.5" onclick="calculateFromAI();" >Ask to Beanie</button>
|
||||||
|
<a href="" class="text-center text-[12px] font-[600] text-[#394FC0] underline decoration-2 underline-offset-[4px]">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="gallerySliderId" class="hidden p-2 z-10 absolute inset-0 bg-black w-full h-screen bg-opacity-50 flex justify-center items-center">
|
||||||
|
<div class="w-full max-w-6xl bg-white rounded-lg">
|
||||||
|
<div class="flex justify-between p-3">
|
||||||
|
<p class="text-[19px] font-[700]">Attempt 2</p>
|
||||||
|
<button onclick="closeGallery();"> <img src="/assets/svg/crossIcon.svg"></button>
|
||||||
|
</div>
|
||||||
|
<div class="relative w-full aspect-video overflow-hidden rounded-b-lg shadow-lg">
|
||||||
|
<img id="slideImage" src="" alt="" class="slide active w-full h-full aspect-video transition-transform duration-500" />
|
||||||
|
|
||||||
|
<button id="prevButton" class="flex justify-center items-center w-[40px] h-[40px] absolute left-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/leftIcon.svg" alt=""></button>
|
||||||
|
<button id="nextButton" class="flex justify-center items-center w-[40px] h-[40px] absolute right-4 top-1/2 transform -translate-y-1/2 bg-[#F4F7FF] text-gray-800 p-2 rounded-full shadow-lg hover:bg-gray-100 transition"><img src="/assets/svg/rightIcon.svg" alt=""></button>
|
||||||
|
|
||||||
|
<div id="slidetInfo" class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-50 p-2 text-center text-white">
|
||||||
|
<h2 class="text-lg font-bold" id="imageTitle">Image Title</h2>
|
||||||
|
<p class="text-sm" id="imageDescription">Description goes here.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script is:inline src="/assets/js/phaser_3.60.0.js"></script>
|
||||||
|
</main>
|
||||||
</Layout>
|
</Layout>
|
||||||
<script src="/saveGameData.js" is:inline></script>
|
<script src="/saveGameAI.js" is:inline></script>
|
||||||
<script is:inline>
|
<script is:inline>
|
||||||
|
function showAnimation() {
|
||||||
|
const clipArt = document.querySelector('.clip-art');
|
||||||
|
clipArt.classList.add('show');
|
||||||
|
}
|
||||||
const isMobile = window.innerWidth <= 768;
|
const isMobile = window.innerWidth <= 768;
|
||||||
|
const isTab = window.innerWidth > 768 && window.innerWidth <= 1416;
|
||||||
const drawingZone = {
|
const drawingZone = {
|
||||||
x: isMobile ? 0 : window.innerWidth / 4,
|
x: isMobile ? 0 : window.innerWidth / 4,
|
||||||
y: window.innerHeight / 4,
|
y: window.innerHeight / 4,
|
||||||
|
@ -22,7 +85,7 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
type: Phaser.AUTO,
|
type: Phaser.AUTO,
|
||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight,
|
height: window.innerHeight,
|
||||||
backgroundColor: 0xFFFFFF,
|
backgroundColor: 0xebedea,
|
||||||
scale: {
|
scale: {
|
||||||
mode: Phaser.Scale.FIT,
|
mode: Phaser.Scale.FIT,
|
||||||
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
autoCenter: Phaser.Scale.CENTER_HORIZONTALLY,
|
||||||
|
@ -40,9 +103,11 @@ import Layout from "../../layouts/Layout.astro";
|
||||||
let firstLayer, secondLayer, thirdLayer;
|
let firstLayer, secondLayer, thirdLayer;
|
||||||
let graphics;
|
let graphics;
|
||||||
let animatedLetter;
|
let animatedLetter;
|
||||||
let scoreTotal = 0; let isDrawing = false;
|
let scoreTotal = 0;
|
||||||
|
let isDrawing = false;
|
||||||
let formattedDateTime;
|
let formattedDateTime;
|
||||||
let gameStartTime = "start time here";
|
let gameStartTime = "start time here";
|
||||||
|
let demoButton;
|
||||||
// let x = 100;
|
// let x = 100;
|
||||||
|
|
||||||
// // Use x
|
// // Use x
|
||||||
|
@ -97,6 +162,28 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
noticeWidth = window.innerWidth * 0.5 - 120;
|
noticeWidth = window.innerWidth * 0.5 - 120;
|
||||||
noticeHeight = window.innerHeight * 0.32;
|
noticeHeight = window.innerHeight * 0.32;
|
||||||
};
|
};
|
||||||
|
if(isMobile){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.65;
|
||||||
|
resetIconWidth = 1.40;
|
||||||
|
tickIconWidth = 1.21;
|
||||||
|
cancelIconWidth = 1.08;
|
||||||
|
galleryIconWidth = 2;
|
||||||
|
}else if(isTab){
|
||||||
|
topLogoWidth = 4.5;
|
||||||
|
muteIconWidth = 1.6;
|
||||||
|
resetIconWidth = 1.43;
|
||||||
|
tickIconWidth = 1.29;
|
||||||
|
cancelIconWidth = 1.18;
|
||||||
|
galleryIconWidth = 1.81;
|
||||||
|
} else{
|
||||||
|
topLogoWidth = 6;
|
||||||
|
muteIconWidth = 1.3;
|
||||||
|
resetIconWidth = 1.26;
|
||||||
|
tickIconWidth = 1.222;
|
||||||
|
cancelIconWidth = 1.185;
|
||||||
|
galleryIconWidth = 1.345;
|
||||||
|
}
|
||||||
window.onload = function() {
|
window.onload = function() {
|
||||||
currentDate = new Date();
|
currentDate = new Date();
|
||||||
formattedDateTime = currentDate.toLocaleString();
|
formattedDateTime = currentDate.toLocaleString();
|
||||||
|
@ -114,139 +201,65 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
this.load.svg('succesImage', '/assets/svg/tick.svg');
|
||||||
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
this.load.svg('hintImage', '/assets/svg/hint.svg');
|
||||||
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
this.load.svg('handPointer', '/assets/svg/hand.svg');
|
||||||
this.load.image('backgroundImage', '/assets/bg6.png');
|
|
||||||
this.load.image('cloud', '/assets/cloud.png');
|
|
||||||
this.load.image('canvas', '/assets/canvas4.png');
|
|
||||||
|
|
||||||
|
this.load.image("tickIcon", '/assets/svg/tick2.svg');
|
||||||
this.load.image('sun', '/assets/sun.png');
|
this.load.image("muteIcon", '/assets/svg/mute.svg');
|
||||||
this.load.image('bgMobile', '/assets/bgMobile.png');
|
this.load.image("cancelIcon", '/assets/svg/cancel.svg');
|
||||||
this.load.image('canvasStand', '/assets/stand2.png');
|
this.load.image("resetIcon", '/assets/svg/reset.svg');
|
||||||
|
this.load.svg('helpIcons', '/assets/svg/help_icon.svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
this.add.image(customWidth / topLogoWidth, 30, "topLogo");
|
||||||
|
muteIcon = this.add.image(customWidth / muteIconWidth, 30, "muteIcon");
|
||||||
|
retryButton = this.add.image(customWidth / resetIconWidth, 30, "resetIcon");
|
||||||
|
submitButton = this.add.image(customWidth / tickIconWidth, 30, "tickIcon");
|
||||||
|
demoButton = this.add.image(customWidth / galleryIconWidth, 30, "helpIcons");
|
||||||
|
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
||||||
|
cancelIcon = this.add.image(customWidth / cancelIconWidth, 30, "cancelIcon");
|
||||||
|
const borderBottom = this.add.graphics();
|
||||||
|
const x = 0; const y = 54;
|
||||||
|
const lineWidth = window.innerWidth;
|
||||||
|
borderBottom.lineStyle(1, 0x0348A8);
|
||||||
|
borderBottom.setAlpha(0.2);
|
||||||
|
borderBottom.beginPath();
|
||||||
|
borderBottom.moveTo(x, y);
|
||||||
|
borderBottom.lineTo(x + lineWidth, y);
|
||||||
|
borderBottom.strokePath();
|
||||||
|
|
||||||
submitNotic = this.add.text(window.innerWidth / 2 - noticeWidth, window.innerHeight / 2 - noticeHeight, 'Submitted Successfully', {font: '600 20px Quicksand', fill: '#FFFFFF', backgroundColor: '#004aad',padding: {left: 20,right: 20,top: 10,bottom: 10}}).setDepth(3).setVisible(false);
|
submitButton.setInteractive().on('pointerdown', () => {
|
||||||
|
// console.log('Clicked');
|
||||||
|
// windowLoad();
|
||||||
|
submitUserData(this);
|
||||||
|
showAnimation();
|
||||||
|
parentMainContainer.classList.remove('hidden');
|
||||||
|
})
|
||||||
|
|
||||||
submitButton = this.add.text(submitWidth, submitHeight, "Submit", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 10, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
submitButton.setInteractive().on('pointerdown', () => {
|
|
||||||
// console.log('Clicked');
|
|
||||||
submitButton.setVisible(false);
|
|
||||||
// windowLoad();
|
|
||||||
submitUserData(this);
|
|
||||||
})
|
|
||||||
this.add.image(customWidth / 2 * 1.6 - 0.5, 50, 'topLogo');
|
|
||||||
this.add.text(customWidth / 10, 20, "Letter : z", { font: '700 40px quicksand', fill: '#05b3a4', });
|
|
||||||
const cloud = this.add.tileSprite(customWidth / 2, customHeight / 2 - cloudHeight, customWidth, cloudeSize, 'cloud').setAlpha(0.9);
|
|
||||||
cloud.setDepth(-1.8);
|
|
||||||
const scrollSpeed = 0.5;
|
|
||||||
this.time.addEvent({
|
|
||||||
loop: true,
|
|
||||||
callback: () => {
|
|
||||||
cloud.tilePositionX += scrollSpeed;
|
|
||||||
},
|
|
||||||
delay: 16, // Adjust the delay for the desired scrolling speed
|
|
||||||
});
|
|
||||||
|
|
||||||
const sun = this.add.sprite(customWidth - sunWidth, sunHeight, 'sun').setScale(sunScale).setDepth(-1.9);
|
|
||||||
|
|
||||||
|
|
||||||
const scaleFactor = sunScalePlus; // Scale factor (2 means double the size)
|
|
||||||
const duration = 3000; // Duration of the animation in milliseconds
|
|
||||||
|
|
||||||
// Create a scaling tween
|
|
||||||
this.tweens.add({
|
|
||||||
targets: sun,
|
|
||||||
scaleX: scaleFactor,
|
|
||||||
scaleY: scaleFactor,
|
|
||||||
duration: duration,
|
|
||||||
ease: 'Linear',
|
|
||||||
yoyo: true, // Makes the animation play in reverse
|
|
||||||
repeat: -1 // Repeat indefinitely
|
|
||||||
});
|
|
||||||
|
|
||||||
const backgroundImages = this.add.image(customWidth / 2, customHeight /2, 'backgroundImage').setDepth(-2).setScale(backgroundScale);
|
|
||||||
this.add.image(customWidth / 2 - 20, customHeight / 2 + letterHeight, 'letterZ').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
this.add.image(customWidth / 2 - 20, customHeight / 2 + letterHeight, 'letterZ').setAlpha(0.2).setDepth(0.5).setScale(letterScale);
|
||||||
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterZ').setDepth(2).setScale(letterScale);
|
const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'letterZ').setDepth(2).setScale(letterScale);
|
||||||
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedZ').setDepth(2); canvasStand
|
// const firstScreen = this.add.image(customWidth / 2, customHeight / 2 + letterHeight, 'animatedZ').setDepth(2); canvasStand
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
// this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
const canvas = this.add.image(customWidth / 2, customHeight / 2 + canvasHeight, 'canvas').setScale(canvasScale);
|
|
||||||
// Set up a mask for the drawing area based on the canvas dimensions
|
|
||||||
const maskGraphics = this.make.graphics()
|
|
||||||
maskGraphics.fillRect(customWidth / 2 - (canvas.width * canvasScale) / 2, customHeight / 2 + canvasHeight - (canvas.height * canvasScale) / 2, canvas.width * canvasScale, canvas.height * canvasScale);
|
|
||||||
const mask = maskGraphics.createGeometryMask();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let hideButton = this.add.text(helpButtonWidth, helpButtonHeight, "Let`s Do", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
hideButton.setInteractive().on('pointerdown', () => {
|
|
||||||
animatedLetter.stop();
|
|
||||||
isDemoButtonClicked = false;
|
|
||||||
firstScreen.setVisible(false);
|
|
||||||
hideButton.setVisible(false); // Hide the "Hide" button
|
|
||||||
demoButton.setVisible(true); // Show the "Demo" button
|
|
||||||
graphics.setVisible(true);
|
|
||||||
animatedLetter.setVisible(false);
|
|
||||||
});
|
|
||||||
hideButton.setVisible(false);
|
|
||||||
let demoButton = this.add.text(helpButtonWidth, helpButtonHeight, "Demo", {
|
|
||||||
font: '900 24px quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor: '#7c4c23',
|
|
||||||
padding: { x: 20, y: 10 },
|
|
||||||
borderRadius: '15px', // Border radius
|
|
||||||
shadow: {
|
|
||||||
offsetX: 2, // X offset for the shadow
|
|
||||||
offsetY: 2, // Y offset for the shadow
|
|
||||||
color: '#000', // Shadow color
|
|
||||||
blur: 5, // Shadow blur
|
|
||||||
fill: true // Apply shadow to fill (background color)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
demoButton.setInteractive().on('pointerdown', () => {
|
demoButton.setInteractive().on('pointerdown', () => {
|
||||||
animatedLetter.setCurrentTime(0);
|
animatedLetter.setCurrentTime(0);
|
||||||
animatedLetter.play(true);
|
animatedLetter.play(true);
|
||||||
graphics.setVisible(false);
|
graphics.setVisible(false);
|
||||||
firstScreen.setVisible(true);
|
firstScreen.setVisible(true);
|
||||||
demoButton.setVisible(false); // Hide the "Demo" button
|
if(animatedLetter.visible){
|
||||||
hideButton.setVisible(true); // Show the "Hide" button
|
animatedLetter.setVisible(false);
|
||||||
animatedLetter.setVisible(true);
|
graphics.setVisible(true);
|
||||||
});
|
firstScreen.setVisible(false);
|
||||||
|
} else{
|
||||||
|
graphics.setVisible(false);
|
||||||
|
animatedLetter.setVisible(true);
|
||||||
|
firstScreen.setVisible(true);
|
||||||
|
|
||||||
const screenCenterX = this.cameras.main.worldView.x + this.cameras.main.width / 2;
|
}
|
||||||
const baseFontSize = 24;
|
})
|
||||||
const responsiveFontSize = (window.innerWidth / 480) * baseFontSize;
|
|
||||||
const descrptText = this.add.text(screenCenterX, 90, 'Let`s learn how to write letter : z', { font: `${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
let responsiveFontSize = isMobile ? 16 : 32;
|
||||||
|
this.add.text(window.innerWidth / 2, 80, 'Letter: z', {fill: '#60C6CB', font: `900 ${responsiveFontSize}px quicksand`}).setOrigin(0.5);
|
||||||
|
const descrptText = this.add.text(window.innerWidth/2, 125, 'Let`s learn how to write letter : z', { font: `900 ${responsiveFontSize}px quicksand`, fill: '#7c4c23', fontWeight : 'bold'}).setOrigin(0.5);
|
||||||
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedZHeight, 'animatedZ').setDepth(2).setScale(animatedZScale);
|
animatedLetter = this.add.video(customWidth / 2 , customHeight / 2 + animatedZHeight, 'animatedZ').setDepth(2).setScale(animatedZScale);
|
||||||
|
|
||||||
// Play the video
|
// Play the video
|
||||||
// animatedLetter.play();
|
// animatedLetter.play();
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
|
@ -259,11 +272,11 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
let textX, textY;
|
let textX, textY;
|
||||||
|
let stepTextSize = isMobile ? 12 : 16;
|
||||||
firstLayer = this.add.image(customWidth / 2 - 20, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
firstLayer = this.add.image(customWidth / 2 - 20, customHeight / 2 + letterHeight, 'layer1').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 + 40 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 + 40 : customWidth * 0.75;
|
||||||
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
textY = isMobile ? customHeight / 5 : customHeight / 2.4;
|
||||||
const firstTextLayer = this.add.text(textX, textY, '1. Slide',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const firstTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '1. Slide',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioOneAudio = this.sound.add('audioOne');
|
const audioOneAudio = this.sound.add('audioOne');
|
||||||
// audioOneAudio.play();
|
// audioOneAudio.play();
|
||||||
firstLayer.setDepth(1);
|
firstLayer.setDepth(1);
|
||||||
|
@ -272,7 +285,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
secondLayer = this.add.image(customWidth / 2 - 20, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
secondLayer = this.add.image(customWidth / 2 - 20, customHeight / 2 + letterHeight, 'layer2').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 4 : customWidth * 0.75;
|
||||||
const secondTextLayer = this.add.text(textX, textY, '2. Slant',{ font: '700 40px quicksand', fill: '#05b3a4'});
|
const secondTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '2. Slant',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioTwoAudio = this.sound.add('audioTwo');
|
const audioTwoAudio = this.sound.add('audioTwo');
|
||||||
secondTextLayer.setVisible(false);
|
secondTextLayer.setVisible(false);
|
||||||
secondLayer.setDepth(1);
|
secondLayer.setDepth(1);
|
||||||
|
@ -282,7 +295,7 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
thirdLayer = this.add.image(customWidth / 2 - 20, customHeight / 2 + letterHeight, 'layer3').setScale(letterScale);
|
thirdLayer = this.add.image(customWidth / 2 - 20, customHeight / 2 + letterHeight, 'layer3').setScale(letterScale);
|
||||||
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
textX = isMobile ? customWidth / 3 : customWidth * 0.75;
|
||||||
const thirdTextLayer = this.add.text(textX, textY, '3. Slide', { font: '700 40px quicksand', fill: '#05b3a4'});
|
const thirdTextLayer = this.add.text(window.innerWidth / 2, window.innerHeight / 1.2, '3. Slide',{ font: `600 ${stepTextSize}px quicksand`, fill: '#000000'}).setOrigin(0.5);
|
||||||
const audioThreeAudio = this.sound.add('audioOne');
|
const audioThreeAudio = this.sound.add('audioOne');
|
||||||
thirdTextLayer.setVisible(false);
|
thirdTextLayer.setVisible(false);
|
||||||
thirdLayer.setDepth(1.1);
|
thirdLayer.setDepth(1.1);
|
||||||
|
@ -296,8 +309,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
let secondDragStartPoint = { x: 0, y: 0 };
|
let secondDragStartPoint = { x: 0, y: 0 };
|
||||||
let thirdDragStartPoint = { x: 0, y: 0 };
|
let thirdDragStartPoint = { x: 0, y: 0 };
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// Add this code for firstLayer
|
// Add this code for firstLayer
|
||||||
firstLayer.on('dragstart', (pointer) => {
|
firstLayer.on('dragstart', (pointer) => {
|
||||||
firstDragStartPoint.x = pointer.x;
|
firstDragStartPoint.x = pointer.x;
|
||||||
|
@ -359,7 +370,6 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
|
|
||||||
|
|
||||||
graphics = this.add.graphics();
|
graphics = this.add.graphics();
|
||||||
graphics.setMask(mask);
|
|
||||||
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
graphics.lineStyle(15, 0xFFFFFF, 2).setDepth(2); // Set line style (width, color, alpha)
|
||||||
this.input.on('pointerdown', function (pointer) {
|
this.input.on('pointerdown', function (pointer) {
|
||||||
isDrawing = true;
|
isDrawing = true;
|
||||||
|
@ -377,34 +387,54 @@ let scoreTotal = 0; let isDrawing = false;
|
||||||
graphics.lineTo(pointer.x, pointer.y);
|
graphics.lineTo(pointer.x, pointer.y);
|
||||||
graphics.strokePath();
|
graphics.strokePath();
|
||||||
});
|
});
|
||||||
let startButton = this.add.text(startButtonWidth, startButtonHeight, "Start", {
|
|
||||||
font: '900 24px Quicksand',
|
|
||||||
fill: '#05b3a4',
|
|
||||||
backgroundColor : '#7c4c23',
|
|
||||||
padding: {x: 20, y: 10},
|
|
||||||
shadow: {
|
|
||||||
offsetX : 2,
|
|
||||||
offsetY : 2,
|
|
||||||
color: '#000',
|
|
||||||
blur: 5,
|
|
||||||
fill: true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
firstTextLayer.setVisible(false);
|
firstTextLayer.setVisible(false);
|
||||||
startButton.setInteractive().on('pointerdown', () => {
|
document.getElementById('beforeStartBtn').addEventListener('click', function() {
|
||||||
|
document.getElementById('blurDisplay').classList.add('hidden');
|
||||||
audioOneAudio.play();
|
audioOneAudio.play();
|
||||||
submitButton.setVisible(true);
|
|
||||||
firstTextLayer.setVisible(true);
|
firstTextLayer.setVisible(true);
|
||||||
animatedLetter.setVisible(false);
|
animatedLetter.setVisible(false);
|
||||||
firstScreen.setVisible(false);
|
firstScreen.setVisible(false);
|
||||||
graphics.setVisible(true);
|
graphics.setVisible(true);
|
||||||
hideButton.setVisible(false);
|
|
||||||
demoButton.setVisible(true);
|
|
||||||
startButton.setVisible(false);
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.clear-button {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
/* Animation styles */
|
||||||
|
@keyframes slideInUp {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(100%); /* Start below the viewport */
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0); /* End at its original position */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art-container {
|
||||||
|
overflow: hidden; /* Prevents overflow during the animation */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art {
|
||||||
|
transform: translateX(100%); /* Initially off-screen to the right */
|
||||||
|
opacity: 0; /* Initially hidden */
|
||||||
|
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Smooth transition */
|
||||||
|
}
|
||||||
|
|
||||||
|
.clip-art.show {
|
||||||
|
transform: translateX(0); /* Move the image into view */
|
||||||
|
opacity: 1; /* Fade in */
|
||||||
|
}
|
||||||
|
.slide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.active{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in New Issue