From bde4b08f1b40c24efa2cd2a2fd99cdc331f92cdd Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Tue, 24 Sep 2024 20:59:00 +0530 Subject: [PATCH 01/22] fix: add dpr and scale the tracks and marbles --- src/game/PhaserGame.tsx | 31 ++- src/game/main.ts | 16 +- src/game/scenes/Game.ts | 435 +++++++++++++++++++---------------- src/game/scenes/Preloader.ts | 28 +-- 4 files changed, 295 insertions(+), 215 deletions(-) diff --git a/src/game/PhaserGame.tsx b/src/game/PhaserGame.tsx index 0c39804..83c6634 100644 --- a/src/game/PhaserGame.tsx +++ b/src/game/PhaserGame.tsx @@ -2,6 +2,7 @@ import { forwardRef, useLayoutEffect, useRef, useState } from "react"; import StartGame from "./main"; import { GameVoiceInfo } from "./scenes/Preloader"; import * as Tone from "tone"; +import { Box } from "@mui/material"; export interface IRefPhaserGame { game: Phaser.Game | null; @@ -25,6 +26,9 @@ export interface IGameDataParams { trailEndSize: number; recordDuration: number; isRecord: boolean; + height?: number; + dprAdjustedWidth?: number; + dprAdjustedHeight?: number; } interface IProps extends IGameDataParams { @@ -61,11 +65,12 @@ export const PhaserGame = forwardRef( }, ref ) { + const height = (width * 16) / 9; const game = useRef(null!); - const [mediaRecorder, setMediaRecorder] = - useState(null); - const [isRecording, setIsRecording] = useState(false); + const [, setMediaRecorder] = useState(null); + const [, setIsRecording] = useState(false); + const [dpr] = useState(window.devicePixelRatio); const startRecording = (canvas: HTMLCanvasElement) => { // const canvas = canvasRef.current; @@ -110,6 +115,9 @@ export const PhaserGame = forwardRef( }; useLayoutEffect(() => { + const dprAdjustedWidth = width * dpr; + const dprAdjustedHeight = height * dpr; + game.current = StartGame("game-container", { voices, coverDocId, @@ -119,7 +127,10 @@ export const PhaserGame = forwardRef( selectedTracks, noOfRaceTracks, gravityY, + dprAdjustedWidth, + dprAdjustedHeight, width, + height, enableMotion, trailPath, trailsLifeSpace, @@ -148,7 +159,19 @@ export const PhaserGame = forwardRef( }; }, [ref]); - return
; + return ( + + ); } ); diff --git a/src/game/main.ts b/src/game/main.ts index 9a7b7e6..cf59704 100644 --- a/src/game/main.ts +++ b/src/game/main.ts @@ -17,7 +17,16 @@ const config: Phaser.Types.Core.GameConfig = { // debug: true, }, }, - pixelArt: true, + // pixelArt: true, + // antialias: false, + // scale: { + // mode: Phaser.Scale.FIT, + // }, + // render: { + // pixelArt: true, + // }, + // mode: Phaser.Scale.FIT, + // autoRound: false, scene: [Preloader, GameScene], }; @@ -26,9 +35,10 @@ const StartGame = (parent: string, data: IGameDataParams) => { config.physics.matter.gravity.y = data.gravityY; const game = new Game({ ...config, - width: data.width, - height: (data.width * 16) / 9, + width: data.dprAdjustedWidth, + height: data.dprAdjustedHeight, parent, + // scale: { mode: Phaser.Scale.FIT, autoRound: true }, }); game.scene.start("preloader", data); // // Add an event listener to apply the border radius once the game canvas is created diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 71cbd55..cd5433d 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -73,7 +73,10 @@ export default class Game extends Phaser.Scene { marbleTrailParticles: Phaser.GameObjects.Particles.ParticleEmitter[] = []; trailConfig = { speed: { min: -50, max: 50 }, - scale: { start: 1, end: 0.5 }, + scale: { + start: window.devicePixelRatio, + end: window.devicePixelRatio * 0.5, + }, blendMode: "ADD", lifespan: 400, alpha: 0.5, @@ -81,6 +84,8 @@ export default class Game extends Phaser.Scene { damageMultipliyer: number = 1; level1Hammer: Phaser.GameObjects.Sprite | undefined; level2Hammer: Phaser.GameObjects.Sprite | undefined; + canvasWidth: number = 0; + canvasHeight: number = 0; init(data: IGameDataParams) { // Sort the voices randomly @@ -92,9 +97,11 @@ export default class Game extends Phaser.Scene { data.selectedTracks, this.noOfRaceTracks ); - this.marbleRadius = data.width >= 414 ? 23 : 22; + this.marbleRadius = + (data.width >= 414 ? 22 : 20) * window.devicePixelRatio; this.enableMotion = data.enableMotion; - + this.canvasWidth = data.width; + if (data.height) this.canvasHeight = data.height; this.centerX = this.cameras.main.width / 2; this.centerY = this.cameras.main.height / 2; this.trailConfig.scale.end = data.trailEndSize; @@ -115,6 +122,11 @@ export default class Game extends Phaser.Scene { ) => { // Create the texture sprite const textureSprite = this.add.sprite(xOffset, yOffset, "textureImage"); + // textureSprite.setScale( + // (this.canvasWidth / textureSprite.width) * window.devicePixelRatio, + // (this.canvasHeight / textureSprite.height) * window.devicePixelRatio + // ); + textureSprite.setScale(window.devicePixelRatio); // Use the base sprite's texture as a mask for the texture sprite const mask = new Phaser.Display.Masks.BitmapMask(this, baseSprite); @@ -124,6 +136,60 @@ export default class Game extends Phaser.Scene { baseSprite.setVisible(false); }; + scaleBaseSprite = ( + baseSprite: Phaser.Physics.Matter.Sprite | Phaser.Physics.Matter.Image, + barsWidth: number = 0 + ) => { + baseSprite.setScale( + ((this.canvasWidth + barsWidth) / baseSprite.width) * + window.devicePixelRatio, + window.devicePixelRatio + ); + }; + + handleDamage(target: Phaser.Physics.Matter.Sprite, e: any) { + // Logic for handling damage + console.log("Damage dealt to the target!"); + if (this.damageMultipliyer) { + target.setScale(target.scale / (1.1 * this.damageMultipliyer)); + const particleConfig = { + speed: { min: -50, max: 50 }, + scale: { start: 1, end: 10 }, + blendMode: "ADD", + // lifespan: 400, + alpha: 0.5, + particleBringToTop: true, + }; + const particle = this.add.particles( + e.worldX, + e.worldY, + "trail", + particleConfig + ); + // Add an event listener to destroy the emitter after the particles' lifespan + this.time.delayedCall( + 200, + () => { + // emitter.stop(); + particle.destroy(); // Destroys the particle manager and emitter + }, + [], + this + ); + } + if (target.scale <= 0.08) { + target.destroy(); + } + + // // Example: reduce health, show effects, etc. + // target.health = (target.health || 100) - 10; // Example: reduce health by 10 + // console.log("Target health:", target.health); + + // if (target.health <= 0) { + // console.log("Target destroyed!"); + // target.destroy(); // Destroy the target if health is 0 + // } + } createCrossScreen = ( startOffset: number, canvasWidth: number, @@ -215,14 +281,20 @@ export default class Game extends Phaser.Scene { miniShapes: any, obstaclesShapes: any ) => { - const scaleFactor = this.cameras.main.width / 414; + // const scaleFactor = this.cameras.main.width / 414; const yOffset = startOffset + 835 / 2; - const baseSprite = this.matter.add - .sprite(xOffset, yOffset, "prod_texture_loaded_06", undefined, { + const baseSprite = this.matter.add.sprite( + xOffset, + yOffset, + "prod_texture_loaded_06", + undefined, + { shape: prodShapes["06"], isStatic: true, - }) - .setScale(scaleFactor); + } + ); + // .setScale(scaleFactor); + this.scaleBaseSprite(baseSprite, this.canvasWidth === 414 ? 100 : 90); const seesawX = xOffset - 2; const seesawY = yOffset - 130; const seesaw = this.matter.add @@ -230,12 +302,12 @@ export default class Game extends Phaser.Scene { shape: miniShapes["06b"], // isStatic: true, }) - .setScale(scaleFactor); + .setScale(window.devicePixelRatio); const contraint = this.matter.constraint.create({ bodyA: seesaw.body as BodyType, bodyB: baseSprite.body as BodyType, pointA: { x: 0, y: 0 }, - pointB: { x: -2, y: -130 * scaleFactor }, + pointB: { x: -2, y: -130 * window.devicePixelRatio }, stiffness: 1, length: 0, }); @@ -272,51 +344,8 @@ export default class Game extends Phaser.Scene { this.matter.world.add(contraint); this.createTextureMask(seesawX, seesawY, seesaw); this.createTextureMask(xOffset, yOffset, baseSprite); - return startOffset + 840; + return startOffset + baseSprite.height * window.devicePixelRatio; }; - handleDamage(target: Phaser.Physics.Matter.Sprite, e: any) { - // Logic for handling damage - console.log("Damage dealt to the target!"); - if (this.damageMultipliyer) { - target.setScale(target.scale / (1.1 * this.damageMultipliyer)); - const particleConfig = { - speed: { min: -50, max: 50 }, - scale: { start: 1, end: 10 }, - blendMode: "ADD", - // lifespan: 400, - alpha: 0.5, - particleBringToTop: true, - }; - const particle = this.add.particles( - e.worldX, - e.worldY, - "trail", - particleConfig - ); - // Add an event listener to destroy the emitter after the particles' lifespan - this.time.delayedCall( - 200, - () => { - // emitter.stop(); - particle.destroy(); // Destroys the particle manager and emitter - }, - [], - this - ); - } - if (target.scale <= 0.08) { - target.destroy(); - } - - // // Example: reduce health, show effects, etc. - // target.health = (target.health || 100) - 10; // Example: reduce health by 10 - // console.log("Target health:", target.health); - - // if (target.health <= 0) { - // console.log("Target destroyed!"); - // target.destroy(); // Destroy the target if health is 0 - // } - } createCircleBlockers = ( xOffset: number, startOffset: number, @@ -459,12 +488,21 @@ export default class Game extends Phaser.Scene { obstaclesShapes: any ) => { const yOffset = startOffset + 833 / 2; - const baseSprite = this.matter.add - .sprite(xOffset + 0, yOffset, "prod_texture_loaded_03", undefined, { + const baseSprite = this.matter.add.sprite( + xOffset, + yOffset, + "prod_texture_loaded_03", + undefined, + { shape: prodShapes["03"], isStatic: true, - }) - .setScale(this.cameras.main.width / 414); + } + ); + this.scaleBaseSprite(baseSprite, this.canvasWidth === 414 ? 100 : 90); // TODO: Fix this + // baseSprite.setScale( + // (this.cameras.main.width / baseSprite.width) * + // window.devicePixelRatio + // ); this.createTextureMask(xOffset, yOffset, baseSprite); const randomObstaclePosition = _.sample([ @@ -476,28 +514,27 @@ export default class Game extends Phaser.Scene { ]); const randomObstacle = _.sample(ObstacleNames); - const target = this.matter.add - .sprite( - randomObstaclePosition[0], - randomObstaclePosition[1], - `obstacle_${randomObstacle}`, - undefined, - { - shape: obstaclesShapes[ - randomObstacle as keyof typeof obstaclesShapes - ], - // angle: 124, - friction: 0, - frictionAir: 0, - frictionStatic: 0, - } - ) - .setScale(0.17); + const target = this.matter.add.sprite( + randomObstaclePosition[0], + randomObstaclePosition[1], + `obstacle_${randomObstacle}`, + undefined, + { + shape: obstaclesShapes[ + randomObstacle as keyof typeof obstaclesShapes + ], + // angle: 124, + friction: 0, + frictionAir: 0, + frictionStatic: 0, + } + ); + target.setScale(this.marbleRadius / target.width); target.setInteractive(); target.on("pointerdown", (e: any) => { this.handleDamage(target, e); }); - return startOffset + 1000; + return startOffset + baseSprite.height * window.devicePixelRatio; }; createReduceSizeSlider = ( @@ -505,22 +542,22 @@ export default class Game extends Phaser.Scene { startOffset: number, prodShapes: any ) => { - this.reduceSizeScreenOffset.push(startOffset); + this.reduceSizeScreenOffset.push(startOffset - 400); const yOffset = startOffset + 833 / 2; - const baseSprite = this.matter.add - .sprite( - xOffset + 3.5, - yOffset, - "prod_texture_loaded_16", - undefined, - { - shape: prodShapes["16"], - isStatic: true, - } - ) - .setScale(this.cameras.main.width / 414); + const baseSprite = this.matter.add.sprite( + xOffset + 3.5, + yOffset, + "prod_texture_loaded_16", + undefined, + { + shape: prodShapes["16"], + isStatic: true, + } + ); + this.scaleBaseSprite(baseSprite, this.canvasWidth === 414 ? 100 : 120); + // .setScale(this.cameras.main.width / 414); this.createTextureMask(xOffset, yOffset, baseSprite); - startOffset += 800; + startOffset += baseSprite.height * window.devicePixelRatio; this.increaseSizeScreenOffset.push(startOffset); startOffset += 300; return startOffset; @@ -637,14 +674,22 @@ export default class Game extends Phaser.Scene { prodShapes: any, obstaclesShapes: any ) => { - const yOffset = startOffset + 835 / 2; - const baseSprite = this.matter.add - .sprite(xOffset, yOffset, "prod_texture_loaded_01", undefined, { + const yOffset = startOffset + 833 / 2; + const baseSprite = this.matter.add.sprite( + xOffset, + yOffset, + "prod_texture_loaded_01", + undefined, + { shape: prodShapes["01"], isStatic: true, - }) - .setScale(this.cameras.main.width / 414); - // .setDisplaySize(this.cameras.main.width + 96, 835); + } + ); + this.scaleBaseSprite(baseSprite, 100); + // baseSprite.setScale( + // ((414 + 100) / baseSprite.width) * window.devicePixelRatio, + // window.devicePixelRatio + // ); this.createTextureMask(xOffset, yOffset, baseSprite); const randomObstaclePosition = _.sample([ [150, startOffset], @@ -657,29 +702,29 @@ export default class Game extends Phaser.Scene { [this.centerX, startOffset + 600], ]); const randomObstacle = _.sample(ObstacleNames); - const target = this.matter.add - .sprite( - randomObstaclePosition[0], - randomObstaclePosition[1], - `obstacle_${randomObstacle}`, - undefined, - { - shape: obstaclesShapes[ - randomObstacle as keyof typeof obstaclesShapes - ], - // angle: 124, - friction: 0, - frictionAir: 0, - frictionStatic: 0, - } - ) - .setScale(0.17); + const target = this.matter.add.sprite( + randomObstaclePosition[0], + randomObstaclePosition[1], + `obstacle_${randomObstacle}`, + undefined, + { + shape: obstaclesShapes[ + randomObstacle as keyof typeof obstaclesShapes + ], + // angle: 124, + friction: 0, + frictionAir: 0, + frictionStatic: 0, + // ignoreGravity: true, + } + ); + target.setScale(this.marbleRadius / target.width); target.setInteractive(); target.on("pointerdown", (e: any) => { this.handleDamage(target, e); }); - return startOffset + 835; + return startOffset + baseSprite.height * window.devicePixelRatio; }; createZigzagSlider = ( xOffset: number, @@ -688,12 +733,17 @@ export default class Game extends Phaser.Scene { obstaclesShapes: any ) => { const yOffset = startOffset + 833 / 2; - const baseSprite = this.matter.add - .sprite(xOffset, yOffset, "prod_texture_loaded_07", undefined, { + const baseSprite = this.matter.add.sprite( + xOffset, + yOffset, + "prod_texture_loaded_07", + undefined, + { shape: prodShapes["07"], isStatic: true, - }) - .setScale(this.cameras.main.width / 414); + } + ); + this.scaleBaseSprite(baseSprite, this.canvasWidth === 414 ? 100 : 90); // TODO: Fix this this.createTextureMask(xOffset, yOffset, baseSprite); const randomObstaclePosition = _.sample([ [150, startOffset], @@ -726,7 +776,7 @@ export default class Game extends Phaser.Scene { this.handleDamage(target, e); }); - return startOffset + 880; + return startOffset + baseSprite.height * window.devicePixelRatio; }; createMarbles = (marbleRadius: number, miniShapes: any) => { this.largeCircle = this.matter.add.sprite( @@ -741,6 +791,10 @@ export default class Game extends Phaser.Scene { friction: 1, } ); + this.largeCircle.setScale( + (this.canvasWidth / this.largeCircle.width) * + window.devicePixelRatio + ); // .setScale(0.8); const xOffsetValues = [ this.centerX - 46, @@ -764,9 +818,14 @@ export default class Game extends Phaser.Scene { friction: 0, frictionAir: 0, frictionStatic: 0, + // Add colors + render: { + fillColor: 0xff0000, + }, } ); this.marbles.push(circleBody); + this.marbleTrailParticles.push( this.add.particles(0, 0, "trail", { ...this.trailConfig, @@ -784,8 +843,7 @@ export default class Game extends Phaser.Scene { circleBody.position.y, `resized_${v.id}` ); - - circleImage.setDisplaySize(marbleRadius * 2, marbleRadius * 2); // Adjust size to match the physics body + circleImage.setDisplaySize(marbleRadius * 2, marbleRadius * 2); circleImage.setOrigin(0.5, 0.5); const maskShape = this.make.graphics(); maskShape.fillStyle(0xffffff); @@ -800,7 +858,7 @@ export default class Game extends Phaser.Scene { // Create label for each circle let label = this.add.text( circleImage.x, - circleImage.y - 80, + circleImage.y - 560, this.voices[i].name, { fontSize: "32px", @@ -814,7 +872,7 @@ export default class Game extends Phaser.Scene { }); this.countdownText = this.add .text(this.centerX, this.centerY - 100, "3", { - fontSize: "64px", + fontSize: `${64 * window.devicePixelRatio}px`, color: "#ffffff", }) .setOrigin(0.5); @@ -988,16 +1046,13 @@ export default class Game extends Phaser.Scene { // let scale = Math.max(scaleX, scaleY); // this.background.setScale(scale).setScrollFactor(0); this.background = this.add - .tileSprite( - 0, - 0, - this.cameras.main.width, - this.cameras.main.height, - "background" - ) - // .setScale(scale) - .setOrigin(0, 0) - .setScrollFactor(0); + .tileSprite(0, 0, 0, 0, "background") + .setScrollFactor(0) + .setOrigin(0, 0); + this.background.setScale( + (414 / this.background.width) * window.devicePixelRatio, + (736 / this.background.height) * window.devicePixelRatio + ); this.add .image(this.centerX, this.centerY, "center_logo") .setDisplaySize(254, 84) @@ -1019,8 +1074,9 @@ export default class Game extends Phaser.Scene { var miniShapes = this.cache.json.get("mini_shapes"); var obstaclesShapes = this.cache.json.get("obstacles_shapes"); - let startOffset = 800; - const xOffset = canvasWidth / 2; + let startOffset = 800 * window.devicePixelRatio; + const xOffset = this.centerX; + // this.selectedTracks = ["06", "07", "03", "01", "16"]; this.selectedTracks.map((trackNo) => { switch (trackNo) { case "01": @@ -1100,11 +1156,27 @@ export default class Game extends Phaser.Scene { } }); const finishOffset = startOffset + 250; - this.add.image(centerX, finishOffset, "finish_line").setScale(0.2); + this.add.image(centerX, finishOffset, "finish_line").setScale(0.5); + // finishLineImage.setScale( + // (this.canvasWidth / finishLineImage.width) * + // window.devicePixelRatio, + // window.devicePixelRatio + // ); + // .setScale(window.devicePixelRatio); this.finishLineOffset = finishOffset; - // .setDisplaySize(960, 40); - this.cameras.main.setBounds(0, 0, canvasWidth, finishOffset + 250); - this.matter.world.setBounds(0, 0, canvasWidth, startOffset + 750); + // // .setDisplaySize(960, 40); + this.cameras.main.setBounds( + 0, + 0, + this.cameras.main.width, + finishOffset + 250 + ); + this.matter.world.setBounds( + 0, + 0, + this.cameras.main.width, + finishOffset + 800 + ); this.createMarbles(this.marbleRadius, miniShapes); this.crossLeftRotation.map((baseSprite) => @@ -1148,35 +1220,6 @@ export default class Game extends Phaser.Scene { } this.isRotating = false; this.countdownText.destroy(); - // const velocity = 2; // Adjust this value to set the desired release velocity - - // for (let i = 0; i < this.voices.length; i++) { - // const currentAngle = - // this.baseAngle + i * this.angleIncrement; - // const x = - // this.centerX + - // this.radius * Math.cos(currentAngle); - // const y = - // this.centerY + - // this.radius * Math.sin(currentAngle); - - // // Set the new position of the circle - // this.matter.body.setPosition( - // this.marbles[i], - // { x, y }, - // false - // ); - - // // Calculate the velocity components - // const velocityX = velocity * Math.cos(currentAngle); - // const velocityY = velocity * Math.sin(currentAngle); - - // // Apply the velocity to the body - // this.matter.body.setVelocity(this.marbles[i], { - // x: velocityX, - // y: velocityY, - // }); - // } } } }, @@ -1187,20 +1230,20 @@ export default class Game extends Phaser.Scene { this.musicStartOffset ).then(() => (this.isInstrumentPlaying = true)); - this.renderWeapons(); + // this.renderWeapons(); } update(time: number, delta: number): void { - if (this.damageMultipliyer === 1) { - // Highlight level 1 hammer - this.level2Hammer?.setScale(0.1); - this.level1Hammer?.setScale(0.2); - } else if (this.damageMultipliyer === 1.5) { - // Highlight level 2 hammer - this.level1Hammer?.setScale(0.1); - this.level2Hammer?.setScale(0.2); - } - if (this.enableMotion && !this.isRotating) - this.background.tilePositionX += 0.08; + // if (this.damageMultipliyer === 1) { + // // Highlight level 1 hammer + // this.level2Hammer?.setScale(0.1); + // this.level1Hammer?.setScale(0.2); + // } else if (this.damageMultipliyer === 1.5) { + // // Highlight level 2 hammer + // this.level1Hammer?.setScale(0.1); + // this.level2Hammer?.setScale(0.2); + // } + // if (this.enableMotion && !this.isRotating) + // this.background.tilePositionX += 0.08; if (this.marbles.length) { if (this.isRotating) { // Update the base angle to create the circular motion @@ -1232,23 +1275,26 @@ export default class Game extends Phaser.Scene { // // ); // // this.labels[i].setPosition(-100, -100); // } else { - marbleImage.setPosition( - voiceBody.position.x, - voiceBody.position.y - ); - marbleImage.setRotation(voiceBody.angle); - this.marblesMasks[i].setPosition( - voiceBody.position.x - voiceBody.circleRadius, - voiceBody.position.y - voiceBody.circleRadius - ); + if (marbleImage) { + marbleImage.setPosition( + voiceBody.position.x, + voiceBody.position.y + ); + marbleImage.setRotation(voiceBody.angle); + } + if (this.marblesMasks[i]) + this.marblesMasks[i].setPosition( + voiceBody.position.x - voiceBody.circleRadius, + voiceBody.position.y - voiceBody.circleRadius + ); // this.marblesMasks[i].setRotation(voiceBody.angle); - this.labels[i]?.setPosition( voiceBody.position.x - this.labels[i].width / 2, voiceBody.position.y - 60 ); const currentCrossIndex = this.currentMarblesSizeIndices[i.toString()]; + if ( this.heightReducedIndices.includes(i) && voiceBody.position.y > @@ -1256,11 +1302,11 @@ export default class Game extends Phaser.Scene { ) { this.currentMarblesSizeIndices[i.toString()] += 1; this.matter.body.scale(voiceBody, 2, 2); - marbleImage.setDisplaySize( + marbleImage?.setDisplaySize( this.marbleRadius * 2, this.marbleRadius * 2 ); - this.marblesMasks[i].scale = 1; + if (this.marblesMasks[i]) this.marblesMasks[i].scale = 1; this.heightReducedIndices = this.heightReducedIndices.filter((idx) => idx !== i); this.marbleTrailParticles[i].setConfig(this.trailConfig); @@ -1273,11 +1319,11 @@ export default class Game extends Phaser.Scene { ) { this.heightReducedIndices.push(i); this.matter.body.scale(voiceBody, 0.5, 0.5); - marbleImage.setDisplaySize( + marbleImage?.setDisplaySize( this.marbleRadius, this.marbleRadius ); - this.marblesMasks[i].scale = 0.5; + if (this.marblesMasks[i]) this.marblesMasks[i].scale = 0.5; this.marbleTrailParticles[i].setConfig({ ...this.trailConfig, scale: { start: 0.5, end: 0.01 }, @@ -1331,7 +1377,6 @@ export default class Game extends Phaser.Scene { this.horizontalCrossLeftRotation.map((rs) => rs.setAngle(rs.angle - 2.5) ); - // Bars up/down motion this.motionTimeForUpDownWard += delta; this.upDownMotionElems.map( diff --git a/src/game/scenes/Preloader.ts b/src/game/scenes/Preloader.ts index 376c0c3..eb051da 100644 --- a/src/game/scenes/Preloader.ts +++ b/src/game/scenes/Preloader.ts @@ -93,25 +93,27 @@ export default class Preloader extends Phaser.Scene { if (this.params.voices.length) { this.params.voices.map((voice) => { // this.load.image(voice.id, voice.avatar); - const image = new Image(); - image.src = voice.avatar; - image.crossOrigin = "anonymous"; - new Promise((res) => { - image.onload = () => { - const dataUrl = this.resize(image); - res(dataUrl); - }; - }).then((dataurl) => { - // Add the newly created image as a texture - // this.textures.addBase64(`resized_${voice.id}`, dataurl); - this.load.image(`resized_${voice.id}`, dataurl as string); - }); + // const image = new Image(); + // image.src = voice.avatar; + // image.crossOrigin = "anonymous"; + // new Promise((res) => { + // image.onload = () => { + // const dataUrl = this.resize(image); + // res(dataUrl); + // }; + // }).then((dataurl) => { + // // Add the newly created image as a texture + // // this.textures.addBase64(`resized_${voice.id}`, dataurl); + // this.load.image(`resized_${voice.id}`, dataurl as string); + // }); + this.load.image(`resized_${voice.id}`, voice.avatar); }); } // this.load.json( // "screen_sprite_data", // "assets/sprite/screen_sprite.json" // ); + // ["01", "16", "03", "07", "06"] this.params.selectedTracks.map((trackNo) => { switch (trackNo) { case "01": From 6da6c837a203d53cf472f17363634ea5f3951fa5 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Wed, 25 Sep 2024 19:43:06 +0530 Subject: [PATCH 02/22] fix: scaling for mobile --- src/App.tsx | 13 +- src/game/PhaserGame.tsx | 2 +- src/game/main.ts | 1 + src/game/scenes/Game.ts | 507 +++++++++++++-------- src/services/storage/marbleRace.service.ts | 9 +- 5 files changed, 325 insertions(+), 207 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 00f6e9e..6eb9589 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -33,7 +33,6 @@ import TuneIcon from "@mui/icons-material/Tune"; import { createRandomNumber, formatSecondsTohr } from "./helpers"; import axios from "axios"; import Close from "@mui/icons-material/Close"; - export const tracks = [ "01", "02", @@ -77,7 +76,7 @@ function App() { const [downloadProgress, setDownloadProgress] = useState(0); const [startSectionIdx, setStartSectionIdx] = useState(3); const [noOfRaceTracks, setNoOfRaceTracks] = useState(6); - const [marbleSpeed, setMarbleSpeed] = useState(0.2); + const [marbleSpeed, setMarbleSpeed] = useState(0.8); const theme = useTheme(); const isMobileView = useMediaQuery(theme.breakpoints.down("md")); const canvasElemWidth = window.innerWidth > 414 ? 414 : window.innerWidth; @@ -249,7 +248,7 @@ function App() { ] ); setBgPaths(nonMotionBgPaths); - setMotionBgPaths(motionBgPaths); + // setMotionBgPaths(motionBgPaths); })(); (async () => { const _trailsPath = await listAllTrails(); @@ -539,8 +538,8 @@ function App() { setMarbleSpeed(val as number) @@ -1087,7 +1086,7 @@ function App() { }} /> ))} - {motionBgPaths.map((path) => ( + {/* {motionBgPaths.map((path) => ( - ))} + ))} */} ( }, ref ) { - const height = (width * 16) / 9; + const height = (width * 16) / 10; const game = useRef(null!); const [, setMediaRecorder] = useState(null); diff --git a/src/game/main.ts b/src/game/main.ts index cf59704..3235cbd 100644 --- a/src/game/main.ts +++ b/src/game/main.ts @@ -27,6 +27,7 @@ const config: Phaser.Types.Core.GameConfig = { // }, // mode: Phaser.Scale.FIT, // autoRound: false, + powerPreference: "high-performance", scene: [Preloader, GameScene], }; diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index cd5433d..ca3734b 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -97,10 +97,10 @@ export default class Game extends Phaser.Scene { data.selectedTracks, this.noOfRaceTracks ); - this.marbleRadius = - (data.width >= 414 ? 22 : 20) * window.devicePixelRatio; this.enableMotion = data.enableMotion; this.canvasWidth = data.width; + this.marbleRadius = + (22 / 414) * this.canvasWidth * window.devicePixelRatio; if (data.height) this.canvasHeight = data.height; this.centerX = this.cameras.main.width / 2; this.centerY = this.cameras.main.height / 2; @@ -136,17 +136,6 @@ export default class Game extends Phaser.Scene { baseSprite.setVisible(false); }; - scaleBaseSprite = ( - baseSprite: Phaser.Physics.Matter.Sprite | Phaser.Physics.Matter.Image, - barsWidth: number = 0 - ) => { - baseSprite.setScale( - ((this.canvasWidth + barsWidth) / baseSprite.width) * - window.devicePixelRatio, - window.devicePixelRatio - ); - }; - handleDamage(target: Phaser.Physics.Matter.Sprite, e: any) { // Logic for handling damage console.log("Damage dealt to the target!"); @@ -197,82 +186,107 @@ export default class Game extends Phaser.Scene { ) => { // TODO: Scale the sprite startOffset += 151; - this.crossRightRotation.push( - this.matter.add.sprite(18, startOffset, "02_cross", undefined, { + const l1CrossLeft = this.matter.add.sprite( + 18 * window.devicePixelRatio, + startOffset, + "02_cross", + undefined, + { shape: miniShapes["02"], isStatic: true, - }) + } ); - this.crossLeftRotation.push( - this.matter.add.sprite( - canvasWidth - 18, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ) + l1CrossLeft.setScale(window.devicePixelRatio); + this.crossRightRotation.push(l1CrossLeft); + const l1CrossRight = this.matter.add.sprite( + canvasWidth - 18 * window.devicePixelRatio, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } ); - startOffset += 151 + 40; - this.crossLeftRotation.push( - this.matter.add.sprite(126, startOffset, "02_cross", undefined, { + l1CrossRight.setScale(window.devicePixelRatio); + this.crossLeftRotation.push(l1CrossRight); + startOffset += 200 * window.devicePixelRatio; + const l2CrossLeft = this.matter.add.sprite( + 126 * window.devicePixelRatio, + startOffset, + "02_cross", + undefined, + { shape: miniShapes["02"], isStatic: true, - }) + } ); - this.crossRightRotation.push( - this.matter.add.sprite( - canvasWidth - 126, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ) + l2CrossLeft.setScale(window.devicePixelRatio); + this.crossLeftRotation.push(l2CrossLeft); + const l2CrossRight = this.matter.add.sprite( + canvasWidth - 126 * window.devicePixelRatio, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } ); - startOffset += 151 + 40; - this.crossRightRotation.push( - this.matter.add.sprite(18, startOffset, "02_cross", undefined, { + l2CrossRight.setScale(window.devicePixelRatio); + this.crossRightRotation.push(l2CrossRight); + startOffset += 200 * window.devicePixelRatio; + const l3CrossLeft = this.matter.add.sprite( + 18 * window.devicePixelRatio, + startOffset, + "02_cross", + undefined, + { shape: miniShapes["02"], isStatic: true, - }) + } ); - this.crossLeftRotation.push( - this.matter.add.sprite( - canvasWidth - 18, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ) + l3CrossLeft.setScale(window.devicePixelRatio); + this.crossRightRotation.push(l3CrossLeft); + const l3CrossRight = this.matter.add.sprite( + canvasWidth - 18 * window.devicePixelRatio, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } ); - startOffset += 151 + 40; - this.crossLeftRotation.push( - this.matter.add.sprite(126, startOffset, "02_cross", undefined, { + l3CrossRight.setScale(window.devicePixelRatio); + this.crossLeftRotation.push(l3CrossRight); + startOffset += 200 * window.devicePixelRatio; + const l4CrossLeft = this.matter.add.sprite( + 126 * window.devicePixelRatio, + startOffset, + "02_cross", + undefined, + { shape: miniShapes["02"], isStatic: true, - }) + } ); - this.crossRightRotation.push( - this.matter.add.sprite( - canvasWidth - 126, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ) + l4CrossLeft.setScale(window.devicePixelRatio); + this.crossLeftRotation.push(l4CrossLeft); + const l4CrossRight = this.matter.add.sprite( + canvasWidth - 126 * window.devicePixelRatio, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } ); - return startOffset + 250; + l4CrossRight.setScale(window.devicePixelRatio); + this.crossRightRotation.push(l4CrossRight); + + return startOffset + 500 * window.devicePixelRatio; }; createSeesawScreen = ( xOffset: number, @@ -282,21 +296,23 @@ export default class Game extends Phaser.Scene { obstaclesShapes: any ) => { // const scaleFactor = this.cameras.main.width / 414; - const yOffset = startOffset + 835 / 2; - const baseSprite = this.matter.add.sprite( - xOffset, - yOffset, - "prod_texture_loaded_06", - undefined, - { + + const baseSprite = this.matter.add + .sprite(xOffset, startOffset, "prod_texture_loaded_06", undefined, { shape: prodShapes["06"], isStatic: true, - } - ); - // .setScale(scaleFactor); - this.scaleBaseSprite(baseSprite, this.canvasWidth === 414 ? 100 : 90); + }) + .setScale( + window.devicePixelRatio * (this.canvasWidth / (512 - 100)) + ); + const yOffset = startOffset + baseSprite.height / 2; + baseSprite.setPosition(xOffset, yOffset); const seesawX = xOffset - 2; - const seesawY = yOffset - 130; + // 132 for 414 width + // 110 for 344 width + // FOrumula (132/414)*width + 30 + const seesawContraintY = -(132 / 414) * this.canvasWidth; + const seesawY = yOffset + seesawContraintY; const seesaw = this.matter.add .sprite(seesawX, seesawY, "06b", undefined, { shape: miniShapes["06b"], @@ -307,7 +323,10 @@ export default class Game extends Phaser.Scene { bodyA: seesaw.body as BodyType, bodyB: baseSprite.body as BodyType, pointA: { x: 0, y: 0 }, - pointB: { x: -2, y: -130 * window.devicePixelRatio }, + pointB: { + x: -2, + y: seesawContraintY * window.devicePixelRatio, + }, stiffness: 1, length: 0, }); @@ -357,9 +376,11 @@ export default class Game extends Phaser.Scene { shape: prodShapes["21"], isStatic: true, }) - .setScale(this.cameras.main.width / 414); + .setScale( + window.devicePixelRatio * (this.canvasWidth / (512 - 100)) + ); this.createTextureMask(xOffset, yOffset, baseSprite); - return startOffset + 880; + return startOffset + baseSprite.height * window.devicePixelRatio; }; createStarRotations = (_startOffset: number, miniShapes: any) => { // TODO: Scale the sprite @@ -384,101 +405,179 @@ export default class Game extends Phaser.Scene { // First Row this.leftRotatableStars.push( this.matter.add - .sprite(115 + barWidth, startOffset, "mini_star", undefined, { - shape: miniShapes["14"], - isStatic: true, - }) + .sprite( + ((115 / 414) * this.canvasWidth + barWidth) * + window.devicePixelRatio, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale( + (1 / 414) * this.canvasWidth * window.devicePixelRatio + ) .setAngle(35) ); this.rightRotatableStars.push( - this.matter.add.sprite( - 305 + barWidth, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) + this.matter.add + .sprite( + ((305 / 414) * this.canvasWidth + barWidth) * + window.devicePixelRatio, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale( + (1 / 414) * this.canvasWidth * window.devicePixelRatio + ) ); // Second Row - startOffset += 165; + startOffset += 165 * window.devicePixelRatio; this.rightRotatableStars.push( this.matter.add - .sprite(10 + barWidth, startOffset, "mini_star", undefined, { - shape: miniShapes["14"], - isStatic: true, - }) + .sprite( + ((10 / 414) * this.canvasWidth + barWidth) * + window.devicePixelRatio, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale( + (1 / 414) * this.canvasWidth * window.devicePixelRatio + ) .setAngle(5) ); this.rightRotatableStars.push( - this.matter.add.sprite( - 206 + barWidth, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) + this.matter.add + .sprite( + ((206 / 414) * this.canvasWidth + barWidth) * + window.devicePixelRatio, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale( + (1 / 414) * this.canvasWidth * window.devicePixelRatio + ) // .setAngle() ); this.leftRotatableStars.push( this.matter.add - .sprite(400 + barWidth, startOffset, "mini_star", undefined, { - shape: miniShapes["14"], - isStatic: true, - }) + .sprite( + ((400 / 414) * this.canvasWidth + barWidth) * + window.devicePixelRatio, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(window.devicePixelRatio) .setAngle(35) ); // Third Row - startOffset += 180; + startOffset += 180 * window.devicePixelRatio; this.leftRotatableStars.push( this.matter.add - .sprite(115 + barWidth, startOffset, "mini_star", undefined, { - shape: miniShapes["14"], - isStatic: true, - }) + .sprite( + ((115 / 414) * this.canvasWidth + barWidth) * + window.devicePixelRatio, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(window.devicePixelRatio) .setAngle(30) ); this.rightRotatableStars.push( this.matter.add - .sprite(305 + barWidth, startOffset, "mini_star", undefined, { - shape: miniShapes["14"], - isStatic: true, - }) + .sprite( + ((305 / 414) * this.canvasWidth + barWidth) * + window.devicePixelRatio, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(window.devicePixelRatio) .setAngle(5) ); // Fourth Row - startOffset += 160; + startOffset += 160 * window.devicePixelRatio; this.rightRotatableStars.push( this.matter.add - .sprite(10 + barWidth, startOffset, "mini_star", undefined, { - shape: miniShapes["14"], - isStatic: true, - }) + .sprite( + ((10 / 414) * this.canvasWidth + barWidth) * + window.devicePixelRatio, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(window.devicePixelRatio) .setAngle(8) ); this.leftRotatableStars.push( this.matter.add - .sprite(210 + barWidth, startOffset, "mini_star", undefined, { - shape: miniShapes["14"], - isStatic: true, - }) + .sprite( + ((210 / 414) * this.canvasWidth + barWidth) * + window.devicePixelRatio, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(window.devicePixelRatio) .setAngle(30) ); this.leftRotatableStars.push( this.matter.add - .sprite(400 + barWidth, startOffset, "mini_star", undefined, { - shape: miniShapes["14"], - isStatic: true, - }) + .sprite( + ((400 / 414) * this.canvasWidth + barWidth) * + window.devicePixelRatio, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(window.devicePixelRatio) .setAngle(35) ); - return startOffset + 149; + return startOffset + 500 * window.devicePixelRatio; }; createStaticTriangles = ( @@ -488,17 +587,14 @@ export default class Game extends Phaser.Scene { obstaclesShapes: any ) => { const yOffset = startOffset + 833 / 2; - const baseSprite = this.matter.add.sprite( - xOffset, - yOffset, - "prod_texture_loaded_03", - undefined, - { + const baseSprite = this.matter.add + .sprite(xOffset, yOffset, "prod_texture_loaded_03", undefined, { shape: prodShapes["03"], isStatic: true, - } - ); - this.scaleBaseSprite(baseSprite, this.canvasWidth === 414 ? 100 : 90); // TODO: Fix this + }) + .setScale( + window.devicePixelRatio * (this.canvasWidth / (512 - 100)) + ); // baseSprite.setScale( // (this.cameras.main.width / baseSprite.width) * // window.devicePixelRatio @@ -544,17 +640,20 @@ export default class Game extends Phaser.Scene { ) => { this.reduceSizeScreenOffset.push(startOffset - 400); const yOffset = startOffset + 833 / 2; - const baseSprite = this.matter.add.sprite( - xOffset + 3.5, - yOffset, - "prod_texture_loaded_16", - undefined, - { - shape: prodShapes["16"], - isStatic: true, - } - ); - this.scaleBaseSprite(baseSprite, this.canvasWidth === 414 ? 100 : 120); + const baseSprite = this.matter.add + .sprite( + xOffset + 3.5, + yOffset, + "prod_texture_loaded_16", + undefined, + { + shape: prodShapes["16"], + isStatic: true, + } + ) + .setScale( + window.devicePixelRatio * (this.canvasWidth / (512 - 100)) + ); // .setScale(this.cameras.main.width / 414); this.createTextureMask(xOffset, yOffset, baseSprite); startOffset += baseSprite.height * window.devicePixelRatio; @@ -674,22 +773,16 @@ export default class Game extends Phaser.Scene { prodShapes: any, obstaclesShapes: any ) => { - const yOffset = startOffset + 833 / 2; - const baseSprite = this.matter.add.sprite( - xOffset, - yOffset, - "prod_texture_loaded_01", - undefined, - { + const baseSprite = this.matter.add + .sprite(xOffset, startOffset, "prod_texture_loaded_01", undefined, { shape: prodShapes["01"], isStatic: true, - } - ); - this.scaleBaseSprite(baseSprite, 100); - // baseSprite.setScale( - // ((414 + 100) / baseSprite.width) * window.devicePixelRatio, - // window.devicePixelRatio - // ); + }) + .setScale( + window.devicePixelRatio * (this.canvasWidth / (512 - 100)) + ); + const yOffset = startOffset + baseSprite.height / 2; + baseSprite.setPosition(baseSprite.x, yOffset); this.createTextureMask(xOffset, yOffset, baseSprite); const randomObstaclePosition = _.sample([ [150, startOffset], @@ -732,10 +825,9 @@ export default class Game extends Phaser.Scene { prodShapes: any, obstaclesShapes: any ) => { - const yOffset = startOffset + 833 / 2; const baseSprite = this.matter.add.sprite( xOffset, - yOffset, + startOffset, "prod_texture_loaded_07", undefined, { @@ -743,8 +835,18 @@ export default class Game extends Phaser.Scene { isStatic: true, } ); - this.scaleBaseSprite(baseSprite, this.canvasWidth === 414 ? 100 : 90); // TODO: Fix this - this.createTextureMask(xOffset, yOffset, baseSprite); + baseSprite.setPosition( + baseSprite.x, + startOffset + baseSprite.height / 2 + ); + baseSprite.setScale( + window.devicePixelRatio * (this.canvasWidth / (512 - 100)) + ); + this.createTextureMask( + xOffset, + startOffset + baseSprite.height / 2, + baseSprite + ); const randomObstaclePosition = _.sample([ [150, startOffset], [350, startOffset], @@ -791,6 +893,9 @@ export default class Game extends Phaser.Scene { friction: 1, } ); + // For Testing + // this.largeCircle.setScale(0.1); + // this.isRotating = false; this.largeCircle.setScale( (this.canvasWidth / this.largeCircle.width) * window.devicePixelRatio @@ -882,7 +987,7 @@ export default class Game extends Phaser.Scene { _startOffset: number, miniShapes: any ) => { - this.reduceSizeScreenOffset.push(_startOffset); + this.reduceSizeScreenOffset.push(_startOffset - 300); let startOffset = _startOffset + 200; let leftOffset = 20; let rightOffset = canvasWidth - 20; @@ -893,11 +998,14 @@ export default class Game extends Phaser.Scene { shape: miniShapes["02"], isStatic: true, }) - .setScale(0.8, 0.8) + .setScale( + (0.8 / 414) * this.canvasWidth * window.devicePixelRatio + ) ); - leftOffset += 80; + leftOffset += + (80 / 414) * this.canvasWidth * window.devicePixelRatio; }); - startOffset += 250; + startOffset += (250 / 414) * this.canvasWidth * window.devicePixelRatio; new Array(5).fill("").map(() => { this.horizontalCrossLeftRotation.push( this.matter.add @@ -905,12 +1013,15 @@ export default class Game extends Phaser.Scene { shape: miniShapes["02"], isStatic: true, }) - .setScale(0.8, 0.8) + .setScale( + (0.8 / 414) * this.canvasWidth * window.devicePixelRatio + ) ); - rightOffset -= 80; + rightOffset -= + (80 / 414) * this.canvasWidth * window.devicePixelRatio; }); leftOffset = 20; - startOffset += 250; + startOffset += (250 / 414) * this.canvasWidth * window.devicePixelRatio; new Array(5).fill("").map(() => { this.horizontalCrossRightRotation.push( this.matter.add @@ -918,12 +1029,15 @@ export default class Game extends Phaser.Scene { shape: miniShapes["02"], isStatic: true, }) - .setScale(0.8, 0.8) + .setScale( + (0.8 / 414) * this.canvasWidth * window.devicePixelRatio + ) ); - leftOffset += 80; + leftOffset += + (80 / 414) * this.canvasWidth * window.devicePixelRatio; }); rightOffset = canvasWidth - 20; - startOffset += 250; + startOffset += (250 / 414) * this.canvasWidth * window.devicePixelRatio; new Array(5).fill("").map(() => { this.horizontalCrossLeftRotation.push( this.matter.add @@ -931,12 +1045,15 @@ export default class Game extends Phaser.Scene { shape: miniShapes["02"], isStatic: true, }) - .setScale(0.8, 0.8) + .setScale( + (0.8 / 414) * this.canvasWidth * window.devicePixelRatio + ) ); - rightOffset -= 80; + rightOffset -= + (80 / 414) * this.canvasWidth * window.devicePixelRatio; }); this.increaseSizeScreenOffset.push(startOffset); - return startOffset + 230; + return startOffset + 500 * window.devicePixelRatio; }; // createTrails = (voiceSprite: MatterJS.BodyType, i: number) => { // const velocity = Math.sqrt( diff --git a/src/services/storage/marbleRace.service.ts b/src/services/storage/marbleRace.service.ts index 915ad30..d22b219 100644 --- a/src/services/storage/marbleRace.service.ts +++ b/src/services/storage/marbleRace.service.ts @@ -1,9 +1,9 @@ -import { listAll, ref } from "firebase/storage"; +import { list, ref } from "firebase/storage"; import { storage } from "../firebase.service"; export const listAllTrackSkins = async (): Promise => { const folderRef = ref(storage, "marble_race/track_skins"); - const listResult = await listAll(folderRef); + const listResult = await list(folderRef, { maxResults: 5 }); return listResult.items.map( (item) => `https://voxaudio.nusic.fm/${encodeURIComponent( @@ -13,7 +13,7 @@ export const listAllTrackSkins = async (): Promise => { }; export const listAllTrackBackgrounds = async (): Promise => { const folderRef = ref(storage, "marble_race/backgrounds"); - const listResult = await listAll(folderRef); + const listResult = await list(folderRef, { maxResults: 5 }); const motionBgs = listResult.items.filter((item) => item.name.startsWith("motion") ); @@ -39,7 +39,7 @@ export const listAllTrackBackgrounds = async (): Promise => { export const listAllTrails = async (): Promise => { const folderRef = ref(storage, "marble_race/trails"); - const listResult = await listAll(folderRef); + const listResult = await list(folderRef, { maxResults: 5 }); return listResult.items.map( (item) => `https://voxaudio.nusic.fm/${encodeURIComponent( @@ -47,3 +47,4 @@ export const listAllTrails = async (): Promise => { )}?alt=media` ); }; + From b12a5272effbd7fbca1e9009ee3b18250b169a77 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Thu, 26 Sep 2024 00:05:01 +0530 Subject: [PATCH 03/22] fix: remove tracks, add obstacles, sound --- public/assets/sounds/high_whack.wav | Bin 0 -> 211256 bytes public/assets/sounds/low_whack.wav | Bin 0 -> 388584 bytes public/assets/sprite/weapons/whack.png | Bin 0 -> 315586 bytes src/App.tsx | 18 +- src/game/scenes/Game.ts | 233 +++++++++++++++---------- src/game/scenes/Preloader.ts | 3 + 6 files changed, 155 insertions(+), 99 deletions(-) create mode 100644 public/assets/sounds/high_whack.wav create mode 100644 public/assets/sounds/low_whack.wav create mode 100644 public/assets/sprite/weapons/whack.png diff --git a/public/assets/sounds/high_whack.wav b/public/assets/sounds/high_whack.wav new file mode 100644 index 0000000000000000000000000000000000000000..3a4cd8cdf1dd3cbe116a354a59997fbbb15823b6 GIT binary patch literal 211256 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

    3-5Maleln>Npz-F*e4 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 R5k?td>^Lp*%Nf`k@&A=jufqTU literal 0 HcmV?d00001 diff --git a/public/assets/sounds/low_whack.wav b/public/assets/sounds/low_whack.wav new file mode 100644 index 0000000000000000000000000000000000000000..5c113baecd0c9370576e1235271f8852597ae28a GIT binary patch literal 388584 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 zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo|D6Pc|51Pf6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt v00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiK;UlsTtXqp(> literal 0 HcmV?d00001 diff --git a/public/assets/sprite/weapons/whack.png b/public/assets/sprite/weapons/whack.png new file mode 100644 index 0000000000000000000000000000000000000000..6cd6770178a447fb8802355f146771ca794069ab GIT binary patch literal 315586 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
    xb};go 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%0Al=hG~Q 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 z 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 + tracks.includes(t as string) + ) as string[]; } return tracks?.slice(0, 10); } @@ -964,8 +966,8 @@ function App() { setMarbleSpeed(val as number) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index ca3734b..695bde7 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -61,8 +61,8 @@ export default class Game extends Phaser.Scene { largeCircle: Phaser.Physics.Matter.Image | undefined; isRotating = true; baseAngle = 0; - centerX = 256 - 94 / 2; - centerY = 256; + centerX = 0; + centerY = 0; radius = 100; angleIncrement = (2 * Math.PI) / 5; countdownText: Phaser.GameObjects.Text | undefined; @@ -165,6 +165,10 @@ export default class Game extends Phaser.Scene { [], this ); + // Play sound + if (this.damageMultipliyer === 1) + this.sound.play("low_whack", { volume: 0.5 }); + else this.sound.play("high_whack", { volume: 0.5 }); } if (target.scale <= 0.08) { target.destroy(); @@ -355,7 +359,9 @@ export default class Game extends Phaser.Scene { frictionStatic: 0, } ) - .setScale(0.17); + .setScale( + (0.17 / 414) * this.canvasWidth * window.devicePixelRatio + ); target.setInteractive(); target.on("pointerdown", (e: any) => { this.handleDamage(target, e); @@ -625,7 +631,9 @@ export default class Game extends Phaser.Scene { frictionStatic: 0, } ); - target.setScale(this.marbleRadius / target.width); + target.setScale( + (0.17 / 414) * this.canvasWidth * window.devicePixelRatio + ); target.setInteractive(); target.on("pointerdown", (e: any) => { this.handleDamage(target, e); @@ -811,7 +819,9 @@ export default class Game extends Phaser.Scene { // ignoreGravity: true, } ); - target.setScale(this.marbleRadius / target.width); + target.setScale( + (0.17 / 414) * this.canvasWidth * window.devicePixelRatio + ); target.setInteractive(); target.on("pointerdown", (e: any) => { this.handleDamage(target, e); @@ -848,7 +858,7 @@ export default class Game extends Phaser.Scene { baseSprite ); const randomObstaclePosition = _.sample([ - [150, startOffset], + [140, startOffset], [350, startOffset], [150, startOffset + 200], [350, startOffset + 200], @@ -872,7 +882,9 @@ export default class Game extends Phaser.Scene { frictionStatic: 0, } ) - .setScale(0.17); + .setScale( + (0.17 / 414) * this.canvasWidth * window.devicePixelRatio + ); target.setInteractive(); target.on("pointerdown", (e: any) => { this.handleDamage(target, e); @@ -1116,8 +1128,12 @@ export default class Game extends Phaser.Scene { renderWeapons() { this.level1Hammer = this.add - .sprite(350, 550, "hammer_1") - .setScale(0.1) + .sprite( + 350 * window.devicePixelRatio, + 550 * window.devicePixelRatio, + "hammer_1" + ) + .setScale((0.1 / 414) * this.canvasWidth * window.devicePixelRatio) .setScrollFactor(0) .setInteractive() .on("pointerdown", () => { @@ -1125,8 +1141,12 @@ export default class Game extends Phaser.Scene { }); this.level2Hammer = this.add - .sprite(350, 630, "hammer_2") - .setScale(0.1) + .sprite( + 350 * window.devicePixelRatio, + 610 * window.devicePixelRatio, + "hammer_2" + ) + .setScale((0.1 / 414) * this.canvasWidth * window.devicePixelRatio) .setScrollFactor(0) .setInteractive() .on("pointerdown", () => { @@ -1140,6 +1160,8 @@ export default class Game extends Phaser.Scene { create() { console.log("Game Scene..."); + this.sound.add("low_whack", { loop: false, volume: 0.5 }); + this.sound.add("high_whack", { loop: false, volume: 0.5 }); // Center the background image const centerX = this.cameras.main.width / 2; if (!this.enableMotion) { @@ -1176,14 +1198,22 @@ export default class Game extends Phaser.Scene { .setScrollFactor(0); } const siteUrl = this.add - .text(this.centerX, this.centerY + 100, "marblerace.ai", { + .text(this.centerX, this.centerY, "marblerace.ai", { fontSize: "28px", color: "#ffffff", stroke: "rgba(0,0,0,1)", strokeThickness: 4, }) .setScrollFactor(0); - siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, this.centerY + 50); + // Below line placed at the right position when setScale is not used + siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, this.centerY + 100); + + siteUrl.setScale(window.devicePixelRatio); + // Fix the position of the siteUrl when setScale is used + siteUrl.setPosition( + siteUrl.x - siteUrl.width / 2, + siteUrl.y - siteUrl.height / 2 + ); // Enable camera scrolling const canvasWidth = this.cameras.main.width; @@ -1347,18 +1377,18 @@ export default class Game extends Phaser.Scene { this.musicStartOffset ).then(() => (this.isInstrumentPlaying = true)); - // this.renderWeapons(); + this.renderWeapons(); } - update(time: number, delta: number): void { - // if (this.damageMultipliyer === 1) { - // // Highlight level 1 hammer - // this.level2Hammer?.setScale(0.1); - // this.level1Hammer?.setScale(0.2); - // } else if (this.damageMultipliyer === 1.5) { - // // Highlight level 2 hammer - // this.level1Hammer?.setScale(0.1); - // this.level2Hammer?.setScale(0.2); - // } + update(): void { + if (this.damageMultipliyer === 1) { + // Highlight level 1 hammer + this.level2Hammer?.setScale(0.1); + this.level1Hammer?.setScale(0.2); + } else if (this.damageMultipliyer === 1.5) { + // Highlight level 2 hammer + this.level1Hammer?.setScale(0.1); + this.level2Hammer?.setScale(0.2); + } // if (this.enableMotion && !this.isRotating) // this.background.tilePositionX += 0.08; if (this.marbles.length) { @@ -1450,32 +1480,33 @@ export default class Game extends Phaser.Scene { // this.createTrails(voiceBody, i); }); } - this.crossRightRotation.map((c) => { - c.setAngle(c.angle + 2); - this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); - }); - this.crossLeftRotation.map((c) => { - c.setAngle(c.angle - 2); - this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); - }); + // TODO: Uncomment this + // this.crossRightRotation.map((c) => { + // c.setAngle(c.angle + 2); + // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); + // }); + // this.crossLeftRotation.map((c) => { + // c.setAngle(c.angle - 2); + // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); + // }); if (this.isInstrumentPlaying && this.isRotating === false) { - const voicesPositions = this.marbles.map((m) => m.position.y); - const unFinishedPositions = voicesPositions.filter( - (y) => y < this.finishLineOffset - ); - const largest = Math.max(...unFinishedPositions); - const secondLargest = Math.max( - ...unFinishedPositions.filter((p) => p !== largest) - ); - const index = voicesPositions.findIndex((v) => v === largest); - // if (largest > this.finishLineOffset) { - // // Find 2nd largest - // index = voicesPositions.indexOf( - // voicesPositions - // .filter((v) => v !== largest) - // .reduce((a, b) => (a > b ? a : b)) - // ); - // } + let largest = -Infinity; + let secondLargest = -Infinity; + let index = -1; + + for (let i = 0; i < this.marbles.length; i++) { + const y = this.marbles[i].position.y; + if (y < this.finishLineOffset) { + if (y > largest) { + secondLargest = largest; + largest = y; + index = i; + } else if (y > secondLargest) { + secondLargest = y; + } + } + } + if (index === -1) return; if ( this.prevVoiceIdx !== index && @@ -1486,49 +1517,69 @@ export default class Game extends Phaser.Scene { this.cameras.main.scrollY = largest - 300; } } - this.leftRotatableStars.map((rs) => rs.setAngle(rs.angle - 0.4)); - this.rightRotatableStars.map((rs) => rs.setAngle(rs.angle + 0.4)); - this.horizontalCrossRightRotation.map((rs) => - rs.setAngle(rs.angle + 2.5) - ); - this.horizontalCrossLeftRotation.map((rs) => - rs.setAngle(rs.angle - 2.5) - ); + + // Optimised Code + // let largest = -Infinity; + // let secondLargest = -Infinity; + // let index = -1; + + // for (let i = 0; i < this.marbles.length; i++) { + // const y = this.marbles[i].position.y; + // if (y < this.finishLineOffset) { + // if (y > largest) { + // secondLargest = largest; + // largest = y; + // index = i; + // } else if (y > secondLargest) { + // secondLargest = y; + // } + // } + // } + // TODO: Uncomment this + // this.leftRotatableStars.map((rs) => rs.setAngle(rs.angle - 0.4)); + // this.rightRotatableStars.map((rs) => rs.setAngle(rs.angle + 0.4)); + // this.horizontalCrossRightRotation.map((rs) => + // rs.setAngle(rs.angle + 2.5) + // ); + // this.horizontalCrossLeftRotation.map((rs) => + // rs.setAngle(rs.angle - 2.5) + // ); + // Bars up/down motion - this.motionTimeForUpDownWard += delta; - this.upDownMotionElems.map( - ({ - matter, - startX, - startY, - moveSpeed, - maxBottom, - maxTop, - direction, - }) => { - const amplitude = (maxBottom - maxTop) / 2; - const offset = amplitude * Math.sin(time * (moveSpeed * 0.01)); - // // Calculate new y position using a sine wave for smooth up and down movement - // const range = maxBottom - maxTop; - // const midPoint = maxTop + range / 2; - // Calculate the new position considering the angle - if (direction === "right") { - const newX = - startX + offset * Math.sin(Phaser.Math.DegToRad(7.1)); - const newY = - startY - offset * Math.cos(Phaser.Math.DegToRad(7.1)); - // Update the rectangle's y position using a sine wave - matter.setPosition(newX, newY); - } else { - const newX = - startX + offset * Math.sin(Phaser.Math.DegToRad(-7.1)); - const newY = - startY - offset * Math.cos(Phaser.Math.DegToRad(-7.1)); - // Update the rectangle's y position using a sine wave - matter.setPosition(newX, newY); - } - } - ); + // this.motionTimeForUpDownWard += delta; + // this.upDownMotionElems.map( + // ({ + // matter, + // startX, + // startY, + // moveSpeed, + // maxBottom, + // maxTop, + // direction, + // }) => { + // const amplitude = (maxBottom - maxTop) / 2; + // const offset = amplitude * Math.sin(time * (moveSpeed * 0.01)); + // // // Calculate new y position using a sine wave for smooth up and down movement + // // const range = maxBottom - maxTop; + // // const midPoint = maxTop + range / 2; + // // Calculate the new position considering the angle + // if (direction === "right") { + // const newX = + // startX + offset * Math.sin(Phaser.Math.DegToRad(7.1)); + // const newY = + // startY - offset * Math.cos(Phaser.Math.DegToRad(7.1)); + // // Update the rectangle's y position using a sine wave + // matter.setPosition(newX, newY); + // } else { + // const newX = + // startX + offset * Math.sin(Phaser.Math.DegToRad(-7.1)); + // const newY = + // startY - offset * Math.cos(Phaser.Math.DegToRad(-7.1)); + // // Update the rectangle's y position using a sine wave + // matter.setPosition(newX, newY); + // } + // } + // ); } } diff --git a/src/game/scenes/Preloader.ts b/src/game/scenes/Preloader.ts index eb051da..a6f3b7b 100644 --- a/src/game/scenes/Preloader.ts +++ b/src/game/scenes/Preloader.ts @@ -87,6 +87,9 @@ export default class Preloader extends Phaser.Scene { }); this.load.image("hammer_1", "assets/sprite/weapons/hammer_level_1.png"); this.load.image("hammer_2", "assets/sprite/weapons/hammer_level_2.png"); + this.load.image("whack", "/assets/sprite/weapons/whack.png"); + this.load.audio("low_whack", "/assets/sounds/low_whack.wav"); + this.load.audio("high_whack", "/assets/sounds/high_whack.wav"); if (this.params.enableMotion) this.load.image("center_logo", "assets/transparent_logo.png"); // TODO: Enable the below and comment out the rest of the images From 2af034aef295142f126fb0ac7b161610997fbca7 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Thu, 26 Sep 2024 00:21:21 +0530 Subject: [PATCH 04/22] fix: optimise, weapons --- src/App.tsx | 4 +- src/game/scenes/Game.ts | 305 ++++++++++++++++++++-------------------- 2 files changed, 157 insertions(+), 152 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 1e5554b..a3bdbff 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -539,7 +539,7 @@ function App() { Speed Speed { @@ -1367,6 +1367,7 @@ export default class Game extends Phaser.Scene { } this.isRotating = false; this.countdownText.destroy(); + clock.destroy(); } } }, @@ -1382,12 +1383,20 @@ export default class Game extends Phaser.Scene { update(): void { if (this.damageMultipliyer === 1) { // Highlight level 1 hammer - this.level2Hammer?.setScale(0.1); - this.level1Hammer?.setScale(0.2); + this.level2Hammer?.setScale( + (0.1 / 414) * this.canvasWidth * window.devicePixelRatio + ); + this.level1Hammer?.setScale( + (0.2 / 414) * this.canvasWidth * window.devicePixelRatio + ); } else if (this.damageMultipliyer === 1.5) { // Highlight level 2 hammer - this.level1Hammer?.setScale(0.1); - this.level2Hammer?.setScale(0.2); + this.level1Hammer?.setScale( + (0.1 / 414) * this.canvasWidth * window.devicePixelRatio + ); + this.level2Hammer?.setScale( + (0.2 / 414) * this.canvasWidth * window.devicePixelRatio + ); } // if (this.enableMotion && !this.isRotating) // this.background.tilePositionX += 0.08; @@ -1401,27 +1410,16 @@ export default class Game extends Phaser.Scene { 0.15 ); } - this.marbles.map((voiceBody, i) => { + // Optimize marble updates + for (let i = 0; i < this.marbles.length; i++) { + const voiceBody = this.marbles[i]; const marbleImage = this.marblesImages[i]; - // if (this.isRotating) { - // // // Update the position of each circle - // // const currentAngle = - // // this.baseAngle + i * this.angleIncrement; - // // const x = - // // this.centerX + this.radius * Math.cos(currentAngle); - // // const y = - // // this.centerY + this.radius * Math.sin(currentAngle); - // // // Set the new position of the circle - // // this.matter.body.setPosition(voiceBody, { x, y }, false); - // // // this.matter.body.setAngle(voiceBody, currentAngle, false); - // // marbleImage.setPosition(x, y); - // // // marbleImage.setRotation(voiceBody.angle); - // // this.marblesMasks[i].setPosition( - // // voiceBody.position.x - voiceBody.circleRadius, - // // voiceBody.position.y - voiceBody.circleRadius - // // ); - // // this.labels[i].setPosition(-100, -100); - // } else { + const marbleMask = this.marblesMasks[i]; + const label = this.labels[i]; + const currentCrossIndex = + this.currentMarblesSizeIndices[i.toString()]; + + // Update marble image position and rotation if (marbleImage) { marbleImage.setPosition( voiceBody.position.x, @@ -1429,157 +1427,164 @@ export default class Game extends Phaser.Scene { ); marbleImage.setRotation(voiceBody.angle); } - if (this.marblesMasks[i]) - this.marblesMasks[i].setPosition( + + // Update marble mask position + if (marbleMask) { + marbleMask.setPosition( voiceBody.position.x - voiceBody.circleRadius, voiceBody.position.y - voiceBody.circleRadius ); - // this.marblesMasks[i].setRotation(voiceBody.angle); - this.labels[i]?.setPosition( - voiceBody.position.x - this.labels[i].width / 2, - voiceBody.position.y - 60 - ); - const currentCrossIndex = - this.currentMarblesSizeIndices[i.toString()]; + } + + // Update label position + if (label) { + label.setPosition( + voiceBody.position.x - label.width / 2, + voiceBody.position.y - 60 + ); + } + + // Check for size changes + const isHeightReduced = this.heightReducedIndices.includes(i); + const y = voiceBody.position.y; if ( - this.heightReducedIndices.includes(i) && - voiceBody.position.y > - this.increaseSizeScreenOffset[currentCrossIndex] + isHeightReduced && + y > this.increaseSizeScreenOffset[currentCrossIndex] ) { - this.currentMarblesSizeIndices[i.toString()] += 1; + // Increase size + this.currentMarblesSizeIndices[i.toString()]++; this.matter.body.scale(voiceBody, 2, 2); - marbleImage?.setDisplaySize( - this.marbleRadius * 2, - this.marbleRadius * 2 - ); - if (this.marblesMasks[i]) this.marblesMasks[i].scale = 1; + if (marbleImage) + marbleImage.setDisplaySize( + this.marbleRadius * 2, + this.marbleRadius * 2 + ); + if (marbleMask) marbleMask.scale = 1; this.heightReducedIndices = this.heightReducedIndices.filter((idx) => idx !== i); this.marbleTrailParticles[i].setConfig(this.trailConfig); } else if ( - this.heightReducedIndices.includes(i) === false && - voiceBody.position.y > - this.reduceSizeScreenOffset[currentCrossIndex] && - voiceBody.position.y < - this.increaseSizeScreenOffset[currentCrossIndex] + !isHeightReduced && + y > this.reduceSizeScreenOffset[currentCrossIndex] && + y < this.increaseSizeScreenOffset[currentCrossIndex] ) { + // Reduce size this.heightReducedIndices.push(i); this.matter.body.scale(voiceBody, 0.5, 0.5); - marbleImage?.setDisplaySize( - this.marbleRadius, - this.marbleRadius - ); - if (this.marblesMasks[i]) this.marblesMasks[i].scale = 0.5; + if (marbleImage) + marbleImage.setDisplaySize( + this.marbleRadius, + this.marbleRadius + ); + if (marbleMask) marbleMask.scale = 0.5; this.marbleTrailParticles[i].setConfig({ ...this.trailConfig, scale: { start: 0.5, end: 0.01 }, }); } - // } - // this.createTrails(voiceBody, i); - }); - } - // TODO: Uncomment this - // this.crossRightRotation.map((c) => { - // c.setAngle(c.angle + 2); - // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); - // }); - // this.crossLeftRotation.map((c) => { - // c.setAngle(c.angle - 2); - // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); - // }); - if (this.isInstrumentPlaying && this.isRotating === false) { - let largest = -Infinity; - let secondLargest = -Infinity; - let index = -1; + } + // TODO: Uncomment this + // this.crossRightRotation.map((c) => { + // c.setAngle(c.angle + 2); + // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); + // }); + // this.crossLeftRotation.map((c) => { + // c.setAngle(c.angle - 2); + // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); + // }); + if (this.isInstrumentPlaying && this.isRotating === false) { + let largest = -Infinity; + let secondLargest = -Infinity; + let index = -1; - for (let i = 0; i < this.marbles.length; i++) { - const y = this.marbles[i].position.y; - if (y < this.finishLineOffset) { - if (y > largest) { - secondLargest = largest; - largest = y; - index = i; - } else if (y > secondLargest) { - secondLargest = y; + for (let i = 0; i < this.marbles.length; i++) { + const y = this.marbles[i].position.y; + if (y < this.finishLineOffset) { + if (y > largest) { + secondLargest = largest; + largest = y; + index = i; + } else if (y > secondLargest) { + secondLargest = y; + } } } - } - if (index === -1) return; - if ( - this.prevVoiceIdx !== index && - largest > secondLargest + this.marbleRadius - ) - this.throttledUpdate(index); - if (this.autoScroll) { - this.cameras.main.scrollY = largest - 300; + if (index === -1) return; + if ( + this.prevVoiceIdx !== index && + largest > secondLargest + this.marbleRadius + ) + this.throttledUpdate(index); + if (this.autoScroll) { + this.cameras.main.scrollY = largest - 300; + } } - } - // Optimised Code - // let largest = -Infinity; - // let secondLargest = -Infinity; - // let index = -1; + // Optimised Code + // let largest = -Infinity; + // let secondLargest = -Infinity; + // let index = -1; - // for (let i = 0; i < this.marbles.length; i++) { - // const y = this.marbles[i].position.y; - // if (y < this.finishLineOffset) { - // if (y > largest) { - // secondLargest = largest; - // largest = y; - // index = i; - // } else if (y > secondLargest) { - // secondLargest = y; - // } - // } - // } - // TODO: Uncomment this - // this.leftRotatableStars.map((rs) => rs.setAngle(rs.angle - 0.4)); - // this.rightRotatableStars.map((rs) => rs.setAngle(rs.angle + 0.4)); - // this.horizontalCrossRightRotation.map((rs) => - // rs.setAngle(rs.angle + 2.5) - // ); - // this.horizontalCrossLeftRotation.map((rs) => - // rs.setAngle(rs.angle - 2.5) - // ); + // for (let i = 0; i < this.marbles.length; i++) { + // const y = this.marbles[i].position.y; + // if (y < this.finishLineOffset) { + // if (y > largest) { + // secondLargest = largest; + // largest = y; + // index = i; + // } else if (y > secondLargest) { + // secondLargest = y; + // } + // } + // } + // TODO: Uncomment this + // this.leftRotatableStars.map((rs) => rs.setAngle(rs.angle - 0.4)); + // this.rightRotatableStars.map((rs) => rs.setAngle(rs.angle + 0.4)); + // this.horizontalCrossRightRotation.map((rs) => + // rs.setAngle(rs.angle + 2.5) + // ); + // this.horizontalCrossLeftRotation.map((rs) => + // rs.setAngle(rs.angle - 2.5) + // ); - // Bars up/down motion - // this.motionTimeForUpDownWard += delta; - // this.upDownMotionElems.map( - // ({ - // matter, - // startX, - // startY, - // moveSpeed, - // maxBottom, - // maxTop, - // direction, - // }) => { - // const amplitude = (maxBottom - maxTop) / 2; - // const offset = amplitude * Math.sin(time * (moveSpeed * 0.01)); - // // // Calculate new y position using a sine wave for smooth up and down movement - // // const range = maxBottom - maxTop; - // // const midPoint = maxTop + range / 2; - // // Calculate the new position considering the angle - // if (direction === "right") { - // const newX = - // startX + offset * Math.sin(Phaser.Math.DegToRad(7.1)); - // const newY = - // startY - offset * Math.cos(Phaser.Math.DegToRad(7.1)); - // // Update the rectangle's y position using a sine wave - // matter.setPosition(newX, newY); - // } else { - // const newX = - // startX + offset * Math.sin(Phaser.Math.DegToRad(-7.1)); - // const newY = - // startY - offset * Math.cos(Phaser.Math.DegToRad(-7.1)); - // // Update the rectangle's y position using a sine wave - // matter.setPosition(newX, newY); - // } - // } - // ); + // Bars up/down motion + // this.motionTimeForUpDownWard += delta; + // this.upDownMotionElems.map( + // ({ + // matter, + // startX, + // startY, + // moveSpeed, + // maxBottom, + // maxTop, + // direction, + // }) => { + // const amplitude = (maxBottom - maxTop) / 2; + // const offset = amplitude * Math.sin(time * (moveSpeed * 0.01)); + // // // Calculate new y position using a sine wave for smooth up and down movement + // // const range = maxBottom - maxTop; + // // const midPoint = maxTop + range / 2; + // // Calculate the new position considering the angle + // if (direction === "right") { + // const newX = + // startX + offset * Math.sin(Phaser.Math.DegToRad(7.1)); + // const newY = + // startY - offset * Math.cos(Phaser.Math.DegToRad(7.1)); + // // Update the rectangle's y position using a sine wave + // matter.setPosition(newX, newY); + // } else { + // const newX = + // startX + offset * Math.sin(Phaser.Math.DegToRad(-7.1)); + // const newY = + // startY - offset * Math.cos(Phaser.Math.DegToRad(-7.1)); + // // Update the rectangle's y position using a sine wave + // matter.setPosition(newX, newY); + // } + // } + // ); + } } } From 8b9291bf71882adc4397e6cc57359c1e41e6a68a Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Thu, 26 Sep 2024 23:32:39 +0530 Subject: [PATCH 05/22] fix: mouth --- src/components/SelectVoices.tsx | 2 +- src/game/scenes/Game.ts | 50 +++++++++++++++++++++++++++++---- src/game/scenes/Preloader.ts | 4 +++ 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/components/SelectVoices.tsx b/src/components/SelectVoices.tsx index e74b4b1..9e9e0f4 100644 --- a/src/components/SelectVoices.tsx +++ b/src/components/SelectVoices.tsx @@ -97,7 +97,7 @@ const SelectVoices = ({ selectedVoices, setSelectedVoices, voices }: Props) => { > Choose Voice - + {voices .filter( (v) => diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index e742ca2..e33e5bd 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -13,6 +13,10 @@ export default class Game extends Phaser.Scene { constructor() { super("game"); this.throttledUpdate = _.throttle(this.throttledUpdate.bind(this), 10); // Throttle interval in milliseconds + this.throttledUpdateGif = _.throttle( + this.throttledUpdateGif.bind(this), + 100 + ); // Throttle interval in milliseconds } public sky: Phaser.Physics.Matter.Image | undefined; public marbles: MatterJS.BodyType[] = []; @@ -115,6 +119,25 @@ export default class Game extends Phaser.Scene { marbleRacePlayVocals(this.coverDocId, this.voices[index].id); } + throttledUpdateGif(largestIndex: number) { + // Switch between mouth and normal image on each update to create a singing animation effect + const marbleImage = this.marblesImages[largestIndex]; + const voiceId = this.voices[largestIndex].id; + const isMouthOpen = + marbleImage.texture.key === `resized_${voiceId}_mouth`; + const newTexture = isMouthOpen + ? `resized_${voiceId}` + : `resized_${voiceId}_mouth`; + // const newSize = this.marbleRadius * 2; + + marbleImage.setTexture(newTexture); + marbleImage.setDisplaySize( + this.marbleRadius * 2, + this.marbleRadius * 2 + ); + marbleImage.setOrigin(0.5, 0.5); + } + createTextureMask = ( xOffset: number, yOffset: number, @@ -962,6 +985,7 @@ export default class Game extends Phaser.Scene { ); circleImage.setDisplaySize(marbleRadius * 2, marbleRadius * 2); circleImage.setOrigin(0.5, 0.5); + // Circle mask const maskShape = this.make.graphics(); maskShape.fillStyle(0xffffff); maskShape.fillCircle(marbleRadius, marbleRadius, marbleRadius); @@ -1496,7 +1520,7 @@ export default class Game extends Phaser.Scene { if (this.isInstrumentPlaying && this.isRotating === false) { let largest = -Infinity; let secondLargest = -Infinity; - let index = -1; + let largestIndex = -1; for (let i = 0; i < this.marbles.length; i++) { const y = this.marbles[i].position.y; @@ -1504,19 +1528,33 @@ export default class Game extends Phaser.Scene { if (y > largest) { secondLargest = largest; largest = y; - index = i; + largestIndex = i; } else if (y > secondLargest) { secondLargest = y; } } } - if (index === -1) return; + if (largestIndex === -1) return; if ( - this.prevVoiceIdx !== index && + this.prevVoiceIdx !== largestIndex && largest > secondLargest + this.marbleRadius - ) - this.throttledUpdate(index); + ) { + this.throttledUpdate(largestIndex); + // // Remove previous mouth image using this.prevVoiceIdx + // const prevMarbleImage = + // this.marblesImages[this.prevVoiceIdx]; + // const id = this.voices[this.prevVoiceIdx].id; + // if ( + // prevMarbleImage && + // prevMarbleImage.texture.key === `resized_${id}_mouth` + // ) { + // prevMarbleImage.setTexture(`resized_${id}`); + // prevMarbleImage.setDisplaySize(newSize, newSize); + // prevMarbleImage.setOrigin(0.5, 0.5); + // } + } + this.throttledUpdateGif(largestIndex); if (this.autoScroll) { this.cameras.main.scrollY = largest - 300; } diff --git a/src/game/scenes/Preloader.ts b/src/game/scenes/Preloader.ts index a6f3b7b..9999620 100644 --- a/src/game/scenes/Preloader.ts +++ b/src/game/scenes/Preloader.ts @@ -110,6 +110,10 @@ export default class Preloader extends Phaser.Scene { // this.load.image(`resized_${voice.id}`, dataurl as string); // }); this.load.image(`resized_${voice.id}`, voice.avatar); + this.load.image( + `resized_${voice.id}_mouth`, + `https://voxaudio.nusic.fm/voice_models%2Favatars%2Fthumbs%2Fgifs%2F${voice.id}_200x200.png?alt=media` + ); }); } // this.load.json( From e5a23867d0cc530ebfc57b7bcf292c63e37702de Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Sun, 29 Sep 2024 17:21:43 +0530 Subject: [PATCH 06/22] fix: remove trails, mouth for testing --- src/game/scenes/Game.ts | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index e33e5bd..455a009 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -965,13 +965,14 @@ export default class Game extends Phaser.Scene { } ); this.marbles.push(circleBody); - - this.marbleTrailParticles.push( - this.add.particles(0, 0, "trail", { - ...this.trailConfig, - follow: circleBody.position, - }) - ); + // TODO: Add Trails back + this.marbleTrailParticles + .push + // this.add.particles(0, 0, "trail", { + // ...this.trailConfig, + // follow: circleBody.position, + // }) + (); // circleBody.emitter = emitter; // this.trailsGroup.push(this.add.group()); @@ -1487,7 +1488,7 @@ export default class Game extends Phaser.Scene { if (marbleMask) marbleMask.scale = 1; this.heightReducedIndices = this.heightReducedIndices.filter((idx) => idx !== i); - this.marbleTrailParticles[i].setConfig(this.trailConfig); + // this.marbleTrailParticles[i].setConfig(this.trailConfig); } else if ( !isHeightReduced && y > this.reduceSizeScreenOffset[currentCrossIndex] && @@ -1502,10 +1503,10 @@ export default class Game extends Phaser.Scene { this.marbleRadius ); if (marbleMask) marbleMask.scale = 0.5; - this.marbleTrailParticles[i].setConfig({ - ...this.trailConfig, - scale: { start: 0.5, end: 0.01 }, - }); + // this.marbleTrailParticles[i].setConfig({ + // ...this.trailConfig, + // scale: { start: 0.5, end: 0.01 }, + // }); } } // TODO: Uncomment this @@ -1554,7 +1555,7 @@ export default class Game extends Phaser.Scene { // prevMarbleImage.setOrigin(0.5, 0.5); // } } - this.throttledUpdateGif(largestIndex); + // this.throttledUpdateGif(largestIndex); if (this.autoScroll) { this.cameras.main.scrollY = largest - 300; } From d49b8f3c3bffca7f9e88b9af4c742a3269f4acea Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Sun, 29 Sep 2024 18:29:23 +0530 Subject: [PATCH 07/22] fix: remove mask --- src/game/scenes/Game.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 455a009..8fae2d1 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -986,15 +986,19 @@ export default class Game extends Phaser.Scene { ); circleImage.setDisplaySize(marbleRadius * 2, marbleRadius * 2); circleImage.setOrigin(0.5, 0.5); - // Circle mask - const maskShape = this.make.graphics(); - maskShape.fillStyle(0xffffff); - maskShape.fillCircle(marbleRadius, marbleRadius, marbleRadius); - const mask = maskShape.createGeometryMask(); + // TODO: Add Mask back + // // Circle mask + // const maskShape = this.make.graphics({ + // x: circleBody.position.x * window.devicePixelRatio, + // y: circleBody.position.y * window.devicePixelRatio, + // }); + // maskShape.fillStyle(0xffffff); + // maskShape.fillCircle(marbleRadius, marbleRadius, marbleRadius); + // const mask = maskShape.createGeometryMask(); - // Apply the mask to the image - circleImage.setMask(mask); - this.marblesMasks.push(maskShape); + // // Apply the mask to the image + // circleImage.setMask(mask); + // this.marblesMasks.push(maskShape); this.marblesImages.push(circleImage); // Create label for each circle From 7c775b45bd0773c191797774bd3cfe5895e1e865 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Sun, 29 Sep 2024 20:17:34 +0530 Subject: [PATCH 08/22] fix: mask with depth, refactor --- src/game/scenes/Game.ts | 44 +++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 8fae2d1..6c51548 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -966,19 +966,14 @@ export default class Game extends Phaser.Scene { ); this.marbles.push(circleBody); // TODO: Add Trails back - this.marbleTrailParticles - .push - // this.add.particles(0, 0, "trail", { - // ...this.trailConfig, - // follow: circleBody.position, - // }) - (); + this.marbleTrailParticles.push( + this.add.particles(0, 0, "trail", { + ...this.trailConfig, + follow: circleBody.position, + }) + ); - // circleBody.emitter = emitter; - // this.trailsGroup.push(this.add.group()); - // this.trailGraphics.push(this.add.graphics()); - // this.trailPoints.push([]); - // // Create an image and attach it to the circle body + // Create an image and attach it to the circle body const circleImage = this.add.image( circleBody.position.x, circleBody.position.y, @@ -986,19 +981,20 @@ export default class Game extends Phaser.Scene { ); circleImage.setDisplaySize(marbleRadius * 2, marbleRadius * 2); circleImage.setOrigin(0.5, 0.5); - // TODO: Add Mask back - // // Circle mask - // const maskShape = this.make.graphics({ - // x: circleBody.position.x * window.devicePixelRatio, - // y: circleBody.position.y * window.devicePixelRatio, - // }); - // maskShape.fillStyle(0xffffff); - // maskShape.fillCircle(marbleRadius, marbleRadius, marbleRadius); - // const mask = maskShape.createGeometryMask(); - // // Apply the mask to the image - // circleImage.setMask(mask); - // this.marblesMasks.push(maskShape); + // Ensure the image is visible + circleImage.setDepth(1); + circleImage.setVisible(true); + + // Circle mask + const maskShape = this.make.graphics(); + maskShape.fillStyle(0xffffff); + maskShape.fillCircle(marbleRadius, marbleRadius, marbleRadius); + const mask = new Phaser.Display.Masks.GeometryMask(this, maskShape); + + // Apply the mask to the image + circleImage.setMask(mask); + this.marblesMasks.push(maskShape); this.marblesImages.push(circleImage); // Create label for each circle From 3fbbbfb6aa826d6b129e7933535dd52ad1c3f17a Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Mon, 30 Sep 2024 00:17:45 +0530 Subject: [PATCH 09/22] fix: add mouths --- src/game/scenes/Game.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 6c51548..062a179 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -1555,7 +1555,7 @@ export default class Game extends Phaser.Scene { // prevMarbleImage.setOrigin(0.5, 0.5); // } } - // this.throttledUpdateGif(largestIndex); + this.throttledUpdateGif(largestIndex); if (this.autoScroll) { this.cameras.main.scrollY = largest - 300; } From bf7f808a440114ea50e396e549a1d4217dd91e26 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Mon, 30 Sep 2024 19:33:19 +0530 Subject: [PATCH 10/22] fix: watermark --- src/game/scenes/Game.ts | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 062a179..d867275 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -166,7 +166,7 @@ export default class Game extends Phaser.Scene { target.setScale(target.scale / (1.1 * this.damageMultipliyer)); const particleConfig = { speed: { min: -50, max: 50 }, - scale: { start: 1, end: 10 }, + scale: { start: 0.01, end: 0.1 }, blendMode: "ADD", // lifespan: 400, alpha: 0.5, @@ -175,7 +175,7 @@ export default class Game extends Phaser.Scene { const particle = this.add.particles( e.worldX, e.worldY, - "trail", + "whack", particleConfig ); // Add an event listener to destroy the emitter after the particles' lifespan @@ -1224,7 +1224,7 @@ export default class Game extends Phaser.Scene { } const siteUrl = this.add .text(this.centerX, this.centerY, "marblerace.ai", { - fontSize: "28px", + fontSize: `${28 * window.devicePixelRatio}px`, color: "#ffffff", stroke: "rgba(0,0,0,1)", strokeThickness: 4, @@ -1233,12 +1233,12 @@ export default class Game extends Phaser.Scene { // Below line placed at the right position when setScale is not used siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, this.centerY + 100); - siteUrl.setScale(window.devicePixelRatio); - // Fix the position of the siteUrl when setScale is used - siteUrl.setPosition( - siteUrl.x - siteUrl.width / 2, - siteUrl.y - siteUrl.height / 2 - ); + // siteUrl.setScale(window.devicePixelRatio); + // // Fix the position of the siteUrl when setScale is used + // siteUrl.setPosition( + // siteUrl.x - siteUrl.width / 2, + // siteUrl.y - siteUrl.height / 2 + // ); // Enable camera scrolling const canvasWidth = this.cameras.main.width; @@ -1480,11 +1480,12 @@ export default class Game extends Phaser.Scene { // Increase size this.currentMarblesSizeIndices[i.toString()]++; this.matter.body.scale(voiceBody, 2, 2); - if (marbleImage) + if (marbleImage) { marbleImage.setDisplaySize( this.marbleRadius * 2, this.marbleRadius * 2 ); + } if (marbleMask) marbleMask.scale = 1; this.heightReducedIndices = this.heightReducedIndices.filter((idx) => idx !== i); @@ -1497,11 +1498,12 @@ export default class Game extends Phaser.Scene { // Reduce size this.heightReducedIndices.push(i); this.matter.body.scale(voiceBody, 0.5, 0.5); - if (marbleImage) + if (marbleImage) { marbleImage.setDisplaySize( this.marbleRadius, this.marbleRadius ); + } if (marbleMask) marbleMask.scale = 0.5; // this.marbleTrailParticles[i].setConfig({ // ...this.trailConfig, From b1f000e79bbae3e399b7245c1c4b07a9a3152945 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Thu, 3 Oct 2024 19:07:45 +0530 Subject: [PATCH 11/22] feat: only downbeats for san andreas --- package-lock.json | 39 + package.json | 4 +- public/assets/sprite/green_dot.png | Bin 0 -> 99452 bytes public/assets/sprite/green_dot_outline.png | Bin 0 -> 36925 bytes src/App.tsx | 2 +- src/components/Rows.tsx | 2 +- src/game/PhaserGame.tsx | 1 + src/game/scenes/Game.ts | 1142 +++++++++++--------- src/game/scenes/Preloader.ts | 5 + src/hooks/useTonejs.ts | 5 +- 10 files changed, 679 insertions(+), 521 deletions(-) create mode 100644 public/assets/sprite/green_dot.png create mode 100644 public/assets/sprite/green_dot_outline.png diff --git a/package-lock.json b/package-lock.json index 35b4550..8a7f10d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-firebase-hooks": "^5.1.1", + "react-router-dom": "^6.26.1", "tone": "^15.0.4", "use-indexeddb": "^2.0.2", "webfontloader": "^1.6.28" @@ -2111,6 +2112,14 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "node_modules/@remix-run/router": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", + "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", @@ -4412,6 +4421,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz", + "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==", + "dependencies": { + "@remix-run/router": "1.19.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz", + "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==", + "dependencies": { + "@remix-run/router": "1.19.1", + "react-router": "6.26.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", diff --git a/package.json b/package.json index 56f8145..b0b6b4a 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "typescript" ], "scripts": { - "dev": "vite --config vite/config.dev.mjs --port 3000", + "dev": "vite --config vite/config.dev.mjs --port 3000 --host 0.0.0.0", "build": "vite build --config vite/config.prod.mjs" }, "dependencies": { @@ -38,6 +38,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-firebase-hooks": "^5.1.1", + "react-router-dom": "^6.26.1", "tone": "^15.0.4", "use-indexeddb": "^2.0.2", "webfontloader": "^1.6.28" @@ -58,3 +59,4 @@ "vite": "^5.3.1" } } + diff --git a/public/assets/sprite/green_dot.png b/public/assets/sprite/green_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..32e9fe39c66b9fef3254fc67428913da53d25c2b GIT binary patch literal 99452 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 PsE5JR)z4*}Q$iB};_wp_ literal 0 HcmV?d00001 diff --git a/public/assets/sprite/green_dot_outline.png b/public/assets/sprite/green_dot_outline.png new file mode 100644 index 0000000000000000000000000000000000000000..8025eac21c8ea9dc28e61170e8ddc76676c132b9 GIT binary patch literal 36925 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 literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx index a3bdbff..a5bbd92 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -76,7 +76,7 @@ function App() { ); const [selectedVoices, setSelectedVoices] = useState([]); const [downloadProgress, setDownloadProgress] = useState(0); - const [startSectionIdx, setStartSectionIdx] = useState(3); + const [startSectionIdx, setStartSectionIdx] = useState(1); const [noOfRaceTracks, setNoOfRaceTracks] = useState(6); const [marbleSpeed, setMarbleSpeed] = useState(0.8); const theme = useTheme(); diff --git a/src/components/Rows.tsx b/src/components/Rows.tsx index 5a9ce8c..ed772cc 100644 --- a/src/components/Rows.tsx +++ b/src/components/Rows.tsx @@ -54,7 +54,7 @@ type Props = { onGotoControls?: (coverDocId: string, coverDoc: CoverV1) => void; }; const Rows = ({ onCoverSelection, onPlay, onGotoControls }: Props) => { - const [recordsLimit, setRecordsLimit] = useState(15); + const [recordsLimit, setRecordsLimit] = useState(2); const [isLatest, setIsLatest] = useState(false); const [coversCollectionSnapshot, coversLoading, error] = useCollection( getRowsQuery(recordsLimit, isLatest) diff --git a/src/game/PhaserGame.tsx b/src/game/PhaserGame.tsx index a293d4d..76dfcec 100644 --- a/src/game/PhaserGame.tsx +++ b/src/game/PhaserGame.tsx @@ -29,6 +29,7 @@ export interface IGameDataParams { height?: number; dprAdjustedWidth?: number; dprAdjustedHeight?: number; + showObstacles?: boolean; } interface IProps extends IGameDataParams { diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index d867275..c6b9fce 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -1,22 +1,21 @@ import Phaser from "phaser"; import { + getToneCurrentTime, marbleRaceOnlyInstrument, marbleRacePlayVocals, } from "../../hooks/useTonejs"; import _ from "lodash"; import { GameVoiceInfo, ObstacleNames } from "./Preloader"; -import { IGameDataParams } from "../PhaserGame"; -import { duplicateArrayElemToN } from "../../helpers"; import { BodyType } from "matter"; +import { duplicateArrayElemToN } from "../../helpers"; +import { EventBus } from "../EventBus"; +import { IGameDataParams } from "../PhaserGame"; +import { Circle } from "@mui/icons-material"; export default class Game extends Phaser.Scene { constructor() { super("game"); this.throttledUpdate = _.throttle(this.throttledUpdate.bind(this), 10); // Throttle interval in milliseconds - this.throttledUpdateGif = _.throttle( - this.throttledUpdateGif.bind(this), - 100 - ); // Throttle interval in milliseconds } public sky: Phaser.Physics.Matter.Image | undefined; public marbles: MatterJS.BodyType[] = []; @@ -49,7 +48,7 @@ export default class Game extends Phaser.Scene { // public trails: { x: number; y: number }[][] = []; // public trailGraphics: Phaser.GameObjects.Graphics[] = []; // public trailsGroup: Phaser.GameObjects.Group[] = []; - public trailLength: number; + public trailLength: number = 0; public trailPoints: { x: number; y: number; @@ -58,10 +57,10 @@ export default class Game extends Phaser.Scene { }[][] = []; // public shape: any; public voices: GameVoiceInfo[] = []; - public coverDocId: string; - public musicStartOffset: number; - public selectedTracks: string[]; - public noOfRaceTracks: number; + public coverDocId: string = ""; + public musicStartOffset: number = 0; + public selectedTracks: string[] = []; + public noOfRaceTracks: number = 0; largeCircle: Phaser.Physics.Matter.Image | undefined; isRotating = true; baseAngle = 0; @@ -72,70 +71,86 @@ export default class Game extends Phaser.Scene { countdownText: Phaser.GameObjects.Text | undefined; finishLineOffset: number = 0; marbleRadius = 23; - background: Phaser.GameObjects.TileSprite; + background: Phaser.GameObjects.TileSprite | undefined; enableMotion: boolean = false; marbleTrailParticles: Phaser.GameObjects.Particles.ParticleEmitter[] = []; + isGameOver: boolean = false; + winnerIdx: number = -1; + isResultShown = false; + damageMultipliyer: number = 1; + level1Hammer: Phaser.GameObjects.Sprite | undefined; + level2Hammer: Phaser.GameObjects.Sprite | undefined; + canvasWidth: number = 0; + canvasHeight: number = 0; + dpr: number = window.devicePixelRatio || 2; trailConfig = { speed: { min: -50, max: 50 }, scale: { - start: window.devicePixelRatio, - end: window.devicePixelRatio * 0.5, + start: this.dpr, + end: this.dpr * 0.5, }, blendMode: "ADD", lifespan: 400, alpha: 0.5, }; - damageMultipliyer: number = 1; - level1Hammer: Phaser.GameObjects.Sprite | undefined; - level2Hammer: Phaser.GameObjects.Sprite | undefined; - canvasWidth: number = 0; - canvasHeight: number = 0; + showObstacles: boolean = false; init(data: IGameDataParams) { // Sort the voices randomly - this.voices = data.voices.sort(() => Math.random() - 0.5); + this.voices = data.voices; + // .sort(() => Math.random() - 0.5); this.coverDocId = data.coverDocId; this.musicStartOffset = data.musicStartOffset; - this.noOfRaceTracks = data.noOfRaceTracks; + this.noOfRaceTracks = data.noOfRaceTracks || 5; this.selectedTracks = duplicateArrayElemToN( data.selectedTracks, this.noOfRaceTracks ); this.enableMotion = data.enableMotion; this.canvasWidth = data.width; - this.marbleRadius = - (22 / 414) * this.canvasWidth * window.devicePixelRatio; + this.marbleRadius = (22 / 414) * this.canvasWidth * this.dpr; if (data.height) this.canvasHeight = data.height; this.centerX = this.cameras.main.width / 2; this.centerY = this.cameras.main.height / 2; this.trailConfig.scale.end = data.trailEndSize; this.trailConfig.lifespan = data.trailsLifeSpace; this.trailConfig.alpha = data.trailsOpacity; + this.dpr = window.devicePixelRatio || 2; + this.showObstacles = data.showObstacles || false; } - throttledUpdate(index: number) { + throttledUpdate(index: number, switchOld: boolean = true) { this.prevVoiceIdx = index; // Logic that should be throttled marbleRacePlayVocals(this.coverDocId, this.voices[index].id); } - throttledUpdateGif(largestIndex: number) { - // Switch between mouth and normal image on each update to create a singing animation effect - const marbleImage = this.marblesImages[largestIndex]; - const voiceId = this.voices[largestIndex].id; - const isMouthOpen = - marbleImage.texture.key === `resized_${voiceId}_mouth`; - const newTexture = isMouthOpen - ? `resized_${voiceId}` - : `resized_${voiceId}_mouth`; - // const newSize = this.marbleRadius * 2; + renderWeapons() { + this.level1Hammer = this.add + .sprite( + (350 / 414) * this.canvasWidth * this.dpr, + (550 / 414) * this.canvasWidth * this.dpr, + "hammer_1" + ) + .setScale((0.1 / 414) * this.canvasWidth * this.dpr) + .setScrollFactor(0) + .setInteractive() + .on("pointerdown", () => { + this.damageMultipliyer = 1; + }); - marbleImage.setTexture(newTexture); - marbleImage.setDisplaySize( - this.marbleRadius * 2, - this.marbleRadius * 2 - ); - marbleImage.setOrigin(0.5, 0.5); + this.level2Hammer = this.add + .sprite( + (350 / 414) * this.canvasWidth * this.dpr, + (630 / 414) * this.canvasWidth * this.dpr, + "hammer_2" + ) + .setScale((0.1 / 414) * this.canvasWidth * this.dpr) + .setScrollFactor(0) + .setInteractive() + .on("pointerdown", () => { + this.damageMultipliyer = 1.5; + }); } createTextureMask = ( @@ -145,11 +160,7 @@ export default class Game extends Phaser.Scene { ) => { // Create the texture sprite const textureSprite = this.add.sprite(xOffset, yOffset, "textureImage"); - // textureSprite.setScale( - // (this.canvasWidth / textureSprite.width) * window.devicePixelRatio, - // (this.canvasHeight / textureSprite.height) * window.devicePixelRatio - // ); - textureSprite.setScale(window.devicePixelRatio); + textureSprite.setScale(this.dpr); // Use the base sprite's texture as a mask for the texture sprite const mask = new Phaser.Display.Masks.BitmapMask(this, baseSprite); @@ -159,53 +170,6 @@ export default class Game extends Phaser.Scene { baseSprite.setVisible(false); }; - handleDamage(target: Phaser.Physics.Matter.Sprite, e: any) { - // Logic for handling damage - console.log("Damage dealt to the target!"); - if (this.damageMultipliyer) { - target.setScale(target.scale / (1.1 * this.damageMultipliyer)); - const particleConfig = { - speed: { min: -50, max: 50 }, - scale: { start: 0.01, end: 0.1 }, - blendMode: "ADD", - // lifespan: 400, - alpha: 0.5, - particleBringToTop: true, - }; - const particle = this.add.particles( - e.worldX, - e.worldY, - "whack", - particleConfig - ); - // Add an event listener to destroy the emitter after the particles' lifespan - this.time.delayedCall( - 200, - () => { - // emitter.stop(); - particle.destroy(); // Destroys the particle manager and emitter - }, - [], - this - ); - // Play sound - if (this.damageMultipliyer === 1) - this.sound.play("low_whack", { volume: 0.5 }); - else this.sound.play("high_whack", { volume: 0.5 }); - } - if (target.scale <= 0.08) { - target.destroy(); - } - - // // Example: reduce health, show effects, etc. - // target.health = (target.health || 100) - 10; // Example: reduce health by 10 - // console.log("Target health:", target.health); - - // if (target.health <= 0) { - // console.log("Target destroyed!"); - // target.destroy(); // Destroy the target if health is 0 - // } - } createCrossScreen = ( startOffset: number, canvasWidth: number, @@ -214,7 +178,7 @@ export default class Game extends Phaser.Scene { // TODO: Scale the sprite startOffset += 151; const l1CrossLeft = this.matter.add.sprite( - 18 * window.devicePixelRatio, + 18 * this.dpr, startOffset, "02_cross", undefined, @@ -223,10 +187,10 @@ export default class Game extends Phaser.Scene { isStatic: true, } ); - l1CrossLeft.setScale(window.devicePixelRatio); + l1CrossLeft.setScale(this.dpr); this.crossRightRotation.push(l1CrossLeft); const l1CrossRight = this.matter.add.sprite( - canvasWidth - 18 * window.devicePixelRatio, + canvasWidth - 18 * this.dpr, startOffset, "02_cross", undefined, @@ -235,11 +199,11 @@ export default class Game extends Phaser.Scene { isStatic: true, } ); - l1CrossRight.setScale(window.devicePixelRatio); + l1CrossRight.setScale(this.dpr); this.crossLeftRotation.push(l1CrossRight); - startOffset += 200 * window.devicePixelRatio; + startOffset += 200 * this.dpr; const l2CrossLeft = this.matter.add.sprite( - 126 * window.devicePixelRatio, + 126 * this.dpr, startOffset, "02_cross", undefined, @@ -248,10 +212,10 @@ export default class Game extends Phaser.Scene { isStatic: true, } ); - l2CrossLeft.setScale(window.devicePixelRatio); + l2CrossLeft.setScale(this.dpr); this.crossLeftRotation.push(l2CrossLeft); const l2CrossRight = this.matter.add.sprite( - canvasWidth - 126 * window.devicePixelRatio, + canvasWidth - 126 * this.dpr, startOffset, "02_cross", undefined, @@ -260,11 +224,11 @@ export default class Game extends Phaser.Scene { isStatic: true, } ); - l2CrossRight.setScale(window.devicePixelRatio); + l2CrossRight.setScale(this.dpr); this.crossRightRotation.push(l2CrossRight); - startOffset += 200 * window.devicePixelRatio; + startOffset += 200 * this.dpr; const l3CrossLeft = this.matter.add.sprite( - 18 * window.devicePixelRatio, + 18 * this.dpr, startOffset, "02_cross", undefined, @@ -273,10 +237,10 @@ export default class Game extends Phaser.Scene { isStatic: true, } ); - l3CrossLeft.setScale(window.devicePixelRatio); + l3CrossLeft.setScale(this.dpr); this.crossRightRotation.push(l3CrossLeft); const l3CrossRight = this.matter.add.sprite( - canvasWidth - 18 * window.devicePixelRatio, + canvasWidth - 18 * this.dpr, startOffset, "02_cross", undefined, @@ -285,11 +249,11 @@ export default class Game extends Phaser.Scene { isStatic: true, } ); - l3CrossRight.setScale(window.devicePixelRatio); + l3CrossRight.setScale(this.dpr); this.crossLeftRotation.push(l3CrossRight); - startOffset += 200 * window.devicePixelRatio; + startOffset += 200 * this.dpr; const l4CrossLeft = this.matter.add.sprite( - 126 * window.devicePixelRatio, + 126 * this.dpr, startOffset, "02_cross", undefined, @@ -298,10 +262,10 @@ export default class Game extends Phaser.Scene { isStatic: true, } ); - l4CrossLeft.setScale(window.devicePixelRatio); + l4CrossLeft.setScale(this.dpr); this.crossLeftRotation.push(l4CrossLeft); const l4CrossRight = this.matter.add.sprite( - canvasWidth - 126 * window.devicePixelRatio, + canvasWidth - 126 * this.dpr, startOffset, "02_cross", undefined, @@ -310,10 +274,10 @@ export default class Game extends Phaser.Scene { isStatic: true, } ); - l4CrossRight.setScale(window.devicePixelRatio); + l4CrossRight.setScale(this.dpr); this.crossRightRotation.push(l4CrossRight); - return startOffset + 500 * window.devicePixelRatio; + return startOffset + 500 * this.dpr; }; createSeesawScreen = ( xOffset: number, @@ -322,16 +286,12 @@ export default class Game extends Phaser.Scene { miniShapes: any, obstaclesShapes: any ) => { - // const scaleFactor = this.cameras.main.width / 414; - const baseSprite = this.matter.add .sprite(xOffset, startOffset, "prod_texture_loaded_06", undefined, { shape: prodShapes["06"], isStatic: true, }) - .setScale( - window.devicePixelRatio * (this.canvasWidth / (512 - 100)) - ); + .setScale(this.dpr * (this.canvasWidth / (512 - 100))); const yOffset = startOffset + baseSprite.height / 2; baseSprite.setPosition(xOffset, yOffset); const seesawX = xOffset - 2; @@ -345,54 +305,56 @@ export default class Game extends Phaser.Scene { shape: miniShapes["06b"], // isStatic: true, }) - .setScale(window.devicePixelRatio); + .setScale(this.dpr); const contraint = this.matter.constraint.create({ bodyA: seesaw.body as BodyType, bodyB: baseSprite.body as BodyType, pointA: { x: 0, y: 0 }, pointB: { x: -2, - y: seesawContraintY * window.devicePixelRatio, + y: seesawContraintY * this.dpr, }, stiffness: 1, length: 0, }); - const randomObstaclePosition = _.sample([ - [this.centerX, seesawY - 200], - [this.centerX - 100, seesawY], - [this.centerX + 100, seesawY], - [this.centerX, seesawY + 200], - [this.centerX - 100, seesawY + 400], - [this.centerX + 100, seesawY + 400], - ]); + if (this.showObstacles) { + const randomObstaclePosition = _.sample([ + [this.centerX, seesawY - 200], + [this.centerX - 100, seesawY], + [this.centerX + 100, seesawY], + [this.centerX, seesawY + 200], + [this.centerX - 100, seesawY + 400], + [this.centerX + 100, seesawY + 400], + ]); - const randomObstacle = _.sample(ObstacleNames); - const target = this.matter.add - .sprite( - randomObstaclePosition[0], - randomObstaclePosition[1], - `obstacle_${randomObstacle}`, - undefined, - { - shape: obstaclesShapes[ - randomObstacle as keyof typeof obstaclesShapes - ], - friction: 0, - frictionAir: 0, - frictionStatic: 0, - } - ) - .setScale( - (0.17 / 414) * this.canvasWidth * window.devicePixelRatio - ); - target.setInteractive(); - target.on("pointerdown", (e: any) => { - this.handleDamage(target, e); - }); + const randomObstacle = _.sample(ObstacleNames); + if (randomObstaclePosition && randomObstacle) { + const target = this.matter.add + .sprite( + randomObstaclePosition[0], + randomObstaclePosition[1], + `obstacle_${randomObstacle}`, + undefined, + { + shape: obstaclesShapes[ + randomObstacle as keyof typeof obstaclesShapes + ], + friction: 0, + frictionAir: 0, + frictionStatic: 0, + } + ) + .setScale((0.17 / 414) * this.canvasWidth * this.dpr); + target.setInteractive(); + target.on("pointerdown", (e: any) => { + this.handleDamage(target, e); + }); + } + } this.matter.world.add(contraint); this.createTextureMask(seesawX, seesawY, seesaw); this.createTextureMask(xOffset, yOffset, baseSprite); - return startOffset + baseSprite.height * window.devicePixelRatio; + return startOffset + baseSprite.height * this.dpr; }; createCircleBlockers = ( xOffset: number, @@ -405,11 +367,9 @@ export default class Game extends Phaser.Scene { shape: prodShapes["21"], isStatic: true, }) - .setScale( - window.devicePixelRatio * (this.canvasWidth / (512 - 100)) - ); + .setScale(this.dpr * (this.canvasWidth / (512 - 100))); this.createTextureMask(xOffset, yOffset, baseSprite); - return startOffset + baseSprite.height * window.devicePixelRatio; + return startOffset + baseSprite.height * this.dpr; }; createStarRotations = (_startOffset: number, miniShapes: any) => { // TODO: Scale the sprite @@ -435,8 +395,7 @@ export default class Game extends Phaser.Scene { this.leftRotatableStars.push( this.matter.add .sprite( - ((115 / 414) * this.canvasWidth + barWidth) * - window.devicePixelRatio, + ((115 / 414) * this.canvasWidth + barWidth) * this.dpr, startOffset, "mini_star", undefined, @@ -445,17 +404,14 @@ export default class Game extends Phaser.Scene { isStatic: true, } ) - .setScale( - (1 / 414) * this.canvasWidth * window.devicePixelRatio - ) + .setScale((1 / 414) * this.canvasWidth * this.dpr) .setAngle(35) ); this.rightRotatableStars.push( this.matter.add .sprite( - ((305 / 414) * this.canvasWidth + barWidth) * - window.devicePixelRatio, + ((305 / 414) * this.canvasWidth + barWidth) * this.dpr, startOffset, "mini_star", undefined, @@ -464,17 +420,14 @@ export default class Game extends Phaser.Scene { isStatic: true, } ) - .setScale( - (1 / 414) * this.canvasWidth * window.devicePixelRatio - ) + .setScale((1 / 414) * this.canvasWidth * this.dpr) ); // Second Row - startOffset += 165 * window.devicePixelRatio; + startOffset += 165 * this.dpr; this.rightRotatableStars.push( this.matter.add .sprite( - ((10 / 414) * this.canvasWidth + barWidth) * - window.devicePixelRatio, + ((10 / 414) * this.canvasWidth + barWidth) * this.dpr, startOffset, "mini_star", undefined, @@ -483,16 +436,13 @@ export default class Game extends Phaser.Scene { isStatic: true, } ) - .setScale( - (1 / 414) * this.canvasWidth * window.devicePixelRatio - ) + .setScale((1 / 414) * this.canvasWidth * this.dpr) .setAngle(5) ); this.rightRotatableStars.push( this.matter.add .sprite( - ((206 / 414) * this.canvasWidth + barWidth) * - window.devicePixelRatio, + ((206 / 414) * this.canvasWidth + barWidth) * this.dpr, startOffset, "mini_star", undefined, @@ -501,16 +451,13 @@ export default class Game extends Phaser.Scene { isStatic: true, } ) - .setScale( - (1 / 414) * this.canvasWidth * window.devicePixelRatio - ) + .setScale((1 / 414) * this.canvasWidth * this.dpr) // .setAngle() ); this.leftRotatableStars.push( this.matter.add .sprite( - ((400 / 414) * this.canvasWidth + barWidth) * - window.devicePixelRatio, + ((400 / 414) * this.canvasWidth + barWidth) * this.dpr, startOffset, "mini_star", undefined, @@ -519,16 +466,15 @@ export default class Game extends Phaser.Scene { isStatic: true, } ) - .setScale(window.devicePixelRatio) + .setScale(this.dpr) .setAngle(35) ); // Third Row - startOffset += 180 * window.devicePixelRatio; + startOffset += 180 * this.dpr; this.leftRotatableStars.push( this.matter.add .sprite( - ((115 / 414) * this.canvasWidth + barWidth) * - window.devicePixelRatio, + ((115 / 414) * this.canvasWidth + barWidth) * this.dpr, startOffset, "mini_star", undefined, @@ -537,14 +483,13 @@ export default class Game extends Phaser.Scene { isStatic: true, } ) - .setScale(window.devicePixelRatio) + .setScale(this.dpr) .setAngle(30) ); this.rightRotatableStars.push( this.matter.add .sprite( - ((305 / 414) * this.canvasWidth + barWidth) * - window.devicePixelRatio, + ((305 / 414) * this.canvasWidth + barWidth) * this.dpr, startOffset, "mini_star", undefined, @@ -553,16 +498,15 @@ export default class Game extends Phaser.Scene { isStatic: true, } ) - .setScale(window.devicePixelRatio) + .setScale(this.dpr) .setAngle(5) ); // Fourth Row - startOffset += 160 * window.devicePixelRatio; + startOffset += 160 * this.dpr; this.rightRotatableStars.push( this.matter.add .sprite( - ((10 / 414) * this.canvasWidth + barWidth) * - window.devicePixelRatio, + ((10 / 414) * this.canvasWidth + barWidth) * this.dpr, startOffset, "mini_star", undefined, @@ -571,14 +515,13 @@ export default class Game extends Phaser.Scene { isStatic: true, } ) - .setScale(window.devicePixelRatio) + .setScale(this.dpr) .setAngle(8) ); this.leftRotatableStars.push( this.matter.add .sprite( - ((210 / 414) * this.canvasWidth + barWidth) * - window.devicePixelRatio, + ((210 / 414) * this.canvasWidth + barWidth) * this.dpr, startOffset, "mini_star", undefined, @@ -587,14 +530,13 @@ export default class Game extends Phaser.Scene { isStatic: true, } ) - .setScale(window.devicePixelRatio) + .setScale(this.dpr) .setAngle(30) ); this.leftRotatableStars.push( this.matter.add .sprite( - ((400 / 414) * this.canvasWidth + barWidth) * - window.devicePixelRatio, + ((400 / 414) * this.canvasWidth + barWidth) * this.dpr, startOffset, "mini_star", undefined, @@ -603,10 +545,10 @@ export default class Game extends Phaser.Scene { isStatic: true, } ) - .setScale(window.devicePixelRatio) + .setScale(this.dpr) .setAngle(35) ); - return startOffset + 500 * window.devicePixelRatio; + return startOffset + 500 * this.dpr; }; createStaticTriangles = ( @@ -621,49 +563,92 @@ export default class Game extends Phaser.Scene { shape: prodShapes["03"], isStatic: true, }) - .setScale( - window.devicePixelRatio * (this.canvasWidth / (512 - 100)) - ); - // baseSprite.setScale( - // (this.cameras.main.width / baseSprite.width) * - // window.devicePixelRatio - // ); + .setScale(this.dpr * (this.canvasWidth / (512 - 100))); this.createTextureMask(xOffset, yOffset, baseSprite); + if (this.showObstacles) { + const randomObstaclePosition = _.sample([ + [100, startOffset], + [350, startOffset], + [this.centerX, startOffset + 200], + [100, startOffset + 400], + [400, startOffset + 400], + ]); - const randomObstaclePosition = _.sample([ - [100, startOffset], - [350, startOffset], - [this.centerX, startOffset + 200], - [100, startOffset + 400], - [400, startOffset + 400], - ]); - - const randomObstacle = _.sample(ObstacleNames); - const target = this.matter.add.sprite( - randomObstaclePosition[0], - randomObstaclePosition[1], - `obstacle_${randomObstacle}`, - undefined, - { - shape: obstaclesShapes[ - randomObstacle as keyof typeof obstaclesShapes - ], - // angle: 124, - friction: 0, - frictionAir: 0, - frictionStatic: 0, + const randomObstacle = _.sample(ObstacleNames); + if (randomObstaclePosition && randomObstacle) { + const target = this.matter.add.sprite( + randomObstaclePosition[0], + randomObstaclePosition[1], + `obstacle_${randomObstacle}`, + undefined, + { + shape: obstaclesShapes[ + randomObstacle as keyof typeof obstaclesShapes + ], + // angle: 124, + friction: 0, + frictionAir: 0, + frictionStatic: 0, + } + ); + target.setScale((0.17 / 414) * this.canvasWidth * this.dpr); + target.setInteractive(); + target.on("pointerdown", (e: any) => { + this.handleDamage(target, e); + }); } - ); - target.setScale( - (0.17 / 414) * this.canvasWidth * window.devicePixelRatio - ); - target.setInteractive(); - target.on("pointerdown", (e: any) => { - this.handleDamage(target, e); - }); - return startOffset + baseSprite.height * window.devicePixelRatio; + } + return startOffset + baseSprite.height * this.dpr; }; + handleDamage(target: Phaser.Physics.Matter.Sprite, e: any) { + // Logic for handling damage + console.log("Damage dealt to the target!"); + if (this.damageMultipliyer) { + target.setScale(target.scale / (1.1 * this.damageMultipliyer)); + const particleConfig = { + speed: { min: -50, max: 50 }, + scale: { start: 0.01, end: 0.1 }, + blendMode: "ADD", + // lifespan: 400, + alpha: 0.5, + particleBringToTop: true, + }; + const particle = this.add.particles( + e.worldX, + e.worldY, + "whack", + particleConfig + ); + // Add an event listener to destroy the emitter after the particles' lifespan + this.time.delayedCall( + 200, + () => { + // emitter.stop(); + particle.destroy(); // Destroys the particle manager and emitter + }, + [], + this + ); + // Play sound + if (this.damageMultipliyer === 1) + this.sound.play("low_whack", { volume: 0.5 }); + else this.sound.play("high_whack", { volume: 0.5 }); + } + if (target.scale <= 0.08) { + target.destroy(); + } + + // // Example: reduce health, show effects, etc. + // target.health = (target.health || 100) - 10; // Example: reduce health by 10 + // console.log("Target health:", target.health); + + // if (target.health <= 0) { + // console.log("Target destroyed!"); + // target.destroy(); // Destroy the target if health is 0 + // } + } + createReduceSizeSlider = ( xOffset: number, startOffset: number, @@ -682,12 +667,10 @@ export default class Game extends Phaser.Scene { isStatic: true, } ) - .setScale( - window.devicePixelRatio * (this.canvasWidth / (512 - 100)) - ); + .setScale(this.dpr * (this.canvasWidth / (512 - 100))); // .setScale(this.cameras.main.width / 414); this.createTextureMask(xOffset, yOffset, baseSprite); - startOffset += baseSprite.height * window.devicePixelRatio; + startOffset += baseSprite.height * this.dpr; this.increaseSizeScreenOffset.push(startOffset); startOffset += 300; return startOffset; @@ -809,48 +792,45 @@ export default class Game extends Phaser.Scene { shape: prodShapes["01"], isStatic: true, }) - .setScale( - window.devicePixelRatio * (this.canvasWidth / (512 - 100)) - ); + .setScale(this.dpr * (this.canvasWidth / (512 - 100))); const yOffset = startOffset + baseSprite.height / 2; baseSprite.setPosition(baseSprite.x, yOffset); this.createTextureMask(xOffset, yOffset, baseSprite); - const randomObstaclePosition = _.sample([ - [150, startOffset], - [350, startOffset], - [150, startOffset + 300], - [this.centerX, startOffset + 200], - [390, startOffset + 200], - [150, startOffset + 400], - [350, startOffset + 400], - [this.centerX, startOffset + 600], - ]); - const randomObstacle = _.sample(ObstacleNames); - const target = this.matter.add.sprite( - randomObstaclePosition[0], - randomObstaclePosition[1], - `obstacle_${randomObstacle}`, - undefined, - { - shape: obstaclesShapes[ - randomObstacle as keyof typeof obstaclesShapes - ], - // angle: 124, - friction: 0, - frictionAir: 0, - frictionStatic: 0, - // ignoreGravity: true, + if (this.showObstacles) { + const randomObstaclePosition = _.sample([ + [150, startOffset], + [350, startOffset], + [150, startOffset + 300], + [this.centerX, startOffset + 200], + [390, startOffset + 200], + [150, startOffset + 400], + [350, startOffset + 400], + [this.centerX, startOffset + 600], + ]); + const randomObstacle = _.sample(ObstacleNames); + if (randomObstaclePosition && randomObstacle) { + const target = this.matter.add.sprite( + randomObstaclePosition[0], + randomObstaclePosition[1], + `obstacle_${randomObstacle}`, + undefined, + { + shape: obstaclesShapes[ + randomObstacle as keyof typeof obstaclesShapes + ], + friction: 0, + frictionAir: 0, + frictionStatic: 0, + } + ); + target.setScale((0.17 / 414) * this.canvasWidth * this.dpr); + target.setInteractive(); + target.on("pointerdown", (e: any) => { + this.handleDamage(target, e); + }); } - ); - target.setScale( - (0.17 / 414) * this.canvasWidth * window.devicePixelRatio - ); - target.setInteractive(); - target.on("pointerdown", (e: any) => { - this.handleDamage(target, e); - }); - - return startOffset + baseSprite.height * window.devicePixelRatio; + } + return startOffset + baseSprite.height * this.dpr; }; createZigzagSlider = ( xOffset: number, @@ -872,48 +852,47 @@ export default class Game extends Phaser.Scene { baseSprite.x, startOffset + baseSprite.height / 2 ); - baseSprite.setScale( - window.devicePixelRatio * (this.canvasWidth / (512 - 100)) - ); + baseSprite.setScale(this.dpr * (this.canvasWidth / (512 - 100))); this.createTextureMask( xOffset, startOffset + baseSprite.height / 2, baseSprite ); - const randomObstaclePosition = _.sample([ - [140, startOffset], - [350, startOffset], - [150, startOffset + 200], - [350, startOffset + 200], - [150, startOffset + 400], - [350, startOffset + 400], - ]); - const randomObstacle = _.sample(ObstacleNames); - const target = this.matter.add - .sprite( - randomObstaclePosition[0], - randomObstaclePosition[1], - `obstacle_${randomObstacle}`, - undefined, - { - shape: obstaclesShapes[ - randomObstacle as keyof typeof obstaclesShapes - ], - // angle: 124, - friction: 0, - frictionAir: 0, - frictionStatic: 0, - } - ) - .setScale( - (0.17 / 414) * this.canvasWidth * window.devicePixelRatio - ); - target.setInteractive(); - target.on("pointerdown", (e: any) => { - this.handleDamage(target, e); - }); - - return startOffset + baseSprite.height * window.devicePixelRatio; + if (this.showObstacles) { + const randomObstaclePosition = _.sample([ + [140, startOffset], + [350, startOffset], + [150, startOffset + 200], + [350, startOffset + 200], + [150, startOffset + 400], + [350, startOffset + 400], + ]); + const randomObstacle = _.sample(ObstacleNames); + if (randomObstaclePosition && randomObstacle) { + const target = this.matter.add + .sprite( + randomObstaclePosition[0], + randomObstaclePosition[1], + `obstacle_${randomObstacle}`, + undefined, + { + shape: obstaclesShapes[ + randomObstacle as keyof typeof obstaclesShapes + ], + // angle: 124, + friction: 0, + frictionAir: 0, + frictionStatic: 0, + } + ) + .setScale((0.17 / 414) * this.canvasWidth * this.dpr); + target.setInteractive(); + target.on("pointerdown", (e: any) => { + this.handleDamage(target, e); + }); + } + } + return startOffset + baseSprite.height * this.dpr; }; createMarbles = (marbleRadius: number, miniShapes: any) => { this.largeCircle = this.matter.add.sprite( @@ -932,8 +911,7 @@ export default class Game extends Phaser.Scene { // this.largeCircle.setScale(0.1); // this.isRotating = false; this.largeCircle.setScale( - (this.canvasWidth / this.largeCircle.width) * - window.devicePixelRatio + (this.canvasWidth / this.largeCircle.width) * this.dpr ); // .setScale(0.8); const xOffsetValues = [ @@ -958,14 +936,9 @@ export default class Game extends Phaser.Scene { friction: 0, frictionAir: 0, frictionStatic: 0, - // Add colors - render: { - fillColor: 0xff0000, - }, } ); this.marbles.push(circleBody); - // TODO: Add Trails back this.marbleTrailParticles.push( this.add.particles(0, 0, "trail", { ...this.trailConfig, @@ -973,7 +946,11 @@ export default class Game extends Phaser.Scene { }) ); - // Create an image and attach it to the circle body + // circleBody.emitter = emitter; + // this.trailsGroup.push(this.add.group()); + // this.trailGraphics.push(this.add.graphics()); + // this.trailPoints.push([]); + // // Create an image and attach it to the circle body const circleImage = this.add.image( circleBody.position.x, circleBody.position.y, @@ -981,16 +958,11 @@ export default class Game extends Phaser.Scene { ); circleImage.setDisplaySize(marbleRadius * 2, marbleRadius * 2); circleImage.setOrigin(0.5, 0.5); - - // Ensure the image is visible - circleImage.setDepth(1); - circleImage.setVisible(true); - // Circle mask const maskShape = this.make.graphics(); maskShape.fillStyle(0xffffff); maskShape.fillCircle(marbleRadius, marbleRadius, marbleRadius); - const mask = new Phaser.Display.Masks.GeometryMask(this, maskShape); + const mask = maskShape.createGeometryMask(); // Apply the mask to the image circleImage.setMask(mask); @@ -1014,7 +986,7 @@ export default class Game extends Phaser.Scene { }); this.countdownText = this.add .text(this.centerX, this.centerY - 100, "3", { - fontSize: `${64 * window.devicePixelRatio}px`, + fontSize: `${64 * this.dpr}px`, color: "#ffffff", }) .setOrigin(0.5); @@ -1035,14 +1007,11 @@ export default class Game extends Phaser.Scene { shape: miniShapes["02"], isStatic: true, }) - .setScale( - (0.8 / 414) * this.canvasWidth * window.devicePixelRatio - ) + .setScale((0.8 / 414) * this.canvasWidth * this.dpr) ); - leftOffset += - (80 / 414) * this.canvasWidth * window.devicePixelRatio; + leftOffset += (80 / 414) * this.canvasWidth * this.dpr; }); - startOffset += (250 / 414) * this.canvasWidth * window.devicePixelRatio; + startOffset += (250 / 414) * this.canvasWidth * this.dpr; new Array(5).fill("").map(() => { this.horizontalCrossLeftRotation.push( this.matter.add @@ -1050,15 +1019,12 @@ export default class Game extends Phaser.Scene { shape: miniShapes["02"], isStatic: true, }) - .setScale( - (0.8 / 414) * this.canvasWidth * window.devicePixelRatio - ) + .setScale((0.8 / 414) * this.canvasWidth * this.dpr) ); - rightOffset -= - (80 / 414) * this.canvasWidth * window.devicePixelRatio; + rightOffset -= (80 / 414) * this.canvasWidth * this.dpr; }); leftOffset = 20; - startOffset += (250 / 414) * this.canvasWidth * window.devicePixelRatio; + startOffset += (250 / 414) * this.canvasWidth * this.dpr; new Array(5).fill("").map(() => { this.horizontalCrossRightRotation.push( this.matter.add @@ -1066,15 +1032,12 @@ export default class Game extends Phaser.Scene { shape: miniShapes["02"], isStatic: true, }) - .setScale( - (0.8 / 414) * this.canvasWidth * window.devicePixelRatio - ) + .setScale((0.8 / 414) * this.canvasWidth * this.dpr) ); - leftOffset += - (80 / 414) * this.canvasWidth * window.devicePixelRatio; + leftOffset += (80 / 414) * this.canvasWidth * this.dpr; }); rightOffset = canvasWidth - 20; - startOffset += (250 / 414) * this.canvasWidth * window.devicePixelRatio; + startOffset += (250 / 414) * this.canvasWidth * this.dpr; new Array(5).fill("").map(() => { this.horizontalCrossLeftRotation.push( this.matter.add @@ -1082,111 +1045,54 @@ export default class Game extends Phaser.Scene { shape: miniShapes["02"], isStatic: true, }) - .setScale( - (0.8 / 414) * this.canvasWidth * window.devicePixelRatio - ) + .setScale((0.8 / 414) * this.canvasWidth * this.dpr) ); - rightOffset -= - (80 / 414) * this.canvasWidth * window.devicePixelRatio; + rightOffset -= (80 / 414) * this.canvasWidth * this.dpr; }); this.increaseSizeScreenOffset.push(startOffset); - return startOffset + 500 * window.devicePixelRatio; + return startOffset + 500 * this.dpr; }; - // createTrails = (voiceSprite: MatterJS.BodyType, i: number) => { - // const velocity = Math.sqrt( - // voiceSprite.velocity.x ** 2 + voiceSprite.velocity.y ** 2 - // ); - // // If velocity is zero, do not draw the trail - // if (velocity > 0) { - // // Calculate the position directly behind the circle relative to its velocity vector - // // const offsetX = (-voiceSprite.velocity.x / velocity) * 23; - // // const offsetY = (-voiceSprite.velocity.y / velocity) * 23; - // const trailX = voiceSprite.position.x; - // const trailY = voiceSprite.position.y; - // // // Calculate the angle of the trail image - // const angle = - // Math.atan2(voiceSprite.velocity.y, voiceSprite.velocity.x) * - // (180 / Math.PI); - // // Add the current trail position to the trail points array - // this.trailPoints[i].push({ - // x: trailX, - // y: trailY, - // angle, - // }); - // // Adjust trail length based on velocity - // this.trailLength = Phaser.Math.Clamp( - // velocity * 2, - // 10, - // this.isRotating ? 20 : 100 - // ); - // // Limit the number of points in the trail to the trail length - // if (this.trailPoints[i].length > this.trailLength) { - // this.trailPoints[i].shift(); - // } - // // Clear the previous trail - // this.trailGraphics[i].clear(); - // // this.trailsGroup[i].clear(true, true); - // // // Draw the trail - // for (let j = 0; j < this.trailPoints[i].length; j++) { - // const point = this.trailPoints[i][j]; - // const alpha = (j + 0.01) / this.trailPoints[i].length; // Gradually decrease alpha - // this.trailGraphics[i].fillStyle(0x0cffffff, alpha * 0.2); - // // this.trailGraphics.fillCircle(point.x, point.y, 20); - // const trailRadius = this.heightReducedIndices.includes(i) - // ? 11 - // : 22; - // this.trailGraphics[i].fillRoundedRect( - // point.x - trailRadius, - // point.y - trailRadius, - // trailRadius * 2, - // trailRadius * 2, - // trailRadius - // ); - // // .setAngle(point.angle); - // } - // } else { - // // Clear the trail if velocity is zero - // this.trailGraphics[i].clear(); - // // this.trailsGroup[i].clear(true, true); - // } - // }; + showResult() { + const labelContent = this.winnerIdx === 1 ? "You Win!" : "You Lose"; + const xpContent = this.winnerIdx === 1 ? "+500 XP" : "+0 XP"; - renderWeapons() { - this.level1Hammer = this.add - .sprite( - 350 * window.devicePixelRatio, - 550 * window.devicePixelRatio, - "hammer_1" - ) - .setScale((0.1 / 414) * this.canvasWidth * window.devicePixelRatio) - .setScrollFactor(0) - .setInteractive() - .on("pointerdown", () => { - this.damageMultipliyer = 1; - }); - - this.level2Hammer = this.add - .sprite( - 350 * window.devicePixelRatio, - 630 * window.devicePixelRatio, - "hammer_2" - ) - .setScale((0.1 / 414) * this.canvasWidth * window.devicePixelRatio) - .setScrollFactor(0) - .setInteractive() - .on("pointerdown", () => { - this.damageMultipliyer = 1.5; - }); - - // w.setPosition(w.x - w.width, w.y - w.height); - - // .setScrollFactor(0); + const label = this.add + .text(this.centerX, this.centerY - 180, labelContent, { + fontSize: `${64 * this.dpr}px`, + color: "#ffffff", + stroke: "#000", + strokeThickness: 4, + }) + .setScrollFactor(0); + label.setDepth(1); + label.setPosition( + label.x - label.width / 2, + label.y - label.height / 2 + ); + const labelXp = this.add + .text(this.centerX, this.centerY + 250, xpContent, { + fontSize: `${52 * this.dpr}px`, + color: "#573FC8", + stroke: "#fff", + strokeThickness: 4, + }) + .setScrollFactor(0); + // .setScale(this.dpr); + labelXp.setDepth(1); + labelXp.setPosition( + labelXp.x - labelXp.width / 2, + labelXp.y - labelXp.height / 2 + ); + EventBus.emit("game-over", this.winnerIdx === 1); + this.isResultShown = true; } create() { console.log("Game Scene..."); - this.sound.add("low_whack", { loop: false, volume: 0.5 }); - this.sound.add("high_whack", { loop: false, volume: 0.5 }); + if (this.showObstacles) { + this.sound.add("low_whack", { loop: false, volume: 0.5 }); + this.sound.add("high_whack", { loop: false, volume: 0.5 }); + } // Center the background image const centerX = this.cameras.main.width / 2; if (!this.enableMotion) { @@ -1199,46 +1105,31 @@ export default class Game extends Phaser.Scene { this.cameras.main.height ); } else { - // this.background = this.add.image(0, 0, "background"); - - // // Set the origin to the top-left corner - // this.background.setOrigin(0, 0); - - // // Scale the background image to fit the game width - // let scaleX = this.cameras.main.width / this.background.width; - // let scaleY = this.cameras.main.height / this.background.height; - // let scale = Math.max(scaleX, scaleY); - // this.background.setScale(scale).setScrollFactor(0); this.background = this.add .tileSprite(0, 0, 0, 0, "background") .setScrollFactor(0) .setOrigin(0, 0); this.background.setScale( - (414 / this.background.width) * window.devicePixelRatio, - (736 / this.background.height) * window.devicePixelRatio + (414 / this.background.width) * this.dpr, + (736 / this.background.height) * this.dpr ); this.add .image(this.centerX, this.centerY, "center_logo") .setDisplaySize(254, 84) .setScrollFactor(0); } + const siteUrl = this.add .text(this.centerX, this.centerY, "marblerace.ai", { - fontSize: `${28 * window.devicePixelRatio}px`, + fontSize: `${24 * this.dpr}px`, color: "#ffffff", - stroke: "rgba(0,0,0,1)", - strokeThickness: 4, + stroke: "rgba(0,0,0,0.5)", + strokeThickness: 2, }) .setScrollFactor(0); - // Below line placed at the right position when setScale is not used - siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, this.centerY + 100); - - // siteUrl.setScale(window.devicePixelRatio); - // // Fix the position of the siteUrl when setScale is used - // siteUrl.setPosition( - // siteUrl.x - siteUrl.width / 2, - // siteUrl.y - siteUrl.height / 2 - // ); + siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, siteUrl.y + 100); + // siteUrl.setScale(this.dpr); + // siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, siteUrl.y); // Enable camera scrolling const canvasWidth = this.cameras.main.width; @@ -1246,7 +1137,7 @@ export default class Game extends Phaser.Scene { var miniShapes = this.cache.json.get("mini_shapes"); var obstaclesShapes = this.cache.json.get("obstacles_shapes"); - let startOffset = 800 * window.devicePixelRatio; + let startOffset = 800 * this.dpr; const xOffset = this.centerX; // this.selectedTracks = ["06", "07", "03", "01", "16"]; this.selectedTracks.map((trackNo) => { @@ -1329,14 +1220,8 @@ export default class Game extends Phaser.Scene { }); const finishOffset = startOffset + 250; this.add.image(centerX, finishOffset, "finish_line").setScale(0.5); - // finishLineImage.setScale( - // (this.canvasWidth / finishLineImage.width) * - // window.devicePixelRatio, - // window.devicePixelRatio - // ); - // .setScale(window.devicePixelRatio); this.finishLineOffset = finishOffset; - // // .setDisplaySize(960, 40); + // .setDisplaySize(960, 40); this.cameras.main.setBounds( 0, 0, @@ -1402,27 +1287,219 @@ export default class Game extends Phaser.Scene { 120, this.musicStartOffset ).then(() => (this.isInstrumentPlaying = true)); + // if (this.showObstacles) this.renderWeapons(); + this.renderJoystickButtons(); + } + + graphics: Phaser.GameObjects.Graphics | undefined; + circle1: Phaser.GameObjects.Sprite | undefined; + outlineCircle1: Phaser.GameObjects.Sprite | undefined; + circle2: Phaser.GameObjects.Sprite | undefined; + outlineCircle2: Phaser.GameObjects.Sprite | undefined; + circle3: Phaser.GameObjects.Sprite | undefined; + outlineCircle3: Phaser.GameObjects.Sprite | undefined; + circle4: Phaser.GameObjects.Sprite | undefined; + outlineCircle4: Phaser.GameObjects.Sprite | undefined; + setIntervals: NodeJS.Timeout[] = []; + setTimeouts: NodeJS.Timeout[] = []; + + buttonRadius = 80; + + renderJoystickButtons() { + this.circle1 = this.add + .sprite( + this.cameras.main.width / 2 - 200, + this.cameras.main.height / 2 + 200, + "green_dot" + ) + .setDisplaySize(10, 10) + .setScrollFactor(0); + + this.outlineCircle1 = this.add + .sprite( + this.cameras.main.width / 2 - 200, + this.cameras.main.height / 2 + 200, + "green_dot_outline" + ) + .setScrollFactor(0) + .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); + this.circle2 = this.add + .sprite( + this.cameras.main.width / 2 + 200, + this.cameras.main.height / 2 + 200, + "green_dot" + ) + .setDisplaySize(10, 10) + .setScrollFactor(0); + + this.outlineCircle2 = this.add + .sprite( + this.cameras.main.width / 2 + 200, + this.cameras.main.height / 2 + 200, + "green_dot_outline" + ) + .setScrollFactor(0) + .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); + this.circle3 = this.add + .sprite( + this.cameras.main.width / 2 - 200, + this.cameras.main.height / 2 + 400, + "green_dot" + ) + .setDisplaySize(10, 10) + .setScrollFactor(0); + + this.outlineCircle3 = this.add + .sprite( + this.cameras.main.width / 2 - 200, + this.cameras.main.height / 2 + 400, + "green_dot_outline" + ) + .setScrollFactor(0) + .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); + this.circle4 = this.add + .sprite( + this.cameras.main.width / 2 + 200, + this.cameras.main.height / 2 + 400, + "green_dot" + ) + .setDisplaySize(10, 10) + .setScrollFactor(0); - this.renderWeapons(); + this.outlineCircle4 = this.add + .sprite( + this.cameras.main.width / 2 + 200, + this.cameras.main.height / 2 + 400, + "green_dot_outline" + ) + .setScrollFactor(0) + .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); + this.availableCircles = [ + this.circle1, + this.circle2, + this.circle3, + this.circle4, + ]; + this.events.on("destroy", () => { + this.setTimeouts.map((timeout) => clearTimeout(timeout)); + this.setIntervals.map((interval) => clearInterval(interval)); + }); } + tapTimings: number[] = []; + circleShouldFillIn = 2500; + + allTapTimings = [ + 12.36, 14.86, 17.31, 19.8, 22.26, 24.75, 27.21, 29.7, 32.16, 34.65, + 37.11, 39.6, 42.05, 44.55, 47, 49.5, 51.95, 54.44, 56.9, 59.39, 61.85, + 64.34, 66.8, 69.29, 71.74, 74.24, 76.69, 79.18, 81.64, 84.14, + ]; + availableCircles: Phaser.GameObjects.Sprite[] = []; + currentTapIndex = 0; + resultLabel: Phaser.GameObjects.Text | undefined; + + // update(time: number, delta: number): void { update(): void { + const currentTime = getToneCurrentTime(); + const nextTapTiming = this.allTapTimings[this.currentTapIndex] - 2.5; + if (currentTime >= nextTapTiming) { + console.log("hitting: ", currentTime); + this.currentTapIndex++; + const circleToFill = _.sample(this.availableCircles); + if (circleToFill) { + this.availableCircles = this.availableCircles.filter( + (c) => c !== circleToFill + ); + circleToFill.setInteractive(); + circleToFill.on("pointerdown", () => { + // Add a Label at the center of the screen with scrollFactor 0 + const newCurrentTime = getToneCurrentTime(); + const expectedTapTime = + this.allTapTimings[this.currentTapIndex - 1]; + const difference = expectedTapTime - newCurrentTime; + console.log("difference: ", difference); + const resultText = + difference < 0.5 + ? "Perfect" + : difference < 1 + ? "Good" + : "Miss"; + const resultLabel = this.add + .text( + this.cameras.main.width / 2, + this.cameras.main.height / 2, + resultText, + { + fontSize: `${42 * this.dpr}px`, + color: + resultText === "Perfect" + ? "green" + : resultText === "Good" + ? "yellow" + : "red", + stroke: "rgba(0,0,0,1)", + strokeThickness: 6, + } + ) + .setScrollFactor(0); + resultLabel.setPosition( + resultLabel.x - resultLabel.width / 2, + resultLabel.y - resultLabel.height / 2 + ); + // Destroy the label after 1 second + const timeout = setTimeout(() => { + resultLabel.destroy(); + }, 500); + this.setTimeouts.push(timeout); + circleToFill.removeInteractive(); + }); + // circleToFill.setDisplaySize(0, 0); + // Gradually Increase the radius of the circle to be 80 + // Create a SetInterval + const interval = setInterval(() => { + if (circleToFill) { + const radiuToIncreasePerMs = + this.buttonRadius / (this.circleShouldFillIn / 10); + + circleToFill.setDisplaySize( + circleToFill.displayWidth + + radiuToIncreasePerMs * 2, + circleToFill.displayHeight + + radiuToIncreasePerMs * 2 + ); + } + }, 10); + this.setIntervals.push(interval); + const timeout = setTimeout(() => { + circleToFill.setDisplaySize(0, 0); + this.availableCircles.push(circleToFill); + circleToFill.removeInteractive(); + clearInterval(interval); + }, this.circleShouldFillIn); + this.setTimeouts.push(timeout); + } + } + if (this.damageMultipliyer === 1) { // Highlight level 1 hammer this.level2Hammer?.setScale( - (0.1 / 414) * this.canvasWidth * window.devicePixelRatio + (0.1 / 414) * this.canvasWidth * this.dpr ); this.level1Hammer?.setScale( - (0.2 / 414) * this.canvasWidth * window.devicePixelRatio + (0.2 / 414) * this.canvasWidth * this.dpr ); } else if (this.damageMultipliyer === 1.5) { // Highlight level 2 hammer this.level1Hammer?.setScale( - (0.1 / 414) * this.canvasWidth * window.devicePixelRatio + (0.1 / 414) * this.canvasWidth * this.dpr ); this.level2Hammer?.setScale( - (0.2 / 414) * this.canvasWidth * window.devicePixelRatio + (0.2 / 414) * this.canvasWidth * this.dpr ); } + if (this.isGameOver && this.isResultShown === false) { + // if (this.isResultShown) return; + this.showResult(); + } // if (this.enableMotion && !this.isRotating) // this.background.tilePositionX += 0.08; if (this.marbles.length) { @@ -1480,16 +1557,15 @@ export default class Game extends Phaser.Scene { // Increase size this.currentMarblesSizeIndices[i.toString()]++; this.matter.body.scale(voiceBody, 2, 2); - if (marbleImage) { + if (marbleImage) marbleImage.setDisplaySize( this.marbleRadius * 2, this.marbleRadius * 2 ); - } if (marbleMask) marbleMask.scale = 1; this.heightReducedIndices = this.heightReducedIndices.filter((idx) => idx !== i); - // this.marbleTrailParticles[i].setConfig(this.trailConfig); + this.marbleTrailParticles[i].setConfig(this.trailConfig); } else if ( !isHeightReduced && y > this.reduceSizeScreenOffset[currentCrossIndex] && @@ -1498,20 +1574,19 @@ export default class Game extends Phaser.Scene { // Reduce size this.heightReducedIndices.push(i); this.matter.body.scale(voiceBody, 0.5, 0.5); - if (marbleImage) { + if (marbleImage) marbleImage.setDisplaySize( this.marbleRadius, this.marbleRadius ); - } if (marbleMask) marbleMask.scale = 0.5; - // this.marbleTrailParticles[i].setConfig({ - // ...this.trailConfig, - // scale: { start: 0.5, end: 0.01 }, - // }); + this.marbleTrailParticles[i].setConfig({ + ...this.trailConfig, + scale: { start: 0.5, end: 0.01 }, + }); } } - // TODO: Uncomment this + // TODO: Optimized Code // this.crossRightRotation.map((c) => { // c.setAngle(c.angle + 2); // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); @@ -1521,45 +1596,74 @@ export default class Game extends Phaser.Scene { // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); // }); if (this.isInstrumentPlaying && this.isRotating === false) { - let largest = -Infinity; - let secondLargest = -Infinity; - let largestIndex = -1; + /* + let largest = -Infinity; + let secondLargest = -Infinity; + let largestIndex = -1; + let finishedPositions = []; + let voicesPositions = []; + for (let i = 0; i < this.marbles.length; i++) { + const y = this.marbles[i].position.y; + voicesPositions.push(y); + if (y < this.finishLineOffset) { + finishedPositions.push(y); + if (y > largest) { + secondLargest = largest; + largest = y; + largestIndex = i; + } else if (y > secondLargest) { + secondLargest = y; + } + } + } + */ + const unFinishedPositions = []; + const finishedPositions = []; + const voicesPositions = []; for (let i = 0; i < this.marbles.length; i++) { const y = this.marbles[i].position.y; + voicesPositions.push(y); if (y < this.finishLineOffset) { - if (y > largest) { - secondLargest = largest; - largest = y; - largestIndex = i; - } else if (y > secondLargest) { - secondLargest = y; - } + unFinishedPositions.push(y); + } else if (y > this.finishLineOffset) { + finishedPositions.push(y); } } + // Above is the refactored code + // const voicesPositions = this.marbles.map((m) => m.position.y); + // const unFinishedPositions = voicesPositions.filter( + // (y) => y < this.finishLineOffset + // ); + // const finishedPositions = voicesPositions.filter( + // (y) => y > this.finishLineOffset + // ); - if (largestIndex === -1) return; + if (this.winnerIdx === -1 && finishedPositions.length) { + this.winnerIdx = voicesPositions.indexOf( + finishedPositions[0] + ); + } + const largest = Math.max(...unFinishedPositions); + const largestIndex = voicesPositions.findIndex( + (v) => v === largest + ); + const secondLargest = Math.max( + ...unFinishedPositions.filter((p) => p !== largest) + ); + if (largestIndex === -1) { + this.isGameOver = true; + return; + } if ( this.prevVoiceIdx !== largestIndex && largest > secondLargest + this.marbleRadius - ) { + ) this.throttledUpdate(largestIndex); - // // Remove previous mouth image using this.prevVoiceIdx - // const prevMarbleImage = - // this.marblesImages[this.prevVoiceIdx]; - // const id = this.voices[this.prevVoiceIdx].id; - // if ( - // prevMarbleImage && - // prevMarbleImage.texture.key === `resized_${id}_mouth` - // ) { - // prevMarbleImage.setTexture(`resized_${id}`); - // prevMarbleImage.setDisplaySize(newSize, newSize); - // prevMarbleImage.setOrigin(0.5, 0.5); - // } - } - this.throttledUpdateGif(largestIndex); + // else if (secondLargest >= largest - this.marbleRadius * 2) + // this.throttledUpdate(secondLargestIndex, false); if (this.autoScroll) { - this.cameras.main.scrollY = largest - 300; + this.cameras.main.scrollY = largest - 300 * this.dpr; } } @@ -1629,3 +1733,7 @@ export default class Game extends Phaser.Scene { } } +// !wget -c "https://github.com/CPJKU/beat_this/raw/main/tests/It%20Don't%20Mean%20A%20Thing%20-%20Kings%20of%20Swing.mp3" -O music.mp3 + +// !ffmpeg -i music.mp3 -f segment -segment_time 10 -c copy "music-%03d.mp3" + diff --git a/src/game/scenes/Preloader.ts b/src/game/scenes/Preloader.ts index 9999620..102b8ba 100644 --- a/src/game/scenes/Preloader.ts +++ b/src/game/scenes/Preloader.ts @@ -78,6 +78,11 @@ export default class Preloader extends Phaser.Scene { } preload() { console.log("Preloader..."); + this.load.image("green_dot", "assets/sprite/green_dot.png"); + this.load.image( + "green_dot_outline", + "assets/sprite/green_dot_outline.png" + ); this.load.image("background", this.params.backgroundPath); ObstacleNames.map((name) => { this.load.image( diff --git a/src/hooks/useTonejs.ts b/src/hooks/useTonejs.ts index e46f6ec..16b4bc5 100644 --- a/src/hooks/useTonejs.ts +++ b/src/hooks/useTonejs.ts @@ -98,7 +98,9 @@ const downloadAudioFiles = async ( onProgress(progress); } }; - +const getToneCurrentTime = () => { + return Tone.Transport.seconds; +}; const initializeTone = async () => { if (!isToneInitialized) { isToneInitialized = true; @@ -220,5 +222,6 @@ export { stopPlayer, getToneStatus, stopAndDestroyPlayers, + getToneCurrentTime, }; From 09faeba8b93a4d059441d9c0323f8500e6e64b7d Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Thu, 3 Oct 2024 19:14:24 +0530 Subject: [PATCH 12/22] fix: every other beat --- src/game/scenes/Game.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index c6b9fce..9e6001c 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -1389,9 +1389,12 @@ export default class Game extends Phaser.Scene { circleShouldFillIn = 2500; allTapTimings = [ - 12.36, 14.86, 17.31, 19.8, 22.26, 24.75, 27.21, 29.7, 32.16, 34.65, - 37.11, 39.6, 42.05, 44.55, 47, 49.5, 51.95, 54.44, 56.9, 59.39, 61.85, - 64.34, 66.8, 69.29, 71.74, 74.24, 76.69, 79.18, 81.64, 84.14, + 12.36, 13.61, 14.86, 16.11, 17.31, 18.56, 19.8, 21.05, 22.26, 23.51, + 24.75, 26, 27.21, 28.46, 29.7, 30.95, 32.16, 33.41, 34.65, 35.9, 37.11, + 38.36, 39.6, 40.85, 42.05, 43.3, 44.55, 45.8, 47, 48.25, 49.5, 50.75, + 51.95, 53.2, 54.44, 55.69, 56.9, 58.15, 59.39, 60.64, 61.85, 63.1, + 64.34, 65.59, 66.8, 68.05, 69.29, 70.54, 71.74, 72.99, 74.24, 75.49, + 76.69, 77.94, 79.18, 80.43, 81.64, 82.89, 84.14, ]; availableCircles: Phaser.GameObjects.Sprite[] = []; currentTapIndex = 0; @@ -1403,6 +1406,7 @@ export default class Game extends Phaser.Scene { const nextTapTiming = this.allTapTimings[this.currentTapIndex] - 2.5; if (currentTime >= nextTapTiming) { console.log("hitting: ", currentTime); + const _currentTapIndex = this.currentTapIndex; this.currentTapIndex++; const circleToFill = _.sample(this.availableCircles); if (circleToFill) { @@ -1414,7 +1418,7 @@ export default class Game extends Phaser.Scene { // Add a Label at the center of the screen with scrollFactor 0 const newCurrentTime = getToneCurrentTime(); const expectedTapTime = - this.allTapTimings[this.currentTapIndex - 1]; + this.allTapTimings[_currentTapIndex]; const difference = expectedTapTime - newCurrentTime; console.log("difference: ", difference); const resultText = From 570649f5e24662e3ad3f395c8353f2a556357638 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Mon, 7 Oct 2024 15:29:48 +0530 Subject: [PATCH 13/22] fix: hide and show play buttons --- src/game/scenes/Game.ts | 278 ++++++++++++++++++++++++++++------------ 1 file changed, 194 insertions(+), 84 deletions(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 9e6001c..e6083fe 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -94,6 +94,7 @@ export default class Game extends Phaser.Scene { alpha: 0.5, }; showObstacles: boolean = false; + initialGravity: number = 0; init(data: IGameDataParams) { // Sort the voices randomly @@ -117,6 +118,7 @@ export default class Game extends Phaser.Scene { this.trailConfig.alpha = data.trailsOpacity; this.dpr = window.devicePixelRatio || 2; this.showObstacles = data.showObstacles || false; + this.initialGravity = data.gravityY || 0; } throttledUpdate(index: number, switchOld: boolean = true) { @@ -1302,6 +1304,46 @@ export default class Game extends Phaser.Scene { outlineCircle4: Phaser.GameObjects.Sprite | undefined; setIntervals: NodeJS.Timeout[] = []; setTimeouts: NodeJS.Timeout[] = []; + tapTimings: number[] = []; + circleShouldFillIn = 1250; + // allTapTimings = [ + // 12.36, 13.61, 14.86, 16.11, 17.31, 18.56, 19.8, 21.05, 22.26, 23.51, + // 24.75, 26, 27.21, 28.46, 29.7, 30.95, 32.16, 33.41, 34.65, 35.9, 37.11, + // 38.36, 39.6, 40.85, 42.05, 43.3, 44.55, 45.8, 47, 48.25, 49.5, 50.75, + // 51.95, 53.2, 54.44, 55.69, 56.9, 58.15, 59.39, 60.64, 61.85, 63.1, + // 64.34, 65.59, 66.8, 68.05, 69.29, 70.54, 71.74, 72.99, 74.24, 75.49, + // 76.69, 77.94, 79.18, 80.43, 81.64, 82.89, 84.14, + // ]; + allTapTimings = [ + 12.36, 12.99, 13.61, 14.23, 14.86, 15.46, 16.06, 16.69, 17.31, 17.94, + 18.56, 19.17, 19.8, 20.41, 21.01, 21.64, 22.26, 22.89, 23.51, 24.12, + 24.75, 25.36, 25.96, 26.59, 27.21, 27.84, 28.46, 29.07, 29.7, 30.31, + 30.91, 31.53, 32.16, 32.78, 33.4, 34.02, 34.65, 35.26, 35.85, 36.48, + 37.11, 37.73, 38.35, 38.97, 39.6, 40.2, 40.8, 41.43, 42.05, 42.68, 43.3, + 43.91, 44.55, 45.15, 45.75, 46.38, 47.0, 47.63, 48.25, 48.86, 49.5, + 50.1, 50.7, 51.33, 51.95, 52.58, 53.2, 53.81, 54.44, 55.05, 55.65, + 56.28, 56.9, 57.52, 58.15, 58.76, 59.39, 60.0, 60.6, 61.23, 61.85, + 62.47, 63.09, 63.71, 64.34, 64.95, 65.55, 66.17, 66.8, 67.42, 68.05, + 68.66, 69.29, 69.89, 70.5, 71.12, 71.74, 72.37, 72.99, 73.61, 74.24, + 74.84, 75.44, 76.07, 76.69, 77.31, 77.94, 78.55, 79.18, 79.79, 80.39, + 81.02, 81.64, 82.27, 82.89, 83.51, 84.14, 84.74, 85.34, 85.96, 86.58, + ]; + showTapTimings = [12.36, 29.7, 51.95, 72.99] + .map((startTime) => { + const startIdx = this.allTapTimings.indexOf(startTime); + + return this.allTapTimings.slice(startIdx, startIdx + 7); + }) + .flat(); + currentTapIndex = 0; + + availableCircles: Phaser.GameObjects.Sprite[] = []; + innerCircles: Phaser.GameObjects.Sprite[] = []; + outlineCircles: Phaser.GameObjects.Sprite[] = []; + + resultLabel: Phaser.GameObjects.Text | undefined; + tapScore: number = 0; + isBoosted = false; buttonRadius = 80; @@ -1380,106 +1422,174 @@ export default class Game extends Phaser.Scene { this.circle3, this.circle4, ]; + this.innerCircles = [ + this.circle1, + this.circle2, + this.circle3, + this.circle4, + ]; + this.outlineCircles = [ + this.outlineCircle1, + this.outlineCircle2, + this.outlineCircle3, + this.outlineCircle4, + ]; + [...this.innerCircles, ...this.outlineCircles].map((c) => { + c.setAlpha(0); + }); this.events.on("destroy", () => { this.setTimeouts.map((timeout) => clearTimeout(timeout)); this.setIntervals.map((interval) => clearInterval(interval)); }); } - tapTimings: number[] = []; - circleShouldFillIn = 2500; - allTapTimings = [ - 12.36, 13.61, 14.86, 16.11, 17.31, 18.56, 19.8, 21.05, 22.26, 23.51, - 24.75, 26, 27.21, 28.46, 29.7, 30.95, 32.16, 33.41, 34.65, 35.9, 37.11, - 38.36, 39.6, 40.85, 42.05, 43.3, 44.55, 45.8, 47, 48.25, 49.5, 50.75, - 51.95, 53.2, 54.44, 55.69, 56.9, 58.15, 59.39, 60.64, 61.85, 63.1, - 64.34, 65.59, 66.8, 68.05, 69.29, 70.54, 71.74, 72.99, 74.24, 75.49, - 76.69, 77.94, 79.18, 80.43, 81.64, 82.89, 84.14, - ]; - availableCircles: Phaser.GameObjects.Sprite[] = []; - currentTapIndex = 0; - resultLabel: Phaser.GameObjects.Text | undefined; + hideJoystickButtons() { + this.innerCircles.map((c) => { + c.setAlpha(0); + }); + this.outlineCircles.map((c) => { + c.setAlpha(0); + }); + } + showJoystickButtons() { + this.innerCircles.map((c) => { + c.setAlpha(1); + }); + this.outlineCircles.map((c) => { + c.setAlpha(1); + }); + } // update(time: number, delta: number): void { update(): void { const currentTime = getToneCurrentTime(); - const nextTapTiming = this.allTapTimings[this.currentTapIndex] - 2.5; + const nextTapTiming = + this.showTapTimings[this.currentTapIndex] - + this.circleShouldFillIn / 1000; + if (this.tapScore > 50) { + this.isBoosted = true; + this.tapScore = 0; + this.hideJoystickButtons(); + // this.currentTapIndex = 0; + // alert("Booster"); + this.matter.world.setGravity(0, this.initialGravity * 8); + const boosterLabel = this.add + .text( + this.cameras.main.width / 2, + this.cameras.main.height / 2, + "Boosted", + { + fontSize: `${42 * this.dpr}px`, + color: "white", + stroke: "rgba(0,0,0,1)", + strokeThickness: 6, + } + ) + .setScrollFactor(0); + boosterLabel.setPosition( + boosterLabel.x - boosterLabel.width / 2, + boosterLabel.y - boosterLabel.height / 2 + ); + + setTimeout(() => { + this.matter.world.setGravity(0, this.initialGravity); + boosterLabel.destroy(); + }, 2000); + // setTimeout(() => { + // this.isBoosted = false; + // }, 2000); + } if (currentTime >= nextTapTiming) { - console.log("hitting: ", currentTime); const _currentTapIndex = this.currentTapIndex; this.currentTapIndex++; - const circleToFill = _.sample(this.availableCircles); - if (circleToFill) { - this.availableCircles = this.availableCircles.filter( - (c) => c !== circleToFill - ); - circleToFill.setInteractive(); - circleToFill.on("pointerdown", () => { - // Add a Label at the center of the screen with scrollFactor 0 - const newCurrentTime = getToneCurrentTime(); - const expectedTapTime = - this.allTapTimings[_currentTapIndex]; - const difference = expectedTapTime - newCurrentTime; - console.log("difference: ", difference); - const resultText = - difference < 0.5 - ? "Perfect" - : difference < 1 - ? "Good" - : "Miss"; - const resultLabel = this.add - .text( - this.cameras.main.width / 2, - this.cameras.main.height / 2, - resultText, - { - fontSize: `${42 * this.dpr}px`, - color: - resultText === "Perfect" - ? "green" - : resultText === "Good" - ? "yellow" - : "red", - stroke: "rgba(0,0,0,1)", - strokeThickness: 6, - } - ) - .setScrollFactor(0); - resultLabel.setPosition( - resultLabel.x - resultLabel.width / 2, - resultLabel.y - resultLabel.height / 2 + if (!this.isBoosted) { + this.showJoystickButtons(); + const circleToFill = _.sample(this.availableCircles); + if (circleToFill) { + this.availableCircles = this.availableCircles.filter( + (c) => c !== circleToFill ); - // Destroy the label after 1 second + circleToFill.setInteractive(); + circleToFill.on("pointerdown", () => { + // Add a Label at the center of the screen with scrollFactor 0 + const newCurrentTime = getToneCurrentTime(); + const expectedTapTime = + this.allTapTimings[_currentTapIndex]; + const difference = expectedTapTime - newCurrentTime; + console.log("difference: ", difference); + const resultText = + difference < 0.5 + ? "Perfect" + : difference < 1 + ? "Good" + : "Miss"; + this.tapScore += + resultText === "Perfect" + ? 10 + : resultText === "Good" + ? 5 + : 0; + const resultLabel = this.add + .text( + this.cameras.main.width / 2, + this.cameras.main.height / 2, + resultText, + { + fontSize: `${42 * this.dpr}px`, + color: + resultText === "Perfect" + ? "green" + : resultText === "Good" + ? "yellow" + : "red", + stroke: "rgba(0,0,0,1)", + strokeThickness: 6, + } + ) + .setScrollFactor(0); + resultLabel.setPosition( + resultLabel.x - resultLabel.width / 2, + resultLabel.y - resultLabel.height / 2 + ); + // Destroy the label after 1 second + const timeout = setTimeout(() => { + resultLabel.destroy(); + }, 500); + this.setTimeouts.push(timeout); + circleToFill.off("pointerdown"); + circleToFill.removeInteractive(); + }); + // circleToFill.setDisplaySize(0, 0); + // Gradually Increase the radius of the circle to be 80 + // Create a SetInterval + const interval = setInterval(() => { + if (circleToFill) { + const radiuToIncreasePerMs = + this.buttonRadius / + (this.circleShouldFillIn / 10); + + circleToFill.setDisplaySize( + circleToFill.displayWidth + + radiuToIncreasePerMs * 2, + circleToFill.displayHeight + + radiuToIncreasePerMs * 2 + ); + } + }, 10); + this.setIntervals.push(interval); const timeout = setTimeout(() => { - resultLabel.destroy(); - }, 500); + circleToFill.setDisplaySize(0, 0); + this.availableCircles.push(circleToFill); + circleToFill.removeInteractive(); + clearInterval(interval); + }, this.circleShouldFillIn); this.setTimeouts.push(timeout); - circleToFill.removeInteractive(); - }); - // circleToFill.setDisplaySize(0, 0); - // Gradually Increase the radius of the circle to be 80 - // Create a SetInterval - const interval = setInterval(() => { - if (circleToFill) { - const radiuToIncreasePerMs = - this.buttonRadius / (this.circleShouldFillIn / 10); - - circleToFill.setDisplaySize( - circleToFill.displayWidth + - radiuToIncreasePerMs * 2, - circleToFill.displayHeight + - radiuToIncreasePerMs * 2 - ); - } - }, 10); - this.setIntervals.push(interval); - const timeout = setTimeout(() => { - circleToFill.setDisplaySize(0, 0); - this.availableCircles.push(circleToFill); - circleToFill.removeInteractive(); - clearInterval(interval); - }, this.circleShouldFillIn); - this.setTimeouts.push(timeout); + // } + } + } + if (_currentTapIndex % 7 === 0) { + this.isBoosted = false; + // this.hideJoystickButtons(); } } From e4f6355b9a0d0a4b8d5049ba8615073e53b83ff4 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Thu, 10 Oct 2024 16:41:12 +0530 Subject: [PATCH 14/22] feat: add frame, trail color --- .../sprite/{ => rhythmicpads}/green_dot.png | Bin .../{ => rhythmicpads}/green_dot_outline.png | Bin .../sprite/rhythmicpads/joystick_frame.jpg | Bin 0 -> 131932 bytes src/components/Rows.tsx | 8 + src/game/scenes/Game.ts | 357 ++++++++++++------ src/game/scenes/Preloader.ts | 11 +- 6 files changed, 251 insertions(+), 125 deletions(-) rename public/assets/sprite/{ => rhythmicpads}/green_dot.png (100%) rename public/assets/sprite/{ => rhythmicpads}/green_dot_outline.png (100%) create mode 100644 public/assets/sprite/rhythmicpads/joystick_frame.jpg diff --git a/public/assets/sprite/green_dot.png b/public/assets/sprite/rhythmicpads/green_dot.png similarity index 100% rename from public/assets/sprite/green_dot.png rename to public/assets/sprite/rhythmicpads/green_dot.png diff --git a/public/assets/sprite/green_dot_outline.png b/public/assets/sprite/rhythmicpads/green_dot_outline.png similarity index 100% rename from public/assets/sprite/green_dot_outline.png rename to public/assets/sprite/rhythmicpads/green_dot_outline.png diff --git a/public/assets/sprite/rhythmicpads/joystick_frame.jpg b/public/assets/sprite/rhythmicpads/joystick_frame.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b08cf21a53f78d78fc15b834d544dac0fd5351dc GIT binary patch literal 131932 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

    R>aU{x-}xJDumef6Fjw%h}Ky zM;-E0{ad89b{0S=_l>jlEVf0dKdmu26dc8!8P@{W3tMmJz~LSz zzr^$Dgnm(@RkSiMOQw6<%{-^@+;7#aMBP6WRQ>v;@3xzHUg1TbGhQfRLLi;6Dm~He z4|UbRei^%$&Ag!S!jF|;$D6=c;u{l=3qUn3J#n+&s%nK7MKg)#q%zf2p`4&(L?k>& zC4f?r4uAsmCy2xUIE5^QtPF26^4oQ^&@pD;H#yxF&EoAKQSZRNt|;A7UutoP%~=gq-z!gwS;6&6wHHlRm9GqIUK1)}q}NeOd*Mr=#mH+SrQVH zXXw=(f!}LIJ{9BF?nBoNJqH6a1QC95k}#kYdZG|T84W@>z1$TrS2QjP45YGn;f2L2 z)v;6K{g*@Bjy;en9Iw6q@<})odtbgnPHp}4orSKZYT5B8VexaH%*L(Sk=s&?8>Xyo P+5FR&Hj%8SZ7==@7NhmH literal 0 HcmV?d00001 diff --git a/src/components/Rows.tsx b/src/components/Rows.tsx index ed772cc..ef4e9b1 100644 --- a/src/components/Rows.tsx +++ b/src/components/Rows.tsx @@ -20,6 +20,7 @@ import { orderBy, DocumentData, QuerySnapshot, + documentId, } from "firebase/firestore"; import { useEffect, useState } from "react"; import { useCollection } from "react-firebase-hooks/firestore"; @@ -30,6 +31,13 @@ import Settings from "@mui/icons-material/Settings"; import { createRandomNumber } from "../helpers"; const getRowsQuery = (recordsLimit: number, isLatest: boolean) => { + return query( + collection(db, "covers"), + where(documentId(), "in", [ + "lsUBEcaYfOidpvjUxpz1", + "YE7LMzWbCKgkLgSKVX9Q", + ]) + ); if (isLatest) { return query( collection(db, "covers"), diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index e6083fe..23c54f0 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -915,7 +915,6 @@ export default class Game extends Phaser.Scene { this.largeCircle.setScale( (this.canvasWidth / this.largeCircle.width) * this.dpr ); - // .setScale(0.8); const xOffsetValues = [ this.centerX - 46, this.centerX + 23, @@ -938,6 +937,7 @@ export default class Game extends Phaser.Scene { friction: 0, frictionAir: 0, frictionStatic: 0, + label: v.id, } ); this.marbles.push(circleBody); @@ -953,11 +953,13 @@ export default class Game extends Phaser.Scene { // this.trailGraphics.push(this.add.graphics()); // this.trailPoints.push([]); // // Create an image and attach it to the circle body - const circleImage = this.add.image( - circleBody.position.x, - circleBody.position.y, - `resized_${v.id}` - ); + const circleImage = this.add + .image( + circleBody.position.x, + circleBody.position.y, + `resized_${v.id}` + ) + .setDepth(1); circleImage.setDisplaySize(marbleRadius * 2, marbleRadius * 2); circleImage.setOrigin(0.5, 0.5); // Circle mask @@ -1280,6 +1282,7 @@ export default class Game extends Phaser.Scene { this.isRotating = false; this.countdownText.destroy(); clock.destroy(); + this.cameras.main.startFollow(this.marblesImages[0]); } } }, @@ -1345,22 +1348,27 @@ export default class Game extends Phaser.Scene { tapScore: number = 0; isBoosted = false; - buttonRadius = 80; + buttonRadius = 60; + joystickHolder: Phaser.GameObjects.Container | undefined; + joystickFrame: Phaser.GameObjects.Image | undefined; renderJoystickButtons() { + let circleYOffset = this.cameras.main.height / 2 + 360; + // .image(0, 0, "joystick_frame") + // .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); this.circle1 = this.add .sprite( this.cameras.main.width / 2 - 200, - this.cameras.main.height / 2 + 200, + circleYOffset, "green_dot" ) - .setDisplaySize(10, 10) + .setDisplaySize(0, 0) .setScrollFactor(0); this.outlineCircle1 = this.add .sprite( this.cameras.main.width / 2 - 200, - this.cameras.main.height / 2 + 200, + circleYOffset, "green_dot_outline" ) .setScrollFactor(0) @@ -1368,50 +1376,51 @@ export default class Game extends Phaser.Scene { this.circle2 = this.add .sprite( this.cameras.main.width / 2 + 200, - this.cameras.main.height / 2 + 200, + circleYOffset, "green_dot" ) - .setDisplaySize(10, 10) + .setDisplaySize(0, 0) .setScrollFactor(0); this.outlineCircle2 = this.add .sprite( this.cameras.main.width / 2 + 200, - this.cameras.main.height / 2 + 200, + circleYOffset, "green_dot_outline" ) .setScrollFactor(0) .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); + circleYOffset += 150; this.circle3 = this.add .sprite( - this.cameras.main.width / 2 - 200, - this.cameras.main.height / 2 + 400, + this.cameras.main.width / 2 - 100, + circleYOffset, "green_dot" ) - .setDisplaySize(10, 10) + .setDisplaySize(0, 0) .setScrollFactor(0); this.outlineCircle3 = this.add .sprite( - this.cameras.main.width / 2 - 200, - this.cameras.main.height / 2 + 400, + this.cameras.main.width / 2 - 100, + circleYOffset, "green_dot_outline" ) .setScrollFactor(0) .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); this.circle4 = this.add .sprite( - this.cameras.main.width / 2 + 200, - this.cameras.main.height / 2 + 400, + this.cameras.main.width / 2 + 100, + circleYOffset, "green_dot" ) - .setDisplaySize(10, 10) + .setDisplaySize(0, 0) .setScrollFactor(0); this.outlineCircle4 = this.add .sprite( - this.cameras.main.width / 2 + 200, - this.cameras.main.height / 2 + 400, + this.cameras.main.width / 2 + 100, + circleYOffset, "green_dot_outline" ) .setScrollFactor(0) @@ -1434,13 +1443,51 @@ export default class Game extends Phaser.Scene { this.outlineCircle3, this.outlineCircle4, ]; + const fxs = this.outlineCircles.map((c) => { + c.preFX?.setPadding(32); + return c.preFX?.addGlow(0xffffff, 0, 0, true, 0.1, 32); + }); + this.tweens.add({ + targets: fxs, + outerStrength: 10, + }); [...this.innerCircles, ...this.outlineCircles].map((c) => { + c.setDepth(10); c.setAlpha(0); }); this.events.on("destroy", () => { this.setTimeouts.map((timeout) => clearTimeout(timeout)); this.setIntervals.map((interval) => clearInterval(interval)); }); + const frameHeight = this.cameras.main.height / 3; + this.joystickFrame = this.add + .image( + this.cameras.main.width / 2, + this.cameras.main.height / 2 + frameHeight, + "joystick_frame" + ) + .setDepth(9) + .setScrollFactor(0) + .setDisplaySize(this.cameras.main.width, frameHeight) + .setAlpha(0); + // this.joystickHolder = this.add + // .container( + // this.cameras.main.width / 2, + // this.cameras.main.height / 2 + frameHeight, + // [ + // this.circle1, + // this.outlineCircle1, + // this.circle2, + // this.outlineCircle2, + // this.circle3, + // this.outlineCircle3, + // this.circle4, + // this.outlineCircle4, + // ] + // ) + // .setDepth(999999) + // .setDisplaySize(this.cameras.main.width, frameHeight) + // .setScrollFactor(0); } hideJoystickButtons() { @@ -1450,6 +1497,10 @@ export default class Game extends Phaser.Scene { this.outlineCircles.map((c) => { c.setAlpha(0); }); + this.innerCircles.map((c) => { + c.removeListener("pointerdown"); + }); + this.joystickFrame?.setAlpha(0); } showJoystickButtons() { this.innerCircles.map((c) => { @@ -1458,22 +1509,47 @@ export default class Game extends Phaser.Scene { this.outlineCircles.map((c) => { c.setAlpha(1); }); + this.joystickFrame?.setAlpha(1); } - + boostMultipler: number = 0; + tapResultLabel: Phaser.GameObjects.Text | undefined; + tapResultLabelTimer: NodeJS.Timeout | undefined; // update(time: number, delta: number): void { update(): void { const currentTime = getToneCurrentTime(); const nextTapTiming = this.showTapTimings[this.currentTapIndex] - this.circleShouldFillIn / 1000; - if (this.tapScore > 50) { + + if (this.tapScore >= 40) { this.isBoosted = true; + this.boostMultipler = this.marbles[0].velocity.y; + // this.marbleTrailParticles[0].setConfig({ + // color: [0xfacc22, 0xf89800, 0xf83600, 0x9f0404], + // colorEase: "quad.out", + // lifespan: 2400, + // angle: { min: -100, max: -80 }, + // // scale: { start: 1, end: 0, ease: "sine.out" }, + // scale: this.marbleTrailParticles[0].scale, + // speed: { min: 250, max: 350 }, + // advance: 2000, + // blendMode: "ADD", + // follow: this.marbles[0].position, + // }); + this.marbleTrailParticles[0].setConfig({ + color: [0xfacc22, 0xf89800, 0xf83600, 0x9f0404], + colorEase: "quad.out", + lifespan: 2400, + angle: { min: -100, max: -80 }, + scale: { start: 1, end: 0, ease: "sine.out" }, + speed: { min: 250, max: 350 }, + advance: 2000, + blendMode: "ADD", + }); this.tapScore = 0; this.hideJoystickButtons(); - // this.currentTapIndex = 0; - // alert("Booster"); - this.matter.world.setGravity(0, this.initialGravity * 8); - const boosterLabel = this.add + this.tapResultLabel?.destroy(); + this.tapResultLabel = this.add .text( this.cameras.main.width / 2, this.cameras.main.height / 2, @@ -1483,24 +1559,25 @@ export default class Game extends Phaser.Scene { color: "white", stroke: "rgba(0,0,0,1)", strokeThickness: 6, + backgroundColor: "rgba(0,0,0,1)", } ) .setScrollFactor(0); - boosterLabel.setPosition( - boosterLabel.x - boosterLabel.width / 2, - boosterLabel.y - boosterLabel.height / 2 + this.tapResultLabel?.setPosition( + this.tapResultLabel.x - this.tapResultLabel.width / 2, + this.tapResultLabel.y - this.tapResultLabel.height / 2 ); - - setTimeout(() => { - this.matter.world.setGravity(0, this.initialGravity); - boosterLabel.destroy(); + if (this.tapResultLabelTimer) { + clearTimeout(this.tapResultLabelTimer); + } + this.tapResultLabelTimer = setTimeout(() => { + // this.matter.world.setGravity(0, this.initialGravity); + this.tapResultLabel?.destroy(); }, 2000); - // setTimeout(() => { - // this.isBoosted = false; - // }, 2000); } if (currentTime >= nextTapTiming) { const _currentTapIndex = this.currentTapIndex; + // console.log("Current Tap Idx: ", _currentTapIndex); this.currentTapIndex++; if (!this.isBoosted) { this.showJoystickButtons(); @@ -1510,13 +1587,16 @@ export default class Game extends Phaser.Scene { (c) => c !== circleToFill ); circleToFill.setInteractive(); - circleToFill.on("pointerdown", () => { + circleToFill.once("pointerdown", () => { + // Hide the Circle + circleToFill.setDisplaySize(0, 0); + circleToFill.setAlpha(0); // Add a Label at the center of the screen with scrollFactor 0 const newCurrentTime = getToneCurrentTime(); const expectedTapTime = this.allTapTimings[_currentTapIndex]; const difference = expectedTapTime - newCurrentTime; - console.log("difference: ", difference); + const resultText = difference < 0.5 ? "Perfect" @@ -1529,7 +1609,8 @@ export default class Game extends Phaser.Scene { : resultText === "Good" ? 5 : 0; - const resultLabel = this.add + this.tapResultLabel?.destroy(); + this.tapResultLabel = this.add .text( this.cameras.main.width / 2, this.cameras.main.height / 2, @@ -1544,22 +1625,26 @@ export default class Game extends Phaser.Scene { : "red", stroke: "rgba(0,0,0,1)", strokeThickness: 6, + backgroundColor: "rgba(0,0,0,1)", } ) .setScrollFactor(0); - resultLabel.setPosition( - resultLabel.x - resultLabel.width / 2, - resultLabel.y - resultLabel.height / 2 + this.tapResultLabel.setPosition( + this.tapResultLabel.x - + this.tapResultLabel.width / 2, + this.tapResultLabel.y - + this.tapResultLabel.height / 2 ); + if (this.tapResultLabelTimer) { + clearTimeout(this.tapResultLabelTimer); + } // Destroy the label after 1 second - const timeout = setTimeout(() => { - resultLabel.destroy(); + this.tapResultLabelTimer = setTimeout(() => { + this.tapResultLabel?.destroy(); }, 500); - this.setTimeouts.push(timeout); - circleToFill.off("pointerdown"); circleToFill.removeInteractive(); + this.availableCircles.push(circleToFill); }); - // circleToFill.setDisplaySize(0, 0); // Gradually Increase the radius of the circle to be 80 // Create a SetInterval const interval = setInterval(() => { @@ -1587,10 +1672,35 @@ export default class Game extends Phaser.Scene { // } } } - if (_currentTapIndex % 7 === 0) { - this.isBoosted = false; - // this.hideJoystickButtons(); - } + // if (_currentTapIndex % 7 === 0) { + // console.log("Test: ", _currentTapIndex); + // // this.isBoosted = false; + // // this.marbleTrailParticles[0].setConfig({ + // // ...this.trailConfig, + // // scale: this.marbleTrailParticles[0].scale, + // // follow: this.marbles[0].position, + // // }); + // // this.marbleTrailParticles[0].destroy(); + // // this.hideJoystickButtons(); + // } + } + if (this.isBoosted && this.boostMultipler < 20) { + const firstMarble = this.marbles[0]; // TODO: User chosen marble + this.matter.body.setVelocity(firstMarble, { + x: firstMarble.velocity.x, + y: this.boostMultipler, + }); + this.boostMultipler += 0.1; + } else if (this.boostMultipler >= 20) { + this.isBoosted = false; + this.boostMultipler = 0; + this.marbleTrailParticles[0].destroy(); + this.marbleTrailParticles[0] = this.add + .particles(0, 0, "trail", { + ...this.trailConfig, + follow: this.marbles[0].position, + }) + .setDepth(0); } if (this.damageMultipliyer === 1) { @@ -1709,77 +1819,78 @@ export default class Game extends Phaser.Scene { // c.setAngle(c.angle - 2); // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); // }); - if (this.isInstrumentPlaying && this.isRotating === false) { - /* - let largest = -Infinity; - let secondLargest = -Infinity; - let largestIndex = -1; - let finishedPositions = []; - let voicesPositions = []; + // if (this.isInstrumentPlaying && this.isRotating === false) { + // /* + // let largest = -Infinity; + // let secondLargest = -Infinity; + // let largestIndex = -1; + // let finishedPositions = []; + // let voicesPositions = []; - for (let i = 0; i < this.marbles.length; i++) { - const y = this.marbles[i].position.y; - voicesPositions.push(y); - if (y < this.finishLineOffset) { - finishedPositions.push(y); - if (y > largest) { - secondLargest = largest; - largest = y; - largestIndex = i; - } else if (y > secondLargest) { - secondLargest = y; - } - } - } - */ - const unFinishedPositions = []; - const finishedPositions = []; - const voicesPositions = []; - for (let i = 0; i < this.marbles.length; i++) { - const y = this.marbles[i].position.y; - voicesPositions.push(y); - if (y < this.finishLineOffset) { - unFinishedPositions.push(y); - } else if (y > this.finishLineOffset) { - finishedPositions.push(y); - } - } - // Above is the refactored code - // const voicesPositions = this.marbles.map((m) => m.position.y); - // const unFinishedPositions = voicesPositions.filter( - // (y) => y < this.finishLineOffset - // ); - // const finishedPositions = voicesPositions.filter( - // (y) => y > this.finishLineOffset - // ); + // for (let i = 0; i < this.marbles.length; i++) { + // const y = this.marbles[i].position.y; + // voicesPositions.push(y); + // if (y < this.finishLineOffset) { + // finishedPositions.push(y); + // if (y > largest) { + // secondLargest = largest; + // largest = y; + // largestIndex = i; + // } else if (y > secondLargest) { + // secondLargest = y; + // } + // } + // } + // */ + // const unFinishedPositions = []; + // const finishedPositions = []; + // const voicesPositions = []; + // for (let i = 0; i < this.marbles.length; i++) { + // const y = this.marbles[i].position.y; + // voicesPositions.push(y); + // if (y < this.finishLineOffset) { + // unFinishedPositions.push(y); + // } else if (y > this.finishLineOffset) { + // finishedPositions.push(y); + // } + // } + // // Above is the refactored code + // // const voicesPositions = this.marbles.map((m) => m.position.y); + // // const unFinishedPositions = voicesPositions.filter( + // // (y) => y < this.finishLineOffset + // // ); + // // const finishedPositions = voicesPositions.filter( + // // (y) => y > this.finishLineOffset + // // ); - if (this.winnerIdx === -1 && finishedPositions.length) { - this.winnerIdx = voicesPositions.indexOf( - finishedPositions[0] - ); - } - const largest = Math.max(...unFinishedPositions); - const largestIndex = voicesPositions.findIndex( - (v) => v === largest - ); - const secondLargest = Math.max( - ...unFinishedPositions.filter((p) => p !== largest) - ); - if (largestIndex === -1) { - this.isGameOver = true; - return; - } - if ( - this.prevVoiceIdx !== largestIndex && - largest > secondLargest + this.marbleRadius - ) - this.throttledUpdate(largestIndex); - // else if (secondLargest >= largest - this.marbleRadius * 2) - // this.throttledUpdate(secondLargestIndex, false); - if (this.autoScroll) { - this.cameras.main.scrollY = largest - 300 * this.dpr; - } - } + // if (this.winnerIdx === -1 && finishedPositions.length) { + // this.winnerIdx = voicesPositions.indexOf( + // finishedPositions[0] + // ); + // } + // const largest = Math.max(...unFinishedPositions); + // const largestIndex = voicesPositions.findIndex( + // (v) => v === largest + // ); + // const secondLargest = Math.max( + // ...unFinishedPositions.filter((p) => p !== largest) + // ); + // if (largestIndex === -1) { + // this.isGameOver = true; + // return; + // } + // if ( + // this.prevVoiceIdx !== largestIndex && + // largest > secondLargest + this.marbleRadius + // ) + // this.throttledUpdate(largestIndex); + // // else if (secondLargest >= largest - this.marbleRadius * 2) + // // this.throttledUpdate(secondLargestIndex, false); + // if (this.autoScroll) { + // // this.cameras.main.startFollow(this.marblesImages[0]); + // // this.cameras.main.scrollY = largest - 300 * this.dpr; + // } + // } // Optimised Code // let largest = -Infinity; diff --git a/src/game/scenes/Preloader.ts b/src/game/scenes/Preloader.ts index 102b8ba..7fd8e60 100644 --- a/src/game/scenes/Preloader.ts +++ b/src/game/scenes/Preloader.ts @@ -78,10 +78,17 @@ export default class Preloader extends Phaser.Scene { } preload() { console.log("Preloader..."); - this.load.image("green_dot", "assets/sprite/green_dot.png"); + this.load.image( + "green_dot", + "assets/sprite/rhythmicpads/green_dot.png" + ); this.load.image( "green_dot_outline", - "assets/sprite/green_dot_outline.png" + "assets/sprite/rhythmicpads/green_dot_outline.png" + ); + this.load.image( + "joystick_frame", + "assets/sprite/rhythmicpads/joystick_frame.jpg" ); this.load.image("background", this.params.backgroundPath); ObstacleNames.map((name) => { From a26d9a445539db8847dd6284577571e38dcff4d7 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Thu, 10 Oct 2024 19:37:04 +0530 Subject: [PATCH 15/22] fix: beats arrangements --- src/game/scenes/Game.ts | 242 +++++++++++++++++++--------------------- src/helpers/index.ts | 132 ++++++++++++++++++++++ 2 files changed, 245 insertions(+), 129 deletions(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 23c54f0..bf38042 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -7,10 +7,13 @@ import { import _ from "lodash"; import { GameVoiceInfo, ObstacleNames } from "./Preloader"; import { BodyType } from "matter"; -import { duplicateArrayElemToN } from "../../helpers"; +import { + createBeatsGroupWithInterval, + duplicateArrayElemToN, + getBeatsArray, +} from "../../helpers"; import { EventBus } from "../EventBus"; import { IGameDataParams } from "../PhaserGame"; -import { Circle } from "@mui/icons-material"; export default class Game extends Phaser.Scene { constructor() { @@ -102,6 +105,19 @@ export default class Game extends Phaser.Scene { // .sort(() => Math.random() - 0.5); this.coverDocId = data.coverDocId; this.musicStartOffset = data.musicStartOffset; + this.allTapTimings = getBeatsArray( + this.coverDocId, + this.musicStartOffset + ); + this.circleShouldFillInMs = + (this.allTapTimings[1] - this.allTapTimings[0]) * 1000; + this.showTapTimings = createBeatsGroupWithInterval( + this.allTapTimings, + this.beatsGroupLength, + 4, + 12 + ); + this.noOfRaceTracks = data.noOfRaceTracks || 5; this.selectedTracks = duplicateArrayElemToN( data.selectedTracks, @@ -1308,37 +1324,11 @@ export default class Game extends Phaser.Scene { setIntervals: NodeJS.Timeout[] = []; setTimeouts: NodeJS.Timeout[] = []; tapTimings: number[] = []; - circleShouldFillIn = 1250; - // allTapTimings = [ - // 12.36, 13.61, 14.86, 16.11, 17.31, 18.56, 19.8, 21.05, 22.26, 23.51, - // 24.75, 26, 27.21, 28.46, 29.7, 30.95, 32.16, 33.41, 34.65, 35.9, 37.11, - // 38.36, 39.6, 40.85, 42.05, 43.3, 44.55, 45.8, 47, 48.25, 49.5, 50.75, - // 51.95, 53.2, 54.44, 55.69, 56.9, 58.15, 59.39, 60.64, 61.85, 63.1, - // 64.34, 65.59, 66.8, 68.05, 69.29, 70.54, 71.74, 72.99, 74.24, 75.49, - // 76.69, 77.94, 79.18, 80.43, 81.64, 82.89, 84.14, - // ]; - allTapTimings = [ - 12.36, 12.99, 13.61, 14.23, 14.86, 15.46, 16.06, 16.69, 17.31, 17.94, - 18.56, 19.17, 19.8, 20.41, 21.01, 21.64, 22.26, 22.89, 23.51, 24.12, - 24.75, 25.36, 25.96, 26.59, 27.21, 27.84, 28.46, 29.07, 29.7, 30.31, - 30.91, 31.53, 32.16, 32.78, 33.4, 34.02, 34.65, 35.26, 35.85, 36.48, - 37.11, 37.73, 38.35, 38.97, 39.6, 40.2, 40.8, 41.43, 42.05, 42.68, 43.3, - 43.91, 44.55, 45.15, 45.75, 46.38, 47.0, 47.63, 48.25, 48.86, 49.5, - 50.1, 50.7, 51.33, 51.95, 52.58, 53.2, 53.81, 54.44, 55.05, 55.65, - 56.28, 56.9, 57.52, 58.15, 58.76, 59.39, 60.0, 60.6, 61.23, 61.85, - 62.47, 63.09, 63.71, 64.34, 64.95, 65.55, 66.17, 66.8, 67.42, 68.05, - 68.66, 69.29, 69.89, 70.5, 71.12, 71.74, 72.37, 72.99, 73.61, 74.24, - 74.84, 75.44, 76.07, 76.69, 77.31, 77.94, 78.55, 79.18, 79.79, 80.39, - 81.02, 81.64, 82.27, 82.89, 83.51, 84.14, 84.74, 85.34, 85.96, 86.58, - ]; - showTapTimings = [12.36, 29.7, 51.95, 72.99] - .map((startTime) => { - const startIdx = this.allTapTimings.indexOf(startTime); - - return this.allTapTimings.slice(startIdx, startIdx + 7); - }) - .flat(); + allTapTimings: number[] = []; + circleShouldFillInMs = 0; + showTapTimings: number[] = []; currentTapIndex = 0; + beatsGroupLength = 8; availableCircles: Phaser.GameObjects.Sprite[] = []; innerCircles: Phaser.GameObjects.Sprite[] = []; @@ -1489,8 +1479,10 @@ export default class Game extends Phaser.Scene { // .setDisplaySize(this.cameras.main.width, frameHeight) // .setScrollFactor(0); } + isJoystickButtonsShown = false; hideJoystickButtons() { + this.isJoystickButtonsShown = false; this.innerCircles.map((c) => { c.setAlpha(0); }); @@ -1503,6 +1495,7 @@ export default class Game extends Phaser.Scene { this.joystickFrame?.setAlpha(0); } showJoystickButtons() { + this.isJoystickButtonsShown = true; this.innerCircles.map((c) => { c.setAlpha(1); }); @@ -1519,23 +1512,11 @@ export default class Game extends Phaser.Scene { const currentTime = getToneCurrentTime(); const nextTapTiming = this.showTapTimings[this.currentTapIndex] - - this.circleShouldFillIn / 1000; + this.circleShouldFillInMs / 1000; if (this.tapScore >= 40) { this.isBoosted = true; this.boostMultipler = this.marbles[0].velocity.y; - // this.marbleTrailParticles[0].setConfig({ - // color: [0xfacc22, 0xf89800, 0xf83600, 0x9f0404], - // colorEase: "quad.out", - // lifespan: 2400, - // angle: { min: -100, max: -80 }, - // // scale: { start: 1, end: 0, ease: "sine.out" }, - // scale: this.marbleTrailParticles[0].scale, - // speed: { min: 250, max: 350 }, - // advance: 2000, - // blendMode: "ADD", - // follow: this.marbles[0].position, - // }); this.marbleTrailParticles[0].setConfig({ color: [0xfacc22, 0xf89800, 0xf83600, 0x9f0404], colorEase: "quad.out", @@ -1575,8 +1556,8 @@ export default class Game extends Phaser.Scene { this.tapResultLabel?.destroy(); }, 2000); } + const _currentTapIndex = this.currentTapIndex; if (currentTime >= nextTapTiming) { - const _currentTapIndex = this.currentTapIndex; // console.log("Current Tap Idx: ", _currentTapIndex); this.currentTapIndex++; if (!this.isBoosted) { @@ -1651,7 +1632,7 @@ export default class Game extends Phaser.Scene { if (circleToFill) { const radiuToIncreasePerMs = this.buttonRadius / - (this.circleShouldFillIn / 10); + (this.circleShouldFillInMs / 10); circleToFill.setDisplaySize( circleToFill.displayWidth + @@ -1667,22 +1648,25 @@ export default class Game extends Phaser.Scene { this.availableCircles.push(circleToFill); circleToFill.removeInteractive(); clearInterval(interval); - }, this.circleShouldFillIn); + }, this.circleShouldFillInMs); this.setTimeouts.push(timeout); // } } } - // if (_currentTapIndex % 7 === 0) { - // console.log("Test: ", _currentTapIndex); - // // this.isBoosted = false; - // // this.marbleTrailParticles[0].setConfig({ - // // ...this.trailConfig, - // // scale: this.marbleTrailParticles[0].scale, - // // follow: this.marbles[0].position, - // // }); - // // this.marbleTrailParticles[0].destroy(); - // // this.hideJoystickButtons(); - // } + } + if ( + _currentTapIndex && + _currentTapIndex % this.beatsGroupLength === 0 && + this.isJoystickButtonsShown + ) { + // this.isBoosted = false; + // this.marbleTrailParticles[0].setConfig({ + // ...this.trailConfig, + // scale: this.marbleTrailParticles[0].scale, + // follow: this.marbles[0].position, + // }); + // this.marbleTrailParticles[0].destroy(); + this.hideJoystickButtons(); } if (this.isBoosted && this.boostMultipler < 20) { const firstMarble = this.marbles[0]; // TODO: User chosen marble @@ -1819,78 +1803,78 @@ export default class Game extends Phaser.Scene { // c.setAngle(c.angle - 2); // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); // }); - // if (this.isInstrumentPlaying && this.isRotating === false) { - // /* - // let largest = -Infinity; - // let secondLargest = -Infinity; - // let largestIndex = -1; - // let finishedPositions = []; - // let voicesPositions = []; + if (this.isInstrumentPlaying && this.isRotating === false) { + // /* + // let largest = -Infinity; + // let secondLargest = -Infinity; + // let largestIndex = -1; + // let finishedPositions = []; + // let voicesPositions = []; - // for (let i = 0; i < this.marbles.length; i++) { - // const y = this.marbles[i].position.y; - // voicesPositions.push(y); - // if (y < this.finishLineOffset) { - // finishedPositions.push(y); - // if (y > largest) { - // secondLargest = largest; - // largest = y; - // largestIndex = i; - // } else if (y > secondLargest) { - // secondLargest = y; - // } - // } - // } - // */ - // const unFinishedPositions = []; - // const finishedPositions = []; - // const voicesPositions = []; - // for (let i = 0; i < this.marbles.length; i++) { - // const y = this.marbles[i].position.y; - // voicesPositions.push(y); - // if (y < this.finishLineOffset) { - // unFinishedPositions.push(y); - // } else if (y > this.finishLineOffset) { - // finishedPositions.push(y); - // } - // } - // // Above is the refactored code - // // const voicesPositions = this.marbles.map((m) => m.position.y); - // // const unFinishedPositions = voicesPositions.filter( - // // (y) => y < this.finishLineOffset - // // ); - // // const finishedPositions = voicesPositions.filter( - // // (y) => y > this.finishLineOffset - // // ); + // for (let i = 0; i < this.marbles.length; i++) { + // const y = this.marbles[i].position.y; + // voicesPositions.push(y); + // if (y < this.finishLineOffset) { + // finishedPositions.push(y); + // if (y > largest) { + // secondLargest = largest; + // largest = y; + // largestIndex = i; + // } else if (y > secondLargest) { + // secondLargest = y; + // } + // } + // } + // */ + const unFinishedPositions = []; + const finishedPositions = []; + const voicesPositions = []; + for (let i = 0; i < this.marbles.length; i++) { + const y = this.marbles[i].position.y; + voicesPositions.push(y); + if (y < this.finishLineOffset) { + unFinishedPositions.push(y); + } else if (y > this.finishLineOffset) { + finishedPositions.push(y); + } + } + // Above is the refactored code + // const voicesPositions = this.marbles.map((m) => m.position.y); + // const unFinishedPositions = voicesPositions.filter( + // (y) => y < this.finishLineOffset + // ); + // const finishedPositions = voicesPositions.filter( + // (y) => y > this.finishLineOffset + // ); - // if (this.winnerIdx === -1 && finishedPositions.length) { - // this.winnerIdx = voicesPositions.indexOf( - // finishedPositions[0] - // ); - // } - // const largest = Math.max(...unFinishedPositions); - // const largestIndex = voicesPositions.findIndex( - // (v) => v === largest - // ); - // const secondLargest = Math.max( - // ...unFinishedPositions.filter((p) => p !== largest) - // ); - // if (largestIndex === -1) { - // this.isGameOver = true; - // return; - // } - // if ( - // this.prevVoiceIdx !== largestIndex && - // largest > secondLargest + this.marbleRadius - // ) - // this.throttledUpdate(largestIndex); - // // else if (secondLargest >= largest - this.marbleRadius * 2) - // // this.throttledUpdate(secondLargestIndex, false); - // if (this.autoScroll) { - // // this.cameras.main.startFollow(this.marblesImages[0]); - // // this.cameras.main.scrollY = largest - 300 * this.dpr; - // } - // } + if (this.winnerIdx === -1 && finishedPositions.length) { + this.winnerIdx = voicesPositions.indexOf( + finishedPositions[0] + ); + } + const largest = Math.max(...unFinishedPositions); + const largestIndex = voicesPositions.findIndex( + (v) => v === largest + ); + const secondLargest = Math.max( + ...unFinishedPositions.filter((p) => p !== largest) + ); + if (largestIndex === -1) { + this.isGameOver = true; + return; + } + if ( + this.prevVoiceIdx !== largestIndex && + largest > secondLargest + this.marbleRadius + ) + this.throttledUpdate(largestIndex); + // else if (secondLargest >= largest - this.marbleRadius * 2) + // this.throttledUpdate(secondLargestIndex, false); + if (this.autoScroll) { + // this.cameras.main.startFollow(this.marblesImages[0]); + // this.cameras.main.scrollY = largest - 300 * this.dpr; + } + } // Optimised Code // let largest = -Infinity; diff --git a/src/helpers/index.ts b/src/helpers/index.ts index 8212239..b61c507 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -246,3 +246,135 @@ export const duplicateArrayElemToN = ( return result.sort(() => Math.random() - 0.5); }; +export const getBeatsArray = (id: string, startOffset: number): number[] => { + let beatsArray: number[] = []; + if (id === "lsUBEcaYfOidpvjUxpz1") { + // welcome to the internet + beatsArray = [ + 0.84, 1.32, 1.82, 2.08, 2.32, 2.56, 2.78, 3.04, 3.26, 3.52, 3.74, + 3.98, 4.24, 4.48, 4.72, 4.96, 5.2, 5.44, 5.68, 5.92, 6.16, 6.4, + 6.64, 6.88, 7.12, 7.36, 7.6, 7.82, 8.06, 8.3, 8.54, 8.8, 9.02, 9.26, + 9.5, 9.74, 10.0, 10.24, 10.48, 10.72, 10.96, 11.2, 11.44, 11.68, + 11.92, 12.16, 12.4, 12.64, 12.88, 13.1, 13.36, 13.6, 13.82, 14.08, + 14.32, 14.56, 14.8, 15.06, 15.28, 15.54, 15.76, 16.24, 16.46, 16.7, + 16.96, 17.2, 17.44, 17.68, 17.92, 18.16, 18.4, 18.62, 18.88, 19.12, + 19.36, 19.6, 19.84, 20.08, 20.3, 20.54, 20.8, 21.02, 21.28, 21.52, + 21.76, 22.0, 22.24, 22.46, 22.7, 22.96, 23.18, 23.44, 23.68, 23.92, + 24.14, 24.38, 24.62, 24.86, 25.1, 25.34, 25.6, 25.84, 26.08, 26.32, + 26.56, 26.82, 27.04, 27.28, 27.52, 27.76, 28.0, 28.22, 28.46, 28.7, + 28.94, 29.2, 29.44, 29.68, 30.16, 30.64, 31.1, 31.58, 32.06, 32.54, + 33.04, 33.52, 33.98, 34.46, 34.94, 35.42, 35.9, 36.38, 36.86, 37.34, + 37.82, 38.3, 38.78, 39.28, 39.76, 40.24, 40.72, 41.2, 41.68, 42.16, + 42.64, 43.12, 43.58, 44.06, 44.56, 45.04, 45.52, 46.0, 46.48, 46.94, + 47.42, 47.9, 48.38, 48.86, 49.34, 49.8, 50.28, 50.76, 51.22, 51.68, + 52.14, 52.62, 53.08, 53.54, 54.02, 54.48, 54.92, 55.38, 55.84, 56.3, + 56.74, 57.2, 57.64, 58.1, 58.56, 59.0, 59.48, 59.82, 60.14, 60.52, + 61.24, 61.36, 61.62, 62.04, 62.88, 63.72, 64.14, 64.54, 64.98, + 65.38, 65.8, 66.2, 66.62, 67.04, 67.42, 67.84, 68.24, 68.64, 69.04, + 69.44, 69.82, 70.22, 70.6, 70.98, 71.38, 71.76, 72.14, 72.5, 72.9, + 73.26, 73.64, 74.0, 74.38, 74.74, 75.1, 75.46, 75.84, 76.2, 76.56, + 76.92, 77.28, 77.66, 78.02, 78.38, 78.74, 79.1, 79.46, 79.84, 80.2, + 80.56, 80.92, 81.28, 82.02, 82.38, 82.74, 83.1, 83.46, 83.82, 84.18, + 84.56, 84.92, 85.28, 85.64, 86.0, 86.38, 86.74, 87.1, 87.48, 87.84, + 88.2, 88.56, 88.94, 89.28, 90.0, 90.74, 91.46, 91.82, 92.18, 92.54, + 92.92, 93.28, 93.64, 94.0, 94.36, 94.74, 95.1, 95.46, 95.82, 96.2, + 96.56, 96.92, 97.28, 97.64, 98.02, 98.38, 98.74, 99.1, 99.44, + 100.18, 100.54, 100.92, 101.28, 101.66, 102.02, 102.38, 103.1, + 103.82, 104.2, 104.56, 105.3, 106.02, 106.76, 107.48, 108.2, 108.92, + 109.64, 110.0, 110.38, 110.74, 111.1, 111.46, 111.82, 112.18, + 112.56, 112.92, 113.28, 114.02, 114.74, 115.46, 115.82, 116.2, + 116.56, 116.92, 117.64, 118.38, 118.74, 119.1, 119.3, 119.42, + 119.96, 120.56, 121.14, 121.84, 122.48, 123.12, 123.76, 124.42, + 125.06, 125.7, 126.32, 126.96, 127.6, 128.22, 128.86, 129.5, 130.1, + 130.74, 131.36, 132.0, 132.64, 133.26, 133.9, 134.52, 135.14, + 135.78, 136.4, 137.04, 137.68, 138.3, 138.94, 139.58, 140.2, 140.84, + 141.46, 142.1, 142.76, 143.38, 144.0, 144.64, 145.28, 145.9, 146.54, + 147.16, 147.8, 148.42, 149.06, 149.72, 150.34, 150.96, 151.6, + 152.22, 152.82, 153.46, 154.1, 154.72, 155.36, 156.0, 156.62, + 157.26, 157.9, 158.5, 159.14, 159.78, 160.42, 161.02, 161.66, 162.3, + 162.96, 163.6, 164.24, 164.86, 165.46, 166.1, 166.72, 167.38, + 167.98, 168.62, 169.28, 169.9, 170.52, 171.14, 171.78, 172.42, + 173.04, 173.68, 174.3, 174.94, 175.56, 176.18, 176.8, 177.44, + 178.08, 178.72, 179.36, 180.0, 180.62, 181.24, 181.88, 182.54, + 183.16, 183.8, 184.44, 185.08, 185.7, 186.32, 186.92, 187.58, 188.2, + 188.82, 189.48, 190.12, 190.72, 191.34, 191.98, 192.62, 193.24, + 193.88, 194.52, 195.16, 195.82, 196.42, 197.04, 197.66, 198.3, + 198.96, 199.6, 200.22, 200.84, 201.48, 202.12, 202.74, 203.38, + 204.02, 204.64, 205.28, 205.9, 206.52, 207.14, 207.76, 208.4, + 209.06, 209.24, 209.7, 210.3, 210.94, 211.56, 212.18, 212.86, 213.5, + 214.12, 214.74, 215.38, 216.04, 216.7, 217.28, 217.94, 218.56, + 219.18, 219.82, 220.44, 221.08, 221.72, 222.36, 222.96, 223.6, + 224.26, 224.86, 225.46, 226.1, 226.74, 227.2, 227.4, 228.06, 228.68, + 229.3, 229.92, 230.56, 232.4, 233.04, 233.68, 234.32, 234.98, 235.6, + 236.22, 236.84, 237.48, 238.12, 238.74, 239.38, 240.0, 240.62, + 241.26, 241.86, 242.5, 243.14, 243.78, 244.42, 245.06, 245.7, + 246.34, 246.94, 247.58, 248.2, 248.84, 249.46, 250.1, 250.74, + 251.38, 252.0, 252.64, 253.26, 253.9, 254.54, 255.16, 255.78, + 256.42, 257.04, 257.68, 258.3, 258.94, 259.58, 260.22, 260.9, 261.6, + 262.18, 262.3, 262.88, 263.56, 264.12, 265.16, 265.5, 265.86, + 266.56, 267.16, 267.26, 267.8, 267.98, 268.68, 269.38, 270.1, 270.8, + 271.5, 272.2, 272.92, 273.62, 274.3, + ]; + } else if (id === "YE7LMzWbCKgkLgSKVX9Q") { + // mordecai + beatsArray = [ + 0.32, 1.04, 1.76, 2.48, 3.2, 3.94, 4.66, 5.38, 6.1, 6.82, 7.56, + 8.28, 8.98, 9.72, 10.44, 11.16, 11.88, 12.62, 13.34, 14.06, 14.76, + 15.5, 16.22, 16.96, 17.66, 18.4, 19.12, 19.86, 20.54, 21.28, 22.0, + 22.74, 23.44, 24.16, 24.9, 25.64, 26.34, 27.06, 27.8, 28.52, 29.24, + 29.92, 30.68, 31.4, 32.12, 32.84, 33.58, 34.3, 35.02, 35.74, 36.46, + 37.2, 37.92, 38.64, 39.36, 40.08, 40.8, 41.54, 42.24, 42.98, 43.7, + 44.42, 45.14, 45.86, 46.58, 47.32, 48.04, 48.76, 49.48, 50.2, 50.92, + 51.66, 52.38, 53.1, 53.82, 54.54, 55.26, 55.98, 56.68, 57.42, 58.16, + 58.88, 59.6, 60.32, 61.04, 61.76, 62.48, 63.22, 63.94, 64.66, 65.38, + 66.12, 66.84, 67.56, 68.28, 69.0, 69.72, 70.44, 71.16, 71.88, 72.62, + 73.34, 74.06, 74.78, 75.5, 76.22, 76.96, 77.68, 78.4, 79.1, 79.84, + 80.58, 81.28, 82.02, 82.72, 83.46, 84.18, 84.9, 85.62, 86.36, 87.08, + 87.8, 88.52, 89.24, 89.96, 90.68, 91.4, 92.12, 92.84, 93.58, 94.3, + 95.02, 95.74, 96.48, 97.2, 97.9, 98.64, 99.36, 100.08, 100.8, + 101.52, 102.26, 102.96, 103.7, 104.42, 105.14, 105.86, 106.58, + 107.3, 108.02, 108.74, 109.48, 110.2, 110.92, 111.64, 112.36, + 113.08, 113.8, 114.54, 115.26, 115.98, 116.7, 117.42, 118.16, + 118.88, 119.62, 120.32, 121.04, 121.76, 122.48, 123.22, 123.94, + 124.66, 125.38, 126.1, 126.82, 127.54, 128.28, 129.0, 129.72, + 130.44, 131.16, 131.9, 132.62, 133.32, 134.06, 134.78, 135.5, + 136.22, 136.94, 137.68, 138.38, 139.12, 139.86, 140.58, 141.3, + 142.02, 142.74, 143.46, 144.2, 144.94, 145.66, 146.36, 147.1, + 147.82, 148.54, 149.26, 149.96, 150.68, 151.4, 152.14, 152.86, + 153.58, 154.3, 155.02, 155.74, 156.48, 157.2, 157.9, 158.64, 159.36, + 160.08, 160.78, 161.52, 162.24, 162.98, 163.7, 164.42, 165.14, + 165.86, 166.56, 167.3, 168.02, 168.76, 169.48, 170.2, 170.92, + 171.64, 172.36, 173.1, 173.82, 174.52, 175.26, 175.98, 176.7, + 177.44, 178.16, 178.88, 179.58, 180.32, 181.04, 181.76, 182.48, + 183.2, 183.92, 184.66, 185.36, + ]; + } + return beatsArray.filter((beat) => beat > startOffset); +}; + +// Beats array is the array of beats in the song +// groupLength is the number of beats in the group +// groupInterval is the interval between the start of each group +export const createBeatsGroupWithInterval = ( + beatsArray: number[], + groupLength: number, + noOfGroups: number, + groupInterval: number +) => { + // Create beats from random index for the number groupLength + // Then Ignore the groupInterval no of beats + // Then create a new group + // Repeat the above step for the number of groups + // Return the result + const resultShowBeats = []; + let beatIndex = createRandomNumber(8, 16); + for (let i = 0; i < noOfGroups; i++) { + for (let j = 0; j < groupLength; j++) { + resultShowBeats.push(beatsArray[beatIndex]); + beatIndex += createRandomNumber(1, 3); + } + beatIndex += groupInterval; + } + return resultShowBeats; +}; + From df7d0b89027bf1deaafca2bdb0a72dc05c03a4e9 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Thu, 10 Oct 2024 20:18:40 +0530 Subject: [PATCH 16/22] fix: position, circle fill in ms, difference --- src/game/scenes/Game.ts | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index bf38042..8fdbd96 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -110,7 +110,7 @@ export default class Game extends Phaser.Scene { this.musicStartOffset ); this.circleShouldFillInMs = - (this.allTapTimings[1] - this.allTapTimings[0]) * 1000; + (this.allTapTimings[1] - this.allTapTimings[0]) * 3 * 1000; this.showTapTimings = createBeatsGroupWithInterval( this.allTapTimings, this.beatsGroupLength, @@ -1338,12 +1338,14 @@ export default class Game extends Phaser.Scene { tapScore: number = 0; isBoosted = false; - buttonRadius = 60; + buttonRadius = 40 * this.dpr; joystickHolder: Phaser.GameObjects.Container | undefined; joystickFrame: Phaser.GameObjects.Image | undefined; renderJoystickButtons() { - let circleYOffset = this.cameras.main.height / 2 + 360; + const frameHeight = this.cameras.main.height / 3; + let circleYOffset = + this.cameras.main.height / 2 + frameHeight - this.buttonRadius; // .image(0, 0, "joystick_frame") // .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); this.circle1 = this.add @@ -1380,10 +1382,10 @@ export default class Game extends Phaser.Scene { ) .setScrollFactor(0) .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); - circleYOffset += 150; + circleYOffset += this.buttonRadius * 2; this.circle3 = this.add .sprite( - this.cameras.main.width / 2 - 100, + this.cameras.main.width / 2 - this.buttonRadius, circleYOffset, "green_dot" ) @@ -1392,7 +1394,7 @@ export default class Game extends Phaser.Scene { this.outlineCircle3 = this.add .sprite( - this.cameras.main.width / 2 - 100, + this.cameras.main.width / 2 - this.buttonRadius, circleYOffset, "green_dot_outline" ) @@ -1400,7 +1402,7 @@ export default class Game extends Phaser.Scene { .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); this.circle4 = this.add .sprite( - this.cameras.main.width / 2 + 100, + this.cameras.main.width / 2 + this.buttonRadius, circleYOffset, "green_dot" ) @@ -1409,7 +1411,7 @@ export default class Game extends Phaser.Scene { this.outlineCircle4 = this.add .sprite( - this.cameras.main.width / 2 + 100, + this.cameras.main.width / 2 + this.buttonRadius, circleYOffset, "green_dot_outline" ) @@ -1449,7 +1451,6 @@ export default class Game extends Phaser.Scene { this.setTimeouts.map((timeout) => clearTimeout(timeout)); this.setIntervals.map((interval) => clearInterval(interval)); }); - const frameHeight = this.cameras.main.height / 3; this.joystickFrame = this.add .image( this.cameras.main.width / 2, @@ -1579,9 +1580,9 @@ export default class Game extends Phaser.Scene { const difference = expectedTapTime - newCurrentTime; const resultText = - difference < 0.5 + difference < this.circleShouldFillInMs / 3 ? "Perfect" - : difference < 1 + : difference < this.circleShouldFillInMs / 2 ? "Good" : "Miss"; this.tapScore += From 4df12948bc254c56185b01e3ff0344b21aea7a61 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Fri, 11 Oct 2024 13:51:56 +0530 Subject: [PATCH 17/22] fix: tint, glitches --- src/game/scenes/Game.ts | 158 ++++++++++++++++++++++++---------------- 1 file changed, 94 insertions(+), 64 deletions(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 8fdbd96..5c47f0a 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -98,6 +98,8 @@ export default class Game extends Phaser.Scene { }; showObstacles: boolean = false; initialGravity: number = 0; + perfectTapTime: number = 0; + goodTapTime: number = 0; init(data: IGameDataParams) { // Sort the voices randomly @@ -111,6 +113,8 @@ export default class Game extends Phaser.Scene { ); this.circleShouldFillInMs = (this.allTapTimings[1] - this.allTapTimings[0]) * 3 * 1000; + this.perfectTapTime = this.circleShouldFillInMs / 3 / 1000; + this.goodTapTime = this.circleShouldFillInMs / 2 / 1000; this.showTapTimings = createBeatsGroupWithInterval( this.allTapTimings, this.beatsGroupLength, @@ -1341,6 +1345,7 @@ export default class Game extends Phaser.Scene { buttonRadius = 40 * this.dpr; joystickHolder: Phaser.GameObjects.Container | undefined; joystickFrame: Phaser.GameObjects.Image | undefined; + hasGroupPassed = true; renderJoystickButtons() { const frameHeight = this.cameras.main.height / 3; @@ -1493,10 +1498,12 @@ export default class Game extends Phaser.Scene { this.innerCircles.map((c) => { c.removeListener("pointerdown"); }); + this.joystickFrame?.setTint(undefined); this.joystickFrame?.setAlpha(0); } showJoystickButtons() { this.isJoystickButtonsShown = true; + this.hasGroupPassed = false; this.innerCircles.map((c) => { c.setAlpha(1); }); @@ -1511,11 +1518,9 @@ export default class Game extends Phaser.Scene { // update(time: number, delta: number): void { update(): void { const currentTime = getToneCurrentTime(); - const nextTapTiming = - this.showTapTimings[this.currentTapIndex] - - this.circleShouldFillInMs / 1000; if (this.tapScore >= 40) { + this.tapScore = 0; this.isBoosted = true; this.boostMultipler = this.marbles[0].velocity.y; this.marbleTrailParticles[0].setConfig({ @@ -1528,36 +1533,38 @@ export default class Game extends Phaser.Scene { advance: 2000, blendMode: "ADD", }); - this.tapScore = 0; this.hideJoystickButtons(); - this.tapResultLabel?.destroy(); - this.tapResultLabel = this.add - .text( - this.cameras.main.width / 2, - this.cameras.main.height / 2, - "Boosted", - { - fontSize: `${42 * this.dpr}px`, - color: "white", - stroke: "rgba(0,0,0,1)", - strokeThickness: 6, - backgroundColor: "rgba(0,0,0,1)", - } - ) - .setScrollFactor(0); - this.tapResultLabel?.setPosition( - this.tapResultLabel.x - this.tapResultLabel.width / 2, - this.tapResultLabel.y - this.tapResultLabel.height / 2 - ); - if (this.tapResultLabelTimer) { - clearTimeout(this.tapResultLabelTimer); - } - this.tapResultLabelTimer = setTimeout(() => { - // this.matter.world.setGravity(0, this.initialGravity); - this.tapResultLabel?.destroy(); - }, 2000); + // this.tapResultLabel?.destroy(); + // this.tapResultLabel = this.add + // .text( + // this.cameras.main.width / 2, + // this.cameras.main.height / 2, + // "Boosted", + // { + // fontSize: `${42 * this.dpr}px`, + // color: "white", + // stroke: "rgba(0,0,0,1)", + // strokeThickness: 6, + // backgroundColor: "rgba(0,0,0,1)", + // } + // ) + // .setScrollFactor(0); + // this.tapResultLabel?.setPosition( + // this.tapResultLabel.x - this.tapResultLabel.width / 2, + // this.tapResultLabel.y - this.tapResultLabel.height / 2 + // ); + // if (this.tapResultLabelTimer) { + // clearTimeout(this.tapResultLabelTimer); + // } + // this.tapResultLabelTimer = setTimeout(() => { + // // this.matter.world.setGravity(0, this.initialGravity); + // this.tapResultLabel?.destroy(); + // }, 2000); } const _currentTapIndex = this.currentTapIndex; + const nextTapTiming = + this.showTapTimings[_currentTapIndex] - + this.circleShouldFillInMs / 1000; if (currentTime >= nextTapTiming) { // console.log("Current Tap Idx: ", _currentTapIndex); this.currentTapIndex++; @@ -1576,13 +1583,12 @@ export default class Game extends Phaser.Scene { // Add a Label at the center of the screen with scrollFactor 0 const newCurrentTime = getToneCurrentTime(); const expectedTapTime = - this.allTapTimings[_currentTapIndex]; + this.showTapTimings[_currentTapIndex]; const difference = expectedTapTime - newCurrentTime; - const resultText = - difference < this.circleShouldFillInMs / 3 + difference < this.perfectTapTime ? "Perfect" - : difference < this.circleShouldFillInMs / 2 + : difference < this.goodTapTime ? "Good" : "Miss"; this.tapScore += @@ -1591,38 +1597,52 @@ export default class Game extends Phaser.Scene { : resultText === "Good" ? 5 : 0; - this.tapResultLabel?.destroy(); - this.tapResultLabel = this.add - .text( - this.cameras.main.width / 2, - this.cameras.main.height / 2, - resultText, - { - fontSize: `${42 * this.dpr}px`, - color: - resultText === "Perfect" - ? "green" - : resultText === "Good" - ? "yellow" - : "red", - stroke: "rgba(0,0,0,1)", - strokeThickness: 6, - backgroundColor: "rgba(0,0,0,1)", - } - ) - .setScrollFactor(0); - this.tapResultLabel.setPosition( - this.tapResultLabel.x - - this.tapResultLabel.width / 2, - this.tapResultLabel.y - - this.tapResultLabel.height / 2 + // Set green/success tint to the joystick frame + // green: #00ff00 + // red: #ff0000 + // yellow: #ffff00 + this.joystickFrame?.setTint( + resultText === "Perfect" + ? 0xffff00 + : resultText === "Good" + ? 0xffff00 + : 0xff0000 ); + // this.tapResultLabel?.destroy(); + // this.tapResultLabel = this.add + // .text( + // this.cameras.main.width / 2, + // this.cameras.main.height / 2, + // resultText, + // { + // fontSize: `${42 * this.dpr}px`, + // color: + // resultText === "Perfect" + // ? "green" + // : resultText === "Good" + // ? "yellow" + // : "red", + // stroke: "rgba(0,0,0,1)", + // strokeThickness: 6, + // backgroundColor: "rgba(0,0,0,1)", + // } + // ) + // .setScrollFactor(0); + // this.tapResultLabel.setPosition( + // this.tapResultLabel.x - + // this.tapResultLabel.width / 2, + // this.tapResultLabel.y - + // this.tapResultLabel.height / 2 + // ); if (this.tapResultLabelTimer) { + // this.joystickFrame?.setTint(undefined); clearTimeout(this.tapResultLabelTimer); } + // Destroy the label after 1 second this.tapResultLabelTimer = setTimeout(() => { - this.tapResultLabel?.destroy(); + this.joystickFrame?.setTint(undefined); + // this.tapResultLabel?.destroy(); }, 500); circleToFill.removeInteractive(); this.availableCircles.push(circleToFill); @@ -1658,9 +1678,10 @@ export default class Game extends Phaser.Scene { if ( _currentTapIndex && _currentTapIndex % this.beatsGroupLength === 0 && - this.isJoystickButtonsShown + this.hasGroupPassed === false ) { - // this.isBoosted = false; + this.hasGroupPassed = true; + // console.log("Group Passed"); // this.marbleTrailParticles[0].setConfig({ // ...this.trailConfig, // scale: this.marbleTrailParticles[0].scale, @@ -1669,14 +1690,23 @@ export default class Game extends Phaser.Scene { // this.marbleTrailParticles[0].destroy(); this.hideJoystickButtons(); } - if (this.isBoosted && this.boostMultipler < 20) { + if ( + this.isBoosted && + this.boostMultipler < 20 && + this.boostMultipler > 0 + ) { const firstMarble = this.marbles[0]; // TODO: User chosen marble this.matter.body.setVelocity(firstMarble, { x: firstMarble.velocity.x, y: this.boostMultipler, }); this.boostMultipler += 0.1; - } else if (this.boostMultipler >= 20) { + } + if ( + this.isBoosted && + this.boostMultipler >= 20 && + this.hasGroupPassed + ) { this.isBoosted = false; this.boostMultipler = 0; this.marbleTrailParticles[0].destroy(); From 9db8d2a83749784a2858f1fbba8323e876a5f930 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Tue, 5 Nov 2024 23:33:47 +0530 Subject: [PATCH 18/22] fix: remove loading of assets --- src/game/scenes/Game.ts | 1340 +++++++++++++++++----------------- src/game/scenes/Preloader.ts | 256 +++---- 2 files changed, 796 insertions(+), 800 deletions(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 5c47f0a..679bd4b 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -103,42 +103,41 @@ export default class Game extends Phaser.Scene { init(data: IGameDataParams) { // Sort the voices randomly - this.voices = data.voices; - // .sort(() => Math.random() - 0.5); - this.coverDocId = data.coverDocId; - this.musicStartOffset = data.musicStartOffset; - this.allTapTimings = getBeatsArray( - this.coverDocId, - this.musicStartOffset - ); - this.circleShouldFillInMs = - (this.allTapTimings[1] - this.allTapTimings[0]) * 3 * 1000; - this.perfectTapTime = this.circleShouldFillInMs / 3 / 1000; - this.goodTapTime = this.circleShouldFillInMs / 2 / 1000; - this.showTapTimings = createBeatsGroupWithInterval( - this.allTapTimings, - this.beatsGroupLength, - 4, - 12 - ); - - this.noOfRaceTracks = data.noOfRaceTracks || 5; - this.selectedTracks = duplicateArrayElemToN( - data.selectedTracks, - this.noOfRaceTracks - ); - this.enableMotion = data.enableMotion; - this.canvasWidth = data.width; - this.marbleRadius = (22 / 414) * this.canvasWidth * this.dpr; - if (data.height) this.canvasHeight = data.height; - this.centerX = this.cameras.main.width / 2; - this.centerY = this.cameras.main.height / 2; - this.trailConfig.scale.end = data.trailEndSize; - this.trailConfig.lifespan = data.trailsLifeSpace; - this.trailConfig.alpha = data.trailsOpacity; - this.dpr = window.devicePixelRatio || 2; - this.showObstacles = data.showObstacles || false; - this.initialGravity = data.gravityY || 0; + // this.voices = data.voices; + // // .sort(() => Math.random() - 0.5); + // this.coverDocId = data.coverDocId; + // this.musicStartOffset = data.musicStartOffset; + // this.allTapTimings = getBeatsArray( + // this.coverDocId, + // this.musicStartOffset + // ); + // this.circleShouldFillInMs = + // (this.allTapTimings[1] - this.allTapTimings[0]) * 3 * 1000; + // this.perfectTapTime = this.circleShouldFillInMs / 3 / 1000; + // this.goodTapTime = this.circleShouldFillInMs / 2 / 1000; + // this.showTapTimings = createBeatsGroupWithInterval( + // this.allTapTimings, + // this.beatsGroupLength, + // 4, + // 12 + // ); + // this.noOfRaceTracks = data.noOfRaceTracks || 5; + // this.selectedTracks = duplicateArrayElemToN( + // data.selectedTracks, + // this.noOfRaceTracks + // ); + // this.enableMotion = data.enableMotion; + // this.canvasWidth = data.width; + // this.marbleRadius = (22 / 414) * this.canvasWidth * this.dpr; + // if (data.height) this.canvasHeight = data.height; + // this.centerX = this.cameras.main.width / 2; + // this.centerY = this.cameras.main.height / 2; + // this.trailConfig.scale.end = data.trailEndSize; + // this.trailConfig.lifespan = data.trailsLifeSpace; + // this.trailConfig.alpha = data.trailsOpacity; + // this.dpr = window.devicePixelRatio || 2; + // this.showObstacles = data.showObstacles || false; + // this.initialGravity = data.gravityY || 0; } throttledUpdate(index: number, switchOld: boolean = true) { @@ -1113,207 +1112,204 @@ export default class Game extends Phaser.Scene { create() { console.log("Game Scene..."); - if (this.showObstacles) { - this.sound.add("low_whack", { loop: false, volume: 0.5 }); - this.sound.add("high_whack", { loop: false, volume: 0.5 }); - } - // Center the background image + // if (this.showObstacles) { + // this.sound.add("low_whack", { loop: false, volume: 0.5 }); + // this.sound.add("high_whack", { loop: false, volume: 0.5 }); + // } + // // Center the background image const centerX = this.cameras.main.width / 2; - if (!this.enableMotion) { - const centerY = this.cameras.main.height / 2; - const bg = this.add - .image(centerX, centerY, "background") - .setScrollFactor(0); - bg.setDisplaySize( - this.cameras.main.width, - this.cameras.main.height - ); - } else { - this.background = this.add - .tileSprite(0, 0, 0, 0, "background") - .setScrollFactor(0) - .setOrigin(0, 0); - this.background.setScale( - (414 / this.background.width) * this.dpr, - (736 / this.background.height) * this.dpr - ); - this.add - .image(this.centerX, this.centerY, "center_logo") - .setDisplaySize(254, 84) - .setScrollFactor(0); - } - - const siteUrl = this.add - .text(this.centerX, this.centerY, "marblerace.ai", { - fontSize: `${24 * this.dpr}px`, - color: "#ffffff", - stroke: "rgba(0,0,0,0.5)", - strokeThickness: 2, - }) + // if (!this.enableMotion) { + const centerY = this.cameras.main.height / 2; + const bg = this.add + .image(centerX, centerY, "background") .setScrollFactor(0); - siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, siteUrl.y + 100); - // siteUrl.setScale(this.dpr); - // siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, siteUrl.y); - // Enable camera scrolling - const canvasWidth = this.cameras.main.width; + bg.setDisplaySize(this.cameras.main.width, this.cameras.main.height); + // } else { + // this.background = this.add + // .tileSprite(0, 0, 0, 0, "background") + // .setScrollFactor(0) + // .setOrigin(0, 0); + // this.background.setScale( + // (414 / this.background.width) * this.dpr, + // (736 / this.background.height) * this.dpr + // ); + // this.add + // .image(this.centerX, this.centerY, "center_logo") + // .setDisplaySize(254, 84) + // .setScrollFactor(0); + // } - var prodShapes = this.cache.json.get("prod_shapes"); - var miniShapes = this.cache.json.get("mini_shapes"); - var obstaclesShapes = this.cache.json.get("obstacles_shapes"); + // const siteUrl = this.add + // .text(this.centerX, this.centerY, "marblerace.ai", { + // fontSize: `${24 * this.dpr}px`, + // color: "#ffffff", + // stroke: "rgba(0,0,0,0.5)", + // strokeThickness: 2, + // }) + // .setScrollFactor(0); + // siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, siteUrl.y + 100); + // // siteUrl.setScale(this.dpr); + // // siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, siteUrl.y); + // // Enable camera scrolling + // const canvasWidth = this.cameras.main.width; - let startOffset = 800 * this.dpr; - const xOffset = this.centerX; - // this.selectedTracks = ["06", "07", "03", "01", "16"]; - this.selectedTracks.map((trackNo) => { - switch (trackNo) { - case "01": - startOffset = this.createStaticCircles( - xOffset, - startOffset, - prodShapes, - obstaclesShapes - ); - break; - case "02": - startOffset = this.createCrossScreen( - startOffset, - canvasWidth, - miniShapes - ); - break; - case "03": - startOffset = this.createStaticTriangles( - xOffset, - startOffset, - prodShapes, - obstaclesShapes - ); - break; - case "06": - startOffset = this.createSeesawScreen( - xOffset, - startOffset, - prodShapes, - miniShapes, - obstaclesShapes - ); - break; - case "07": - startOffset = this.createZigzagSlider( - xOffset, - startOffset, - prodShapes, - obstaclesShapes - ); - break; - case "11": - startOffset = this.createStopperSlider( - xOffset, - startOffset, - prodShapes - ); - break; - case "14": - startOffset = this.createStarRotations( - startOffset, - miniShapes - ); - break; - case "16": - startOffset = this.createReduceSizeSlider( - xOffset, - startOffset, - prodShapes - ); - break; - case "21": - startOffset = this.createCircleBlockers( - xOffset, - startOffset, - prodShapes - ); - break; - case "22": - startOffset = this.createHorizontalCrosses( - canvasWidth, - startOffset, - miniShapes - ); - break; - } - }); - const finishOffset = startOffset + 250; - this.add.image(centerX, finishOffset, "finish_line").setScale(0.5); - this.finishLineOffset = finishOffset; - // .setDisplaySize(960, 40); - this.cameras.main.setBounds( - 0, - 0, - this.cameras.main.width, - finishOffset + 250 - ); - this.matter.world.setBounds( - 0, - 0, - this.cameras.main.width, - finishOffset + 800 - ); + // var prodShapes = this.cache.json.get("prod_shapes"); + // var miniShapes = this.cache.json.get("mini_shapes"); + // var obstaclesShapes = this.cache.json.get("obstacles_shapes"); - this.createMarbles(this.marbleRadius, miniShapes); - this.crossLeftRotation.map((baseSprite) => - this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) - ); - this.crossRightRotation.map((baseSprite) => - this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) - ); - [...this.leftRotatableStars, ...this.rightRotatableStars].map( - (baseSprite) => - this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) - ); - [ - ...this.horizontalCrossLeftRotation, - ...this.horizontalCrossRightRotation, - ].map((baseSprite) => - this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) - ); + // let startOffset = 800 * this.dpr; + // const xOffset = this.centerX; + // // this.selectedTracks = ["06", "07", "03", "01", "16"]; + // this.selectedTracks.map((trackNo) => { + // switch (trackNo) { + // case "01": + // startOffset = this.createStaticCircles( + // xOffset, + // startOffset, + // prodShapes, + // obstaclesShapes + // ); + // break; + // case "02": + // startOffset = this.createCrossScreen( + // startOffset, + // canvasWidth, + // miniShapes + // ); + // break; + // case "03": + // startOffset = this.createStaticTriangles( + // xOffset, + // startOffset, + // prodShapes, + // obstaclesShapes + // ); + // break; + // case "06": + // startOffset = this.createSeesawScreen( + // xOffset, + // startOffset, + // prodShapes, + // miniShapes, + // obstaclesShapes + // ); + // break; + // case "07": + // startOffset = this.createZigzagSlider( + // xOffset, + // startOffset, + // prodShapes, + // obstaclesShapes + // ); + // break; + // case "11": + // startOffset = this.createStopperSlider( + // xOffset, + // startOffset, + // prodShapes + // ); + // break; + // case "14": + // startOffset = this.createStarRotations( + // startOffset, + // miniShapes + // ); + // break; + // case "16": + // startOffset = this.createReduceSizeSlider( + // xOffset, + // startOffset, + // prodShapes + // ); + // break; + // case "21": + // startOffset = this.createCircleBlockers( + // xOffset, + // startOffset, + // prodShapes + // ); + // break; + // case "22": + // startOffset = this.createHorizontalCrosses( + // canvasWidth, + // startOffset, + // miniShapes + // ); + // break; + // } + // }); + // const finishOffset = startOffset + 250; + // this.add.image(centerX, finishOffset, "finish_line").setScale(0.5); + // this.finishLineOffset = finishOffset; + // // .setDisplaySize(960, 40); + // this.cameras.main.setBounds( + // 0, + // 0, + // this.cameras.main.width, + // finishOffset + 250 + // ); + // this.matter.world.setBounds( + // 0, + // 0, + // this.cameras.main.width, + // finishOffset + 800 + // ); - let coundownValue = 3; - // Start Countdown: - const clock = this.time.addEvent({ - delay: 1000, - repeat: 2, - callback: () => { - if (this.countdownText) { - coundownValue--; - if (coundownValue > 0) { - this.countdownText.setText(coundownValue.toString()); - } else { - this.countdownText.setText("Go!"); - console.log("Go!"); - // remove the large circle - if (this.largeCircle?.body) { - this.matter.world.remove( - this.largeCircle.body, - true - ); - this.largeCircle.destroy(); - // this.matter.world.remove(this.largeCircle); - } - this.isRotating = false; - this.countdownText.destroy(); - clock.destroy(); - this.cameras.main.startFollow(this.marblesImages[0]); - } - } - }, - }); - marbleRaceOnlyInstrument( - this.coverDocId, - 120, - this.musicStartOffset - ).then(() => (this.isInstrumentPlaying = true)); - // if (this.showObstacles) this.renderWeapons(); - this.renderJoystickButtons(); + // this.createMarbles(this.marbleRadius, miniShapes); + // this.crossLeftRotation.map((baseSprite) => + // this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) + // ); + // this.crossRightRotation.map((baseSprite) => + // this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) + // ); + // [...this.leftRotatableStars, ...this.rightRotatableStars].map( + // (baseSprite) => + // this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) + // ); + // [ + // ...this.horizontalCrossLeftRotation, + // ...this.horizontalCrossRightRotation, + // ].map((baseSprite) => + // this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) + // ); + + // let coundownValue = 3; + // // Start Countdown: + // const clock = this.time.addEvent({ + // delay: 1000, + // repeat: 2, + // callback: () => { + // if (this.countdownText) { + // coundownValue--; + // if (coundownValue > 0) { + // this.countdownText.setText(coundownValue.toString()); + // } else { + // this.countdownText.setText("Go!"); + // console.log("Go!"); + // // remove the large circle + // if (this.largeCircle?.body) { + // this.matter.world.remove( + // this.largeCircle.body, + // true + // ); + // this.largeCircle.destroy(); + // // this.matter.world.remove(this.largeCircle); + // } + // this.isRotating = false; + // this.countdownText.destroy(); + // clock.destroy(); + // this.cameras.main.startFollow(this.marblesImages[0]); + // } + // } + // }, + // }); + // marbleRaceOnlyInstrument( + // this.coverDocId, + // 120, + // this.musicStartOffset + // ).then(() => (this.isInstrumentPlaying = true)); + // // if (this.showObstacles) this.renderWeapons(); + // this.renderJoystickButtons(); } graphics: Phaser.GameObjects.Graphics | undefined; @@ -1516,461 +1512,461 @@ export default class Game extends Phaser.Scene { tapResultLabel: Phaser.GameObjects.Text | undefined; tapResultLabelTimer: NodeJS.Timeout | undefined; // update(time: number, delta: number): void { - update(): void { - const currentTime = getToneCurrentTime(); + // update(): void { + // const currentTime = getToneCurrentTime(); - if (this.tapScore >= 40) { - this.tapScore = 0; - this.isBoosted = true; - this.boostMultipler = this.marbles[0].velocity.y; - this.marbleTrailParticles[0].setConfig({ - color: [0xfacc22, 0xf89800, 0xf83600, 0x9f0404], - colorEase: "quad.out", - lifespan: 2400, - angle: { min: -100, max: -80 }, - scale: { start: 1, end: 0, ease: "sine.out" }, - speed: { min: 250, max: 350 }, - advance: 2000, - blendMode: "ADD", - }); - this.hideJoystickButtons(); - // this.tapResultLabel?.destroy(); - // this.tapResultLabel = this.add - // .text( - // this.cameras.main.width / 2, - // this.cameras.main.height / 2, - // "Boosted", - // { - // fontSize: `${42 * this.dpr}px`, - // color: "white", - // stroke: "rgba(0,0,0,1)", - // strokeThickness: 6, - // backgroundColor: "rgba(0,0,0,1)", - // } - // ) - // .setScrollFactor(0); - // this.tapResultLabel?.setPosition( - // this.tapResultLabel.x - this.tapResultLabel.width / 2, - // this.tapResultLabel.y - this.tapResultLabel.height / 2 - // ); - // if (this.tapResultLabelTimer) { - // clearTimeout(this.tapResultLabelTimer); - // } - // this.tapResultLabelTimer = setTimeout(() => { - // // this.matter.world.setGravity(0, this.initialGravity); - // this.tapResultLabel?.destroy(); - // }, 2000); - } - const _currentTapIndex = this.currentTapIndex; - const nextTapTiming = - this.showTapTimings[_currentTapIndex] - - this.circleShouldFillInMs / 1000; - if (currentTime >= nextTapTiming) { - // console.log("Current Tap Idx: ", _currentTapIndex); - this.currentTapIndex++; - if (!this.isBoosted) { - this.showJoystickButtons(); - const circleToFill = _.sample(this.availableCircles); - if (circleToFill) { - this.availableCircles = this.availableCircles.filter( - (c) => c !== circleToFill - ); - circleToFill.setInteractive(); - circleToFill.once("pointerdown", () => { - // Hide the Circle - circleToFill.setDisplaySize(0, 0); - circleToFill.setAlpha(0); - // Add a Label at the center of the screen with scrollFactor 0 - const newCurrentTime = getToneCurrentTime(); - const expectedTapTime = - this.showTapTimings[_currentTapIndex]; - const difference = expectedTapTime - newCurrentTime; - const resultText = - difference < this.perfectTapTime - ? "Perfect" - : difference < this.goodTapTime - ? "Good" - : "Miss"; - this.tapScore += - resultText === "Perfect" - ? 10 - : resultText === "Good" - ? 5 - : 0; - // Set green/success tint to the joystick frame - // green: #00ff00 - // red: #ff0000 - // yellow: #ffff00 - this.joystickFrame?.setTint( - resultText === "Perfect" - ? 0xffff00 - : resultText === "Good" - ? 0xffff00 - : 0xff0000 - ); - // this.tapResultLabel?.destroy(); - // this.tapResultLabel = this.add - // .text( - // this.cameras.main.width / 2, - // this.cameras.main.height / 2, - // resultText, - // { - // fontSize: `${42 * this.dpr}px`, - // color: - // resultText === "Perfect" - // ? "green" - // : resultText === "Good" - // ? "yellow" - // : "red", - // stroke: "rgba(0,0,0,1)", - // strokeThickness: 6, - // backgroundColor: "rgba(0,0,0,1)", - // } - // ) - // .setScrollFactor(0); - // this.tapResultLabel.setPosition( - // this.tapResultLabel.x - - // this.tapResultLabel.width / 2, - // this.tapResultLabel.y - - // this.tapResultLabel.height / 2 - // ); - if (this.tapResultLabelTimer) { - // this.joystickFrame?.setTint(undefined); - clearTimeout(this.tapResultLabelTimer); - } + // if (this.tapScore >= 40) { + // this.tapScore = 0; + // this.isBoosted = true; + // this.boostMultipler = this.marbles[0].velocity.y; + // this.marbleTrailParticles[0].setConfig({ + // color: [0xfacc22, 0xf89800, 0xf83600, 0x9f0404], + // colorEase: "quad.out", + // lifespan: 2400, + // angle: { min: -100, max: -80 }, + // scale: { start: 1, end: 0, ease: "sine.out" }, + // speed: { min: 250, max: 350 }, + // advance: 2000, + // blendMode: "ADD", + // }); + // this.hideJoystickButtons(); + // // this.tapResultLabel?.destroy(); + // // this.tapResultLabel = this.add + // // .text( + // // this.cameras.main.width / 2, + // // this.cameras.main.height / 2, + // // "Boosted", + // // { + // // fontSize: `${42 * this.dpr}px`, + // // color: "white", + // // stroke: "rgba(0,0,0,1)", + // // strokeThickness: 6, + // // backgroundColor: "rgba(0,0,0,1)", + // // } + // // ) + // // .setScrollFactor(0); + // // this.tapResultLabel?.setPosition( + // // this.tapResultLabel.x - this.tapResultLabel.width / 2, + // // this.tapResultLabel.y - this.tapResultLabel.height / 2 + // // ); + // // if (this.tapResultLabelTimer) { + // // clearTimeout(this.tapResultLabelTimer); + // // } + // // this.tapResultLabelTimer = setTimeout(() => { + // // // this.matter.world.setGravity(0, this.initialGravity); + // // this.tapResultLabel?.destroy(); + // // }, 2000); + // } + // const _currentTapIndex = this.currentTapIndex; + // const nextTapTiming = + // this.showTapTimings[_currentTapIndex] - + // this.circleShouldFillInMs / 1000; + // if (currentTime >= nextTapTiming) { + // // console.log("Current Tap Idx: ", _currentTapIndex); + // this.currentTapIndex++; + // if (!this.isBoosted) { + // this.showJoystickButtons(); + // const circleToFill = _.sample(this.availableCircles); + // if (circleToFill) { + // this.availableCircles = this.availableCircles.filter( + // (c) => c !== circleToFill + // ); + // circleToFill.setInteractive(); + // circleToFill.once("pointerdown", () => { + // // Hide the Circle + // circleToFill.setDisplaySize(0, 0); + // circleToFill.setAlpha(0); + // // Add a Label at the center of the screen with scrollFactor 0 + // const newCurrentTime = getToneCurrentTime(); + // const expectedTapTime = + // this.showTapTimings[_currentTapIndex]; + // const difference = expectedTapTime - newCurrentTime; + // const resultText = + // difference < this.perfectTapTime + // ? "Perfect" + // : difference < this.goodTapTime + // ? "Good" + // : "Miss"; + // this.tapScore += + // resultText === "Perfect" + // ? 10 + // : resultText === "Good" + // ? 5 + // : 0; + // // Set green/success tint to the joystick frame + // // green: #00ff00 + // // red: #ff0000 + // // yellow: #ffff00 + // this.joystickFrame?.setTint( + // resultText === "Perfect" + // ? 0xffff00 + // : resultText === "Good" + // ? 0xffff00 + // : 0xff0000 + // ); + // // this.tapResultLabel?.destroy(); + // // this.tapResultLabel = this.add + // // .text( + // // this.cameras.main.width / 2, + // // this.cameras.main.height / 2, + // // resultText, + // // { + // // fontSize: `${42 * this.dpr}px`, + // // color: + // // resultText === "Perfect" + // // ? "green" + // // : resultText === "Good" + // // ? "yellow" + // // : "red", + // // stroke: "rgba(0,0,0,1)", + // // strokeThickness: 6, + // // backgroundColor: "rgba(0,0,0,1)", + // // } + // // ) + // // .setScrollFactor(0); + // // this.tapResultLabel.setPosition( + // // this.tapResultLabel.x - + // // this.tapResultLabel.width / 2, + // // this.tapResultLabel.y - + // // this.tapResultLabel.height / 2 + // // ); + // if (this.tapResultLabelTimer) { + // // this.joystickFrame?.setTint(undefined); + // clearTimeout(this.tapResultLabelTimer); + // } - // Destroy the label after 1 second - this.tapResultLabelTimer = setTimeout(() => { - this.joystickFrame?.setTint(undefined); - // this.tapResultLabel?.destroy(); - }, 500); - circleToFill.removeInteractive(); - this.availableCircles.push(circleToFill); - }); - // Gradually Increase the radius of the circle to be 80 - // Create a SetInterval - const interval = setInterval(() => { - if (circleToFill) { - const radiuToIncreasePerMs = - this.buttonRadius / - (this.circleShouldFillInMs / 10); + // // Destroy the label after 1 second + // this.tapResultLabelTimer = setTimeout(() => { + // this.joystickFrame?.setTint(undefined); + // // this.tapResultLabel?.destroy(); + // }, 500); + // circleToFill.removeInteractive(); + // this.availableCircles.push(circleToFill); + // }); + // // Gradually Increase the radius of the circle to be 80 + // // Create a SetInterval + // const interval = setInterval(() => { + // if (circleToFill) { + // const radiuToIncreasePerMs = + // this.buttonRadius / + // (this.circleShouldFillInMs / 10); - circleToFill.setDisplaySize( - circleToFill.displayWidth + - radiuToIncreasePerMs * 2, - circleToFill.displayHeight + - radiuToIncreasePerMs * 2 - ); - } - }, 10); - this.setIntervals.push(interval); - const timeout = setTimeout(() => { - circleToFill.setDisplaySize(0, 0); - this.availableCircles.push(circleToFill); - circleToFill.removeInteractive(); - clearInterval(interval); - }, this.circleShouldFillInMs); - this.setTimeouts.push(timeout); - // } - } - } - } - if ( - _currentTapIndex && - _currentTapIndex % this.beatsGroupLength === 0 && - this.hasGroupPassed === false - ) { - this.hasGroupPassed = true; - // console.log("Group Passed"); - // this.marbleTrailParticles[0].setConfig({ - // ...this.trailConfig, - // scale: this.marbleTrailParticles[0].scale, - // follow: this.marbles[0].position, - // }); - // this.marbleTrailParticles[0].destroy(); - this.hideJoystickButtons(); - } - if ( - this.isBoosted && - this.boostMultipler < 20 && - this.boostMultipler > 0 - ) { - const firstMarble = this.marbles[0]; // TODO: User chosen marble - this.matter.body.setVelocity(firstMarble, { - x: firstMarble.velocity.x, - y: this.boostMultipler, - }); - this.boostMultipler += 0.1; - } - if ( - this.isBoosted && - this.boostMultipler >= 20 && - this.hasGroupPassed - ) { - this.isBoosted = false; - this.boostMultipler = 0; - this.marbleTrailParticles[0].destroy(); - this.marbleTrailParticles[0] = this.add - .particles(0, 0, "trail", { - ...this.trailConfig, - follow: this.marbles[0].position, - }) - .setDepth(0); - } + // circleToFill.setDisplaySize( + // circleToFill.displayWidth + + // radiuToIncreasePerMs * 2, + // circleToFill.displayHeight + + // radiuToIncreasePerMs * 2 + // ); + // } + // }, 10); + // this.setIntervals.push(interval); + // const timeout = setTimeout(() => { + // circleToFill.setDisplaySize(0, 0); + // this.availableCircles.push(circleToFill); + // circleToFill.removeInteractive(); + // clearInterval(interval); + // }, this.circleShouldFillInMs); + // this.setTimeouts.push(timeout); + // // } + // } + // } + // } + // if ( + // _currentTapIndex && + // _currentTapIndex % this.beatsGroupLength === 0 && + // this.hasGroupPassed === false + // ) { + // this.hasGroupPassed = true; + // // console.log("Group Passed"); + // // this.marbleTrailParticles[0].setConfig({ + // // ...this.trailConfig, + // // scale: this.marbleTrailParticles[0].scale, + // // follow: this.marbles[0].position, + // // }); + // // this.marbleTrailParticles[0].destroy(); + // this.hideJoystickButtons(); + // } + // if ( + // this.isBoosted && + // this.boostMultipler < 20 && + // this.boostMultipler > 0 + // ) { + // const firstMarble = this.marbles[0]; // TODO: User chosen marble + // this.matter.body.setVelocity(firstMarble, { + // x: firstMarble.velocity.x, + // y: this.boostMultipler, + // }); + // this.boostMultipler += 0.1; + // } + // if ( + // this.isBoosted && + // this.boostMultipler >= 20 && + // this.hasGroupPassed + // ) { + // this.isBoosted = false; + // this.boostMultipler = 0; + // this.marbleTrailParticles[0].destroy(); + // this.marbleTrailParticles[0] = this.add + // .particles(0, 0, "trail", { + // ...this.trailConfig, + // follow: this.marbles[0].position, + // }) + // .setDepth(0); + // } - if (this.damageMultipliyer === 1) { - // Highlight level 1 hammer - this.level2Hammer?.setScale( - (0.1 / 414) * this.canvasWidth * this.dpr - ); - this.level1Hammer?.setScale( - (0.2 / 414) * this.canvasWidth * this.dpr - ); - } else if (this.damageMultipliyer === 1.5) { - // Highlight level 2 hammer - this.level1Hammer?.setScale( - (0.1 / 414) * this.canvasWidth * this.dpr - ); - this.level2Hammer?.setScale( - (0.2 / 414) * this.canvasWidth * this.dpr - ); - } - if (this.isGameOver && this.isResultShown === false) { - // if (this.isResultShown) return; - this.showResult(); - } - // if (this.enableMotion && !this.isRotating) - // this.background.tilePositionX += 0.08; - if (this.marbles.length) { - if (this.isRotating) { - // Update the base angle to create the circular motion - this.baseAngle += 0.01; // Adjust this value to change the speed of rotation - this.largeCircle?.setRotation(this.baseAngle); - this.matter.body.setAngularVelocity( - this.largeCircle?.body as BodyType, - 0.15 - ); - } - // Optimize marble updates - for (let i = 0; i < this.marbles.length; i++) { - const voiceBody = this.marbles[i]; - const marbleImage = this.marblesImages[i]; - const marbleMask = this.marblesMasks[i]; - const label = this.labels[i]; - const currentCrossIndex = - this.currentMarblesSizeIndices[i.toString()]; + // if (this.damageMultipliyer === 1) { + // // Highlight level 1 hammer + // this.level2Hammer?.setScale( + // (0.1 / 414) * this.canvasWidth * this.dpr + // ); + // this.level1Hammer?.setScale( + // (0.2 / 414) * this.canvasWidth * this.dpr + // ); + // } else if (this.damageMultipliyer === 1.5) { + // // Highlight level 2 hammer + // this.level1Hammer?.setScale( + // (0.1 / 414) * this.canvasWidth * this.dpr + // ); + // this.level2Hammer?.setScale( + // (0.2 / 414) * this.canvasWidth * this.dpr + // ); + // } + // if (this.isGameOver && this.isResultShown === false) { + // // if (this.isResultShown) return; + // this.showResult(); + // } + // // if (this.enableMotion && !this.isRotating) + // // this.background.tilePositionX += 0.08; + // if (this.marbles.length) { + // if (this.isRotating) { + // // Update the base angle to create the circular motion + // this.baseAngle += 0.01; // Adjust this value to change the speed of rotation + // this.largeCircle?.setRotation(this.baseAngle); + // this.matter.body.setAngularVelocity( + // this.largeCircle?.body as BodyType, + // 0.15 + // ); + // } + // // Optimize marble updates + // for (let i = 0; i < this.marbles.length; i++) { + // const voiceBody = this.marbles[i]; + // const marbleImage = this.marblesImages[i]; + // const marbleMask = this.marblesMasks[i]; + // const label = this.labels[i]; + // const currentCrossIndex = + // this.currentMarblesSizeIndices[i.toString()]; - // Update marble image position and rotation - if (marbleImage) { - marbleImage.setPosition( - voiceBody.position.x, - voiceBody.position.y - ); - marbleImage.setRotation(voiceBody.angle); - } + // // Update marble image position and rotation + // if (marbleImage) { + // marbleImage.setPosition( + // voiceBody.position.x, + // voiceBody.position.y + // ); + // marbleImage.setRotation(voiceBody.angle); + // } - // Update marble mask position - if (marbleMask) { - marbleMask.setPosition( - voiceBody.position.x - voiceBody.circleRadius, - voiceBody.position.y - voiceBody.circleRadius - ); - } + // // Update marble mask position + // if (marbleMask) { + // marbleMask.setPosition( + // voiceBody.position.x - voiceBody.circleRadius, + // voiceBody.position.y - voiceBody.circleRadius + // ); + // } - // Update label position - if (label) { - label.setPosition( - voiceBody.position.x - label.width / 2, - voiceBody.position.y - 60 - ); - } + // // Update label position + // if (label) { + // label.setPosition( + // voiceBody.position.x - label.width / 2, + // voiceBody.position.y - 60 + // ); + // } - // Check for size changes - const isHeightReduced = this.heightReducedIndices.includes(i); - const y = voiceBody.position.y; + // // Check for size changes + // const isHeightReduced = this.heightReducedIndices.includes(i); + // const y = voiceBody.position.y; - if ( - isHeightReduced && - y > this.increaseSizeScreenOffset[currentCrossIndex] - ) { - // Increase size - this.currentMarblesSizeIndices[i.toString()]++; - this.matter.body.scale(voiceBody, 2, 2); - if (marbleImage) - marbleImage.setDisplaySize( - this.marbleRadius * 2, - this.marbleRadius * 2 - ); - if (marbleMask) marbleMask.scale = 1; - this.heightReducedIndices = - this.heightReducedIndices.filter((idx) => idx !== i); - this.marbleTrailParticles[i].setConfig(this.trailConfig); - } else if ( - !isHeightReduced && - y > this.reduceSizeScreenOffset[currentCrossIndex] && - y < this.increaseSizeScreenOffset[currentCrossIndex] - ) { - // Reduce size - this.heightReducedIndices.push(i); - this.matter.body.scale(voiceBody, 0.5, 0.5); - if (marbleImage) - marbleImage.setDisplaySize( - this.marbleRadius, - this.marbleRadius - ); - if (marbleMask) marbleMask.scale = 0.5; - this.marbleTrailParticles[i].setConfig({ - ...this.trailConfig, - scale: { start: 0.5, end: 0.01 }, - }); - } - } - // TODO: Optimized Code - // this.crossRightRotation.map((c) => { - // c.setAngle(c.angle + 2); - // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); - // }); - // this.crossLeftRotation.map((c) => { - // c.setAngle(c.angle - 2); - // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); - // }); - if (this.isInstrumentPlaying && this.isRotating === false) { - // /* - // let largest = -Infinity; - // let secondLargest = -Infinity; - // let largestIndex = -1; - // let finishedPositions = []; - // let voicesPositions = []; + // if ( + // isHeightReduced && + // y > this.increaseSizeScreenOffset[currentCrossIndex] + // ) { + // // Increase size + // this.currentMarblesSizeIndices[i.toString()]++; + // this.matter.body.scale(voiceBody, 2, 2); + // if (marbleImage) + // marbleImage.setDisplaySize( + // this.marbleRadius * 2, + // this.marbleRadius * 2 + // ); + // if (marbleMask) marbleMask.scale = 1; + // this.heightReducedIndices = + // this.heightReducedIndices.filter((idx) => idx !== i); + // this.marbleTrailParticles[i].setConfig(this.trailConfig); + // } else if ( + // !isHeightReduced && + // y > this.reduceSizeScreenOffset[currentCrossIndex] && + // y < this.increaseSizeScreenOffset[currentCrossIndex] + // ) { + // // Reduce size + // this.heightReducedIndices.push(i); + // this.matter.body.scale(voiceBody, 0.5, 0.5); + // if (marbleImage) + // marbleImage.setDisplaySize( + // this.marbleRadius, + // this.marbleRadius + // ); + // if (marbleMask) marbleMask.scale = 0.5; + // this.marbleTrailParticles[i].setConfig({ + // ...this.trailConfig, + // scale: { start: 0.5, end: 0.01 }, + // }); + // } + // } + // // TODO: Optimized Code + // // this.crossRightRotation.map((c) => { + // // c.setAngle(c.angle + 2); + // // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); + // // }); + // // this.crossLeftRotation.map((c) => { + // // c.setAngle(c.angle - 2); + // // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); + // // }); + // if (this.isInstrumentPlaying && this.isRotating === false) { + // // /* + // // let largest = -Infinity; + // // let secondLargest = -Infinity; + // // let largestIndex = -1; + // // let finishedPositions = []; + // // let voicesPositions = []; - // for (let i = 0; i < this.marbles.length; i++) { - // const y = this.marbles[i].position.y; - // voicesPositions.push(y); - // if (y < this.finishLineOffset) { - // finishedPositions.push(y); - // if (y > largest) { - // secondLargest = largest; - // largest = y; - // largestIndex = i; - // } else if (y > secondLargest) { - // secondLargest = y; - // } - // } - // } - // */ - const unFinishedPositions = []; - const finishedPositions = []; - const voicesPositions = []; - for (let i = 0; i < this.marbles.length; i++) { - const y = this.marbles[i].position.y; - voicesPositions.push(y); - if (y < this.finishLineOffset) { - unFinishedPositions.push(y); - } else if (y > this.finishLineOffset) { - finishedPositions.push(y); - } - } - // Above is the refactored code - // const voicesPositions = this.marbles.map((m) => m.position.y); - // const unFinishedPositions = voicesPositions.filter( - // (y) => y < this.finishLineOffset - // ); - // const finishedPositions = voicesPositions.filter( - // (y) => y > this.finishLineOffset - // ); + // // for (let i = 0; i < this.marbles.length; i++) { + // // const y = this.marbles[i].position.y; + // // voicesPositions.push(y); + // // if (y < this.finishLineOffset) { + // // finishedPositions.push(y); + // // if (y > largest) { + // // secondLargest = largest; + // // largest = y; + // // largestIndex = i; + // // } else if (y > secondLargest) { + // // secondLargest = y; + // // } + // // } + // // } + // // */ + // const unFinishedPositions = []; + // const finishedPositions = []; + // const voicesPositions = []; + // for (let i = 0; i < this.marbles.length; i++) { + // const y = this.marbles[i].position.y; + // voicesPositions.push(y); + // if (y < this.finishLineOffset) { + // unFinishedPositions.push(y); + // } else if (y > this.finishLineOffset) { + // finishedPositions.push(y); + // } + // } + // // Above is the refactored code + // // const voicesPositions = this.marbles.map((m) => m.position.y); + // // const unFinishedPositions = voicesPositions.filter( + // // (y) => y < this.finishLineOffset + // // ); + // // const finishedPositions = voicesPositions.filter( + // // (y) => y > this.finishLineOffset + // // ); - if (this.winnerIdx === -1 && finishedPositions.length) { - this.winnerIdx = voicesPositions.indexOf( - finishedPositions[0] - ); - } - const largest = Math.max(...unFinishedPositions); - const largestIndex = voicesPositions.findIndex( - (v) => v === largest - ); - const secondLargest = Math.max( - ...unFinishedPositions.filter((p) => p !== largest) - ); - if (largestIndex === -1) { - this.isGameOver = true; - return; - } - if ( - this.prevVoiceIdx !== largestIndex && - largest > secondLargest + this.marbleRadius - ) - this.throttledUpdate(largestIndex); - // else if (secondLargest >= largest - this.marbleRadius * 2) - // this.throttledUpdate(secondLargestIndex, false); - if (this.autoScroll) { - // this.cameras.main.startFollow(this.marblesImages[0]); - // this.cameras.main.scrollY = largest - 300 * this.dpr; - } - } + // if (this.winnerIdx === -1 && finishedPositions.length) { + // this.winnerIdx = voicesPositions.indexOf( + // finishedPositions[0] + // ); + // } + // const largest = Math.max(...unFinishedPositions); + // const largestIndex = voicesPositions.findIndex( + // (v) => v === largest + // ); + // const secondLargest = Math.max( + // ...unFinishedPositions.filter((p) => p !== largest) + // ); + // if (largestIndex === -1) { + // this.isGameOver = true; + // return; + // } + // if ( + // this.prevVoiceIdx !== largestIndex && + // largest > secondLargest + this.marbleRadius + // ) + // this.throttledUpdate(largestIndex); + // // else if (secondLargest >= largest - this.marbleRadius * 2) + // // this.throttledUpdate(secondLargestIndex, false); + // if (this.autoScroll) { + // // this.cameras.main.startFollow(this.marblesImages[0]); + // // this.cameras.main.scrollY = largest - 300 * this.dpr; + // } + // } - // Optimised Code - // let largest = -Infinity; - // let secondLargest = -Infinity; - // let index = -1; + // // Optimised Code + // // let largest = -Infinity; + // // let secondLargest = -Infinity; + // // let index = -1; - // for (let i = 0; i < this.marbles.length; i++) { - // const y = this.marbles[i].position.y; - // if (y < this.finishLineOffset) { - // if (y > largest) { - // secondLargest = largest; - // largest = y; - // index = i; - // } else if (y > secondLargest) { - // secondLargest = y; - // } - // } - // } - // TODO: Uncomment this - // this.leftRotatableStars.map((rs) => rs.setAngle(rs.angle - 0.4)); - // this.rightRotatableStars.map((rs) => rs.setAngle(rs.angle + 0.4)); - // this.horizontalCrossRightRotation.map((rs) => - // rs.setAngle(rs.angle + 2.5) - // ); - // this.horizontalCrossLeftRotation.map((rs) => - // rs.setAngle(rs.angle - 2.5) - // ); + // // for (let i = 0; i < this.marbles.length; i++) { + // // const y = this.marbles[i].position.y; + // // if (y < this.finishLineOffset) { + // // if (y > largest) { + // // secondLargest = largest; + // // largest = y; + // // index = i; + // // } else if (y > secondLargest) { + // // secondLargest = y; + // // } + // // } + // // } + // // TODO: Uncomment this + // // this.leftRotatableStars.map((rs) => rs.setAngle(rs.angle - 0.4)); + // // this.rightRotatableStars.map((rs) => rs.setAngle(rs.angle + 0.4)); + // // this.horizontalCrossRightRotation.map((rs) => + // // rs.setAngle(rs.angle + 2.5) + // // ); + // // this.horizontalCrossLeftRotation.map((rs) => + // // rs.setAngle(rs.angle - 2.5) + // // ); - // Bars up/down motion - // this.motionTimeForUpDownWard += delta; - // this.upDownMotionElems.map( - // ({ - // matter, - // startX, - // startY, - // moveSpeed, - // maxBottom, - // maxTop, - // direction, - // }) => { - // const amplitude = (maxBottom - maxTop) / 2; - // const offset = amplitude * Math.sin(time * (moveSpeed * 0.01)); - // // // Calculate new y position using a sine wave for smooth up and down movement - // // const range = maxBottom - maxTop; - // // const midPoint = maxTop + range / 2; - // // Calculate the new position considering the angle - // if (direction === "right") { - // const newX = - // startX + offset * Math.sin(Phaser.Math.DegToRad(7.1)); - // const newY = - // startY - offset * Math.cos(Phaser.Math.DegToRad(7.1)); - // // Update the rectangle's y position using a sine wave - // matter.setPosition(newX, newY); - // } else { - // const newX = - // startX + offset * Math.sin(Phaser.Math.DegToRad(-7.1)); - // const newY = - // startY - offset * Math.cos(Phaser.Math.DegToRad(-7.1)); - // // Update the rectangle's y position using a sine wave - // matter.setPosition(newX, newY); - // } - // } - // ); - } - } + // // Bars up/down motion + // // this.motionTimeForUpDownWard += delta; + // // this.upDownMotionElems.map( + // // ({ + // // matter, + // // startX, + // // startY, + // // moveSpeed, + // // maxBottom, + // // maxTop, + // // direction, + // // }) => { + // // const amplitude = (maxBottom - maxTop) / 2; + // // const offset = amplitude * Math.sin(time * (moveSpeed * 0.01)); + // // // // Calculate new y position using a sine wave for smooth up and down movement + // // // const range = maxBottom - maxTop; + // // // const midPoint = maxTop + range / 2; + // // // Calculate the new position considering the angle + // // if (direction === "right") { + // // const newX = + // // startX + offset * Math.sin(Phaser.Math.DegToRad(7.1)); + // // const newY = + // // startY - offset * Math.cos(Phaser.Math.DegToRad(7.1)); + // // // Update the rectangle's y position using a sine wave + // // matter.setPosition(newX, newY); + // // } else { + // // const newX = + // // startX + offset * Math.sin(Phaser.Math.DegToRad(-7.1)); + // // const newY = + // // startY - offset * Math.cos(Phaser.Math.DegToRad(-7.1)); + // // // Update the rectangle's y position using a sine wave + // // matter.setPosition(newX, newY); + // // } + // // } + // // ); + // } + // } } // !wget -c "https://github.com/CPJKU/beat_this/raw/main/tests/It%20Don't%20Mean%20A%20Thing%20-%20Kings%20of%20Swing.mp3" -O music.mp3 diff --git a/src/game/scenes/Preloader.ts b/src/game/scenes/Preloader.ts index 7fd8e60..eceea1c 100644 --- a/src/game/scenes/Preloader.ts +++ b/src/game/scenes/Preloader.ts @@ -78,137 +78,137 @@ export default class Preloader extends Phaser.Scene { } preload() { console.log("Preloader..."); - this.load.image( - "green_dot", - "assets/sprite/rhythmicpads/green_dot.png" - ); - this.load.image( - "green_dot_outline", - "assets/sprite/rhythmicpads/green_dot_outline.png" - ); - this.load.image( - "joystick_frame", - "assets/sprite/rhythmicpads/joystick_frame.jpg" - ); + // this.load.image( + // "green_dot", + // "assets/sprite/rhythmicpads/green_dot.png" + // ); + // this.load.image( + // "green_dot_outline", + // "assets/sprite/rhythmicpads/green_dot_outline.png" + // ); + // this.load.image( + // "joystick_frame", + // "assets/sprite/rhythmicpads/joystick_frame.jpg" + // ); this.load.image("background", this.params.backgroundPath); - ObstacleNames.map((name) => { - this.load.image( - `obstacle_${name}`, - `assets/sprite/obstacles/${name}.png` - ); - }); - this.load.image("hammer_1", "assets/sprite/weapons/hammer_level_1.png"); - this.load.image("hammer_2", "assets/sprite/weapons/hammer_level_2.png"); - this.load.image("whack", "/assets/sprite/weapons/whack.png"); - this.load.audio("low_whack", "/assets/sounds/low_whack.wav"); - this.load.audio("high_whack", "/assets/sounds/high_whack.wav"); - if (this.params.enableMotion) - this.load.image("center_logo", "assets/transparent_logo.png"); - // TODO: Enable the below and comment out the rest of the images - if (this.params.voices.length) { - this.params.voices.map((voice) => { - // this.load.image(voice.id, voice.avatar); - // const image = new Image(); - // image.src = voice.avatar; - // image.crossOrigin = "anonymous"; - // new Promise((res) => { - // image.onload = () => { - // const dataUrl = this.resize(image); - // res(dataUrl); - // }; - // }).then((dataurl) => { - // // Add the newly created image as a texture - // // this.textures.addBase64(`resized_${voice.id}`, dataurl); - // this.load.image(`resized_${voice.id}`, dataurl as string); - // }); - this.load.image(`resized_${voice.id}`, voice.avatar); - this.load.image( - `resized_${voice.id}_mouth`, - `https://voxaudio.nusic.fm/voice_models%2Favatars%2Fthumbs%2Fgifs%2F${voice.id}_200x200.png?alt=media` - ); - }); - } + // ObstacleNames.map((name) => { + // this.load.image( + // `obstacle_${name}`, + // `assets/sprite/obstacles/${name}.png` + // ); + // }); + // this.load.image("hammer_1", "assets/sprite/weapons/hammer_level_1.png"); + // this.load.image("hammer_2", "assets/sprite/weapons/hammer_level_2.png"); + // this.load.image("whack", "/assets/sprite/weapons/whack.png"); + // this.load.audio("low_whack", "/assets/sounds/low_whack.wav"); + // this.load.audio("high_whack", "/assets/sounds/high_whack.wav"); + // if (this.params.enableMotion) + // this.load.image("center_logo", "assets/transparent_logo.png"); + // // TODO: Enable the below and comment out the rest of the images + // if (this.params.voices.length) { + // this.params.voices.map((voice) => { + // // this.load.image(voice.id, voice.avatar); + // // const image = new Image(); + // // image.src = voice.avatar; + // // image.crossOrigin = "anonymous"; + // // new Promise((res) => { + // // image.onload = () => { + // // const dataUrl = this.resize(image); + // // res(dataUrl); + // // }; + // // }).then((dataurl) => { + // // // Add the newly created image as a texture + // // // this.textures.addBase64(`resized_${voice.id}`, dataurl); + // // this.load.image(`resized_${voice.id}`, dataurl as string); + // // }); + // this.load.image(`resized_${voice.id}`, voice.avatar); + // this.load.image( + // `resized_${voice.id}_mouth`, + // `https://voxaudio.nusic.fm/voice_models%2Favatars%2Fthumbs%2Fgifs%2F${voice.id}_200x200.png?alt=media` + // ); + // }); + // } + // // this.load.json( + // // "screen_sprite_data", + // // "assets/sprite/screen_sprite.json" + // // ); + // // ["01", "16", "03", "07", "06"] + // this.params.selectedTracks.map((trackNo) => { + // switch (trackNo) { + // case "01": + // this.load.image( + // "prod_texture_loaded_01", + // "assets/sprite/01.png" + // ); + // break; + // case "02": + // case "22": + // this.load.image("02_cross", "assets/sprite/02_cross.png"); + // break; + // case "03": + // this.load.image( + // "prod_texture_loaded_03", + // "assets/sprite/03.png" + // ); + // break; + // case "06": + // this.load.image( + // "prod_texture_loaded_06", + // "assets/sprite/06.png" + // ); + // this.load.image("06b", "assets/sprite/06b.png"); + // break; + // case "07": + // this.load.image( + // "prod_texture_loaded_07", + // "assets/sprite/07.png" + // ); + // break; + // case "11": + // this.load.image( + // "left_block", + // "assets/sprite/left_block.png" + // ); + // this.load.image( + // "right_block", + // "assets/sprite/right_block.png" + // ); + // this.load.image( + // "prod_texture_loaded_11", + // "assets/sprite/11.png" + // ); + // break; + // case "14": + // this.load.image("mini_star", "assets/sprite/14_mini.png"); + // this.load.image("14_mini", "assets/sprite/14_mini.png"); + // break; + // case "16": + // this.load.image( + // "prod_texture_loaded_16", + // "assets/sprite/16.png" + // ); + // break; + // case "21": + // this.load.image( + // "prod_texture_loaded_21", + // "assets/sprite/21.png" + // ); + // break; + // } + // }); + + // this.load.json("prod_shapes", "assets/physics/new_shapes.json"); // this.load.json( - // "screen_sprite_data", - // "assets/sprite/screen_sprite.json" + // "obstacles_shapes", + // "assets/physics/obstacles_shapes.json" // ); - // ["01", "16", "03", "07", "06"] - this.params.selectedTracks.map((trackNo) => { - switch (trackNo) { - case "01": - this.load.image( - "prod_texture_loaded_01", - "assets/sprite/01.png" - ); - break; - case "02": - case "22": - this.load.image("02_cross", "assets/sprite/02_cross.png"); - break; - case "03": - this.load.image( - "prod_texture_loaded_03", - "assets/sprite/03.png" - ); - break; - case "06": - this.load.image( - "prod_texture_loaded_06", - "assets/sprite/06.png" - ); - this.load.image("06b", "assets/sprite/06b.png"); - break; - case "07": - this.load.image( - "prod_texture_loaded_07", - "assets/sprite/07.png" - ); - break; - case "11": - this.load.image( - "left_block", - "assets/sprite/left_block.png" - ); - this.load.image( - "right_block", - "assets/sprite/right_block.png" - ); - this.load.image( - "prod_texture_loaded_11", - "assets/sprite/11.png" - ); - break; - case "14": - this.load.image("mini_star", "assets/sprite/14_mini.png"); - this.load.image("14_mini", "assets/sprite/14_mini.png"); - break; - case "16": - this.load.image( - "prod_texture_loaded_16", - "assets/sprite/16.png" - ); - break; - case "21": - this.load.image( - "prod_texture_loaded_21", - "assets/sprite/21.png" - ); - break; - } - }); - - this.load.json("prod_shapes", "assets/physics/new_shapes.json"); - this.load.json( - "obstacles_shapes", - "assets/physics/obstacles_shapes.json" - ); - // Mini - this.load.image("bar", "assets/sprite/bar.png"); - this.load.json("mini_shapes", "assets/physics/mini_shapes.json"); - this.load.image("textureImage", this.params.skinPath); - this.load.image("wheel", "assets/sprite/wheel.png"); - this.load.image("finish_line", "assets/finish.png"); - this.load.image("trail", this.params.trailPath); + // // Mini + // this.load.image("bar", "assets/sprite/bar.png"); + // this.load.json("mini_shapes", "assets/physics/mini_shapes.json"); + // this.load.image("textureImage", this.params.skinPath); + // this.load.image("wheel", "assets/sprite/wheel.png"); + // this.load.image("finish_line", "assets/finish.png"); + // this.load.image("trail", this.params.trailPath); // this.load.once("complete", () => { // const spriteData = this.cache.json.get("screen_sprite_data"); From 8c1542ce3d9bbd977bca9addd7842bd5f1a832dd Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Tue, 5 Nov 2024 23:47:51 +0530 Subject: [PATCH 19/22] fix: remove code --- src/App.tsx | 136 +-- src/game/PhaserGame.tsx | 227 ++-- src/game/scenes/Game.ts | 1965 +--------------------------------- src/game/scenes/Preloader.ts | 309 +----- 4 files changed, 184 insertions(+), 2453 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index a5bbd92..6190c13 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -21,7 +21,7 @@ import SelectTracks from "./components/SelectTracks"; import SelectVoices from "./components/SelectVoices"; import { IRefPhaserGame, PhaserGame } from "./game/PhaserGame"; import { GameVoiceInfo } from "./game/scenes/Preloader"; -import { downloadAudioFiles, stopAndDestroyPlayers } from "./hooks/useTonejs"; +// import { downloadAudioFiles, stopAndDestroyPlayers } from "./hooks/useTonejs"; import { CoverV1 } from "./services/db/coversV1.service"; import { listAllTrackBackgrounds, @@ -142,7 +142,7 @@ function App() { ); if (quite) { - stopAndDestroyPlayers(); + // stopAndDestroyPlayers(); setDownloadProgress(0); phaserRef.current?.game?.destroy(true); setReady(false); @@ -202,28 +202,28 @@ function App() { }); if ((_coverDoc || coverDoc) && (_coverId || selectedCoverDocId)) { setIsDownloading(true); - await downloadAudioFiles( - [ - `https://voxaudio.nusic.fm/covers/${ - _coverId || selectedCoverDocId - }/instrumental.mp3`, - ...(_coverDoc - ? _coverDoc.voices.slice(0, 5) - : selectedVoices - ) - .map((v) => v.id) - .map( - (v) => - `https://voxaudio.nusic.fm/covers/${ - _coverId || selectedCoverDocId - }/${v}.mp3` - ), - ], - (progress: number) => { - console.log("progress", progress); - setDownloadProgress(progress); - } - ); + // await downloadAudioFiles( + // [ + // `https://voxaudio.nusic.fm/covers/${ + // _coverId || selectedCoverDocId + // }/instrumental.mp3`, + // ...(_coverDoc + // ? _coverDoc.voices.slice(0, 5) + // : selectedVoices + // ) + // .map((v) => v.id) + // .map( + // (v) => + // `https://voxaudio.nusic.fm/covers/${ + // _coverId || selectedCoverDocId + // }/${v}.mp3` + // ), + // ], + // (progress: number) => { + // console.log("progress", progress); + // setDownloadProgress(progress); + // } + // ); setIsDownloading(false); setReady(true); } @@ -336,28 +336,28 @@ function App() { {ready && coverDoc ? ( ) : ( { phaserRef.current?.game?.destroy(true); - stopAndDestroyPlayers(); + // stopAndDestroyPlayers(); setDownloadProgress(0); setReady(false); }} @@ -820,28 +820,28 @@ function App() { {ready && coverDoc ? ( ) : ( { phaserRef.current?.game?.destroy(true); - stopAndDestroyPlayers(); + // stopAndDestroyPlayers(); setDownloadProgress(0); setReady(false); }} diff --git a/src/game/PhaserGame.tsx b/src/game/PhaserGame.tsx index 76dfcec..17774f1 100644 --- a/src/game/PhaserGame.tsx +++ b/src/game/PhaserGame.tsx @@ -1,7 +1,7 @@ -import { forwardRef, useLayoutEffect, useRef, useState } from "react"; +import { forwardRef, useLayoutEffect, useRef } from "react"; import StartGame from "./main"; -import { GameVoiceInfo } from "./scenes/Preloader"; -import * as Tone from "tone"; +// import { GameVoiceInfo } from "./scenes/Preloader"; +// import * as Tone from "tone"; import { Box } from "@mui/material"; export interface IRefPhaserGame { @@ -10,135 +10,136 @@ export interface IRefPhaserGame { } export interface IGameDataParams { - voices: GameVoiceInfo[]; - coverDocId: string; - musicStartOffset: number; - skinPath: string; + // voices: GameVoiceInfo[]; + // coverDocId: string; + // musicStartOffset: number; + // skinPath: string; backgroundPath: string; - selectedTracks: string[]; - noOfRaceTracks: number; - gravityY: number; - width: number; - enableMotion: boolean; - trailPath: string; - trailsLifeSpace: number; - trailsOpacity: number; - trailEndSize: number; - recordDuration: number; - isRecord: boolean; - height?: number; - dprAdjustedWidth?: number; - dprAdjustedHeight?: number; - showObstacles?: boolean; + // selectedTracks: string[]; + // noOfRaceTracks: number; + // gravityY: number; + // width: number; + // enableMotion: boolean; + // trailPath: string; + // trailsLifeSpace: number; + // trailsOpacity: number; + // trailEndSize: number; + // recordDuration: number; + // isRecord: boolean; + // height?: number; + // dprAdjustedWidth?: number; + // dprAdjustedHeight?: number; + // showObstacles?: boolean; } interface IProps extends IGameDataParams { currentActiveScene?: (scene_instance: Phaser.Scene) => void; } -const downloadVideo = (videoUrl: string, name: string) => { - const link = document.createElement("a"); - link.href = videoUrl; - link.download = `${name}.webm`; // Set the file name for download - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); -}; +// const downloadVideo = (videoUrl: string, name: string) => { +// const link = document.createElement("a"); +// link.href = videoUrl; +// link.download = `${name}.webm`; // Set the file name for download +// document.body.appendChild(link); +// link.click(); +// document.body.removeChild(link); +// }; export const PhaserGame = forwardRef( function PhaserGame( { - voices, - coverDocId, - musicStartOffset, - skinPath, + // voices, + // coverDocId, + // musicStartOffset, + // skinPath, backgroundPath, - selectedTracks, - noOfRaceTracks, - gravityY, - width, - enableMotion, - trailPath, - trailsLifeSpace, - trailsOpacity, - trailEndSize, - recordDuration, - isRecord, + // selectedTracks, + // noOfRaceTracks, + // gravityY, + // width, + // enableMotion, + // trailPath, + // trailsLifeSpace, + // trailsOpacity, + // trailEndSize, + // recordDuration, + // isRecord, }, ref ) { + const width = 414; const height = (width * 16) / 10; const game = useRef(null!); - const [, setMediaRecorder] = useState(null); - const [, setIsRecording] = useState(false); - const [dpr] = useState(window.devicePixelRatio); - - const startRecording = (canvas: HTMLCanvasElement) => { - // const canvas = canvasRef.current; - const canvasStream = canvas.captureStream(120); // 30 FPS - const audioCtx = Tone.getContext().rawContext; - const dest = (audioCtx as any).createMediaStreamDestination(); - Tone.getDestination().connect(dest); - const audioStream = dest.stream; - - // navigator.mediaDevices - // .getUserMedia({ audio: true }) - // .then((micStream) => { - // Combine the canvas video stream and the audio stream - const combinedStream = new MediaStream([ - ...canvasStream.getTracks(), - ...audioStream.getTracks(), - ]); - - const recorder = new MediaRecorder(combinedStream, { - mimeType: "video/webm; codecs=vp9,opus", - }); - - const chunks: Blob[] = []; - recorder.ondataavailable = (e) => chunks.push(e.data); - recorder.onstop = () => { - const blob = new Blob(chunks, { type: "video/webm" }); - downloadVideo(URL.createObjectURL(blob), coverDocId); - }; - - recorder.start(); - setMediaRecorder(recorder); - setIsRecording(true); - - setTimeout(() => { - stopRecording(recorder); - }, recordDuration * 1000); - }; - - const stopRecording = (recorder: MediaRecorder) => { - recorder.stop(); - setIsRecording(false); - }; + // const [, setMediaRecorder] = useState(null); + // const [, setIsRecording] = useState(false); + // const [dpr] = useState(window.devicePixelRatio); + + // const startRecording = (canvas: HTMLCanvasElement) => { + // // const canvas = canvasRef.current; + // const canvasStream = canvas.captureStream(120); // 30 FPS + // const audioCtx = Tone.getContext().rawContext; + // const dest = (audioCtx as any).createMediaStreamDestination(); + // Tone.getDestination().connect(dest); + // const audioStream = dest.stream; + + // // navigator.mediaDevices + // // .getUserMedia({ audio: true }) + // // .then((micStream) => { + // // Combine the canvas video stream and the audio stream + // const combinedStream = new MediaStream([ + // ...canvasStream.getTracks(), + // ...audioStream.getTracks(), + // ]); + + // const recorder = new MediaRecorder(combinedStream, { + // mimeType: "video/webm; codecs=vp9,opus", + // }); + + // const chunks: Blob[] = []; + // recorder.ondataavailable = (e) => chunks.push(e.data); + // recorder.onstop = () => { + // const blob = new Blob(chunks, { type: "video/webm" }); + // downloadVideo(URL.createObjectURL(blob), coverDocId); + // }; + + // recorder.start(); + // setMediaRecorder(recorder); + // setIsRecording(true); + + // setTimeout(() => { + // stopRecording(recorder); + // }, recordDuration * 1000); + // }; + + // const stopRecording = (recorder: MediaRecorder) => { + // recorder.stop(); + // setIsRecording(false); + // }; useLayoutEffect(() => { - const dprAdjustedWidth = width * dpr; - const dprAdjustedHeight = height * dpr; + // const dprAdjustedWidth = width * dpr; + // const dprAdjustedHeight = height * dpr; game.current = StartGame("game-container", { - voices, - coverDocId, - musicStartOffset, - skinPath, + // voices, + // coverDocId, + // musicStartOffset, + // skinPath, backgroundPath, - selectedTracks, - noOfRaceTracks, - gravityY, - dprAdjustedWidth, - dprAdjustedHeight, - width, - height, - enableMotion, - trailPath, - trailsLifeSpace, - trailsOpacity, - trailEndSize, - recordDuration, - isRecord, + // selectedTracks, + // noOfRaceTracks, + // gravityY, + // dprAdjustedWidth, + // dprAdjustedHeight, + // width, + // height, + // enableMotion, + // trailPath, + // trailsLifeSpace, + // trailsOpacity, + // trailEndSize, + // recordDuration, + // isRecord, }); if (typeof ref === "function") { @@ -146,9 +147,9 @@ export const PhaserGame = forwardRef( } else if (ref) { ref.current = { game: game.current, scene: null }; } - if (game.current && isRecord) { - startRecording(game.current.canvas); - } + // if (game.current && isRecord) { + // startRecording(game.current.canvas); + // } return () => { if (game.current) { diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 679bd4b..842c1fb 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -1,1975 +1,12 @@ import Phaser from "phaser"; -import { - getToneCurrentTime, - marbleRaceOnlyInstrument, - marbleRacePlayVocals, -} from "../../hooks/useTonejs"; -import _ from "lodash"; -import { GameVoiceInfo, ObstacleNames } from "./Preloader"; -import { BodyType } from "matter"; -import { - createBeatsGroupWithInterval, - duplicateArrayElemToN, - getBeatsArray, -} from "../../helpers"; -import { EventBus } from "../EventBus"; -import { IGameDataParams } from "../PhaserGame"; export default class Game extends Phaser.Scene { constructor() { super("game"); - this.throttledUpdate = _.throttle(this.throttledUpdate.bind(this), 10); // Throttle interval in milliseconds - } - public sky: Phaser.Physics.Matter.Image | undefined; - public marbles: MatterJS.BodyType[] = []; - public marblesImages: Phaser.GameObjects.Image[] = []; - public marblesMasks: Phaser.GameObjects.Graphics[] = []; - public isInstrumentPlaying: boolean = false; - public autoScroll = true; - public prevVoiceIdx = -1; - public leftRotatableStars: Phaser.Physics.Matter.Sprite[] = []; - public rightRotatableStars: Phaser.Physics.Matter.Sprite[] = []; - public reduceSizeScreenOffset: number[] = []; - public increaseSizeScreenOffset: number[] = []; - public currentMarblesSizeIndices: { [key: string]: number } = {}; - public heightReducedIndices: number[] = []; - public upDownMotionElems: { - matter: Phaser.Physics.Matter.Image; - startX: number; - startY: number; - maxTop: number; - maxBottom: number; - moveSpeed: number; - direction: "left" | "right"; - }[] = []; - public labels: Phaser.GameObjects.Text[] = []; - public motionTimeForUpDownWard = 0; - public crossRightRotation: Phaser.Physics.Matter.Sprite[] = []; - public crossLeftRotation: Phaser.Physics.Matter.Sprite[] = []; - public horizontalCrossRightRotation: Phaser.Physics.Matter.Sprite[] = []; - public horizontalCrossLeftRotation: Phaser.Physics.Matter.Sprite[] = []; - // public trails: { x: number; y: number }[][] = []; - // public trailGraphics: Phaser.GameObjects.Graphics[] = []; - // public trailsGroup: Phaser.GameObjects.Group[] = []; - public trailLength: number = 0; - public trailPoints: { - x: number; - y: number; - angle: number; - // size: number; - }[][] = []; - // public shape: any; - public voices: GameVoiceInfo[] = []; - public coverDocId: string = ""; - public musicStartOffset: number = 0; - public selectedTracks: string[] = []; - public noOfRaceTracks: number = 0; - largeCircle: Phaser.Physics.Matter.Image | undefined; - isRotating = true; - baseAngle = 0; - centerX = 0; - centerY = 0; - radius = 100; - angleIncrement = (2 * Math.PI) / 5; - countdownText: Phaser.GameObjects.Text | undefined; - finishLineOffset: number = 0; - marbleRadius = 23; - background: Phaser.GameObjects.TileSprite | undefined; - enableMotion: boolean = false; - marbleTrailParticles: Phaser.GameObjects.Particles.ParticleEmitter[] = []; - isGameOver: boolean = false; - winnerIdx: number = -1; - isResultShown = false; - damageMultipliyer: number = 1; - level1Hammer: Phaser.GameObjects.Sprite | undefined; - level2Hammer: Phaser.GameObjects.Sprite | undefined; - canvasWidth: number = 0; - canvasHeight: number = 0; - dpr: number = window.devicePixelRatio || 2; - trailConfig = { - speed: { min: -50, max: 50 }, - scale: { - start: this.dpr, - end: this.dpr * 0.5, - }, - blendMode: "ADD", - lifespan: 400, - alpha: 0.5, - }; - showObstacles: boolean = false; - initialGravity: number = 0; - perfectTapTime: number = 0; - goodTapTime: number = 0; - - init(data: IGameDataParams) { - // Sort the voices randomly - // this.voices = data.voices; - // // .sort(() => Math.random() - 0.5); - // this.coverDocId = data.coverDocId; - // this.musicStartOffset = data.musicStartOffset; - // this.allTapTimings = getBeatsArray( - // this.coverDocId, - // this.musicStartOffset - // ); - // this.circleShouldFillInMs = - // (this.allTapTimings[1] - this.allTapTimings[0]) * 3 * 1000; - // this.perfectTapTime = this.circleShouldFillInMs / 3 / 1000; - // this.goodTapTime = this.circleShouldFillInMs / 2 / 1000; - // this.showTapTimings = createBeatsGroupWithInterval( - // this.allTapTimings, - // this.beatsGroupLength, - // 4, - // 12 - // ); - // this.noOfRaceTracks = data.noOfRaceTracks || 5; - // this.selectedTracks = duplicateArrayElemToN( - // data.selectedTracks, - // this.noOfRaceTracks - // ); - // this.enableMotion = data.enableMotion; - // this.canvasWidth = data.width; - // this.marbleRadius = (22 / 414) * this.canvasWidth * this.dpr; - // if (data.height) this.canvasHeight = data.height; - // this.centerX = this.cameras.main.width / 2; - // this.centerY = this.cameras.main.height / 2; - // this.trailConfig.scale.end = data.trailEndSize; - // this.trailConfig.lifespan = data.trailsLifeSpace; - // this.trailConfig.alpha = data.trailsOpacity; - // this.dpr = window.devicePixelRatio || 2; - // this.showObstacles = data.showObstacles || false; - // this.initialGravity = data.gravityY || 0; - } - - throttledUpdate(index: number, switchOld: boolean = true) { - this.prevVoiceIdx = index; - // Logic that should be throttled - marbleRacePlayVocals(this.coverDocId, this.voices[index].id); - } - - renderWeapons() { - this.level1Hammer = this.add - .sprite( - (350 / 414) * this.canvasWidth * this.dpr, - (550 / 414) * this.canvasWidth * this.dpr, - "hammer_1" - ) - .setScale((0.1 / 414) * this.canvasWidth * this.dpr) - .setScrollFactor(0) - .setInteractive() - .on("pointerdown", () => { - this.damageMultipliyer = 1; - }); - - this.level2Hammer = this.add - .sprite( - (350 / 414) * this.canvasWidth * this.dpr, - (630 / 414) * this.canvasWidth * this.dpr, - "hammer_2" - ) - .setScale((0.1 / 414) * this.canvasWidth * this.dpr) - .setScrollFactor(0) - .setInteractive() - .on("pointerdown", () => { - this.damageMultipliyer = 1.5; - }); - } - - createTextureMask = ( - xOffset: number, - yOffset: number, - baseSprite: Phaser.Physics.Matter.Sprite | Phaser.Physics.Matter.Image - ) => { - // Create the texture sprite - const textureSprite = this.add.sprite(xOffset, yOffset, "textureImage"); - textureSprite.setScale(this.dpr); - - // Use the base sprite's texture as a mask for the texture sprite - const mask = new Phaser.Display.Masks.BitmapMask(this, baseSprite); - textureSprite.setMask(mask); - - // Optionally, hide the base sprite if you only want to show the texture - baseSprite.setVisible(false); - }; - - createCrossScreen = ( - startOffset: number, - canvasWidth: number, - miniShapes: any - ) => { - // TODO: Scale the sprite - startOffset += 151; - const l1CrossLeft = this.matter.add.sprite( - 18 * this.dpr, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ); - l1CrossLeft.setScale(this.dpr); - this.crossRightRotation.push(l1CrossLeft); - const l1CrossRight = this.matter.add.sprite( - canvasWidth - 18 * this.dpr, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ); - l1CrossRight.setScale(this.dpr); - this.crossLeftRotation.push(l1CrossRight); - startOffset += 200 * this.dpr; - const l2CrossLeft = this.matter.add.sprite( - 126 * this.dpr, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ); - l2CrossLeft.setScale(this.dpr); - this.crossLeftRotation.push(l2CrossLeft); - const l2CrossRight = this.matter.add.sprite( - canvasWidth - 126 * this.dpr, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ); - l2CrossRight.setScale(this.dpr); - this.crossRightRotation.push(l2CrossRight); - startOffset += 200 * this.dpr; - const l3CrossLeft = this.matter.add.sprite( - 18 * this.dpr, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ); - l3CrossLeft.setScale(this.dpr); - this.crossRightRotation.push(l3CrossLeft); - const l3CrossRight = this.matter.add.sprite( - canvasWidth - 18 * this.dpr, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ); - l3CrossRight.setScale(this.dpr); - this.crossLeftRotation.push(l3CrossRight); - startOffset += 200 * this.dpr; - const l4CrossLeft = this.matter.add.sprite( - 126 * this.dpr, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ); - l4CrossLeft.setScale(this.dpr); - this.crossLeftRotation.push(l4CrossLeft); - const l4CrossRight = this.matter.add.sprite( - canvasWidth - 126 * this.dpr, - startOffset, - "02_cross", - undefined, - { - shape: miniShapes["02"], - isStatic: true, - } - ); - l4CrossRight.setScale(this.dpr); - this.crossRightRotation.push(l4CrossRight); - - return startOffset + 500 * this.dpr; - }; - createSeesawScreen = ( - xOffset: number, - startOffset: number, - prodShapes: any, - miniShapes: any, - obstaclesShapes: any - ) => { - const baseSprite = this.matter.add - .sprite(xOffset, startOffset, "prod_texture_loaded_06", undefined, { - shape: prodShapes["06"], - isStatic: true, - }) - .setScale(this.dpr * (this.canvasWidth / (512 - 100))); - const yOffset = startOffset + baseSprite.height / 2; - baseSprite.setPosition(xOffset, yOffset); - const seesawX = xOffset - 2; - // 132 for 414 width - // 110 for 344 width - // FOrumula (132/414)*width + 30 - const seesawContraintY = -(132 / 414) * this.canvasWidth; - const seesawY = yOffset + seesawContraintY; - const seesaw = this.matter.add - .sprite(seesawX, seesawY, "06b", undefined, { - shape: miniShapes["06b"], - // isStatic: true, - }) - .setScale(this.dpr); - const contraint = this.matter.constraint.create({ - bodyA: seesaw.body as BodyType, - bodyB: baseSprite.body as BodyType, - pointA: { x: 0, y: 0 }, - pointB: { - x: -2, - y: seesawContraintY * this.dpr, - }, - stiffness: 1, - length: 0, - }); - if (this.showObstacles) { - const randomObstaclePosition = _.sample([ - [this.centerX, seesawY - 200], - [this.centerX - 100, seesawY], - [this.centerX + 100, seesawY], - [this.centerX, seesawY + 200], - [this.centerX - 100, seesawY + 400], - [this.centerX + 100, seesawY + 400], - ]); - - const randomObstacle = _.sample(ObstacleNames); - if (randomObstaclePosition && randomObstacle) { - const target = this.matter.add - .sprite( - randomObstaclePosition[0], - randomObstaclePosition[1], - `obstacle_${randomObstacle}`, - undefined, - { - shape: obstaclesShapes[ - randomObstacle as keyof typeof obstaclesShapes - ], - friction: 0, - frictionAir: 0, - frictionStatic: 0, - } - ) - .setScale((0.17 / 414) * this.canvasWidth * this.dpr); - target.setInteractive(); - target.on("pointerdown", (e: any) => { - this.handleDamage(target, e); - }); - } - } - this.matter.world.add(contraint); - this.createTextureMask(seesawX, seesawY, seesaw); - this.createTextureMask(xOffset, yOffset, baseSprite); - return startOffset + baseSprite.height * this.dpr; - }; - createCircleBlockers = ( - xOffset: number, - startOffset: number, - prodShapes: any - ) => { - const yOffset = startOffset + 833 / 2; - const baseSprite = this.matter.add - .sprite(xOffset, yOffset, "prod_texture_loaded_21", undefined, { - shape: prodShapes["21"], - isStatic: true, - }) - .setScale(this.dpr * (this.canvasWidth / (512 - 100))); - this.createTextureMask(xOffset, yOffset, baseSprite); - return startOffset + baseSprite.height * this.dpr; - }; - createStarRotations = (_startOffset: number, miniShapes: any) => { - // TODO: Scale the sprite - // Stars - const barWidth = 0; - let startOffset = _startOffset + 250; - // this.matter.add.sprite( - // barWidth / 2, - // startOffset + 270, - // "bar", - // undefined, - // { - // shape: miniShapes["bar"], - // isStatic: true, - // } - // ); - // this.matter.add.sprite(487, startOffset + 270, "bar", undefined, { - // shape: miniShapes["bar"], - // isStatic: true, - // }); - - // First Row - this.leftRotatableStars.push( - this.matter.add - .sprite( - ((115 / 414) * this.canvasWidth + barWidth) * this.dpr, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) - .setScale((1 / 414) * this.canvasWidth * this.dpr) - .setAngle(35) - ); - - this.rightRotatableStars.push( - this.matter.add - .sprite( - ((305 / 414) * this.canvasWidth + barWidth) * this.dpr, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) - .setScale((1 / 414) * this.canvasWidth * this.dpr) - ); - // Second Row - startOffset += 165 * this.dpr; - this.rightRotatableStars.push( - this.matter.add - .sprite( - ((10 / 414) * this.canvasWidth + barWidth) * this.dpr, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) - .setScale((1 / 414) * this.canvasWidth * this.dpr) - .setAngle(5) - ); - this.rightRotatableStars.push( - this.matter.add - .sprite( - ((206 / 414) * this.canvasWidth + barWidth) * this.dpr, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) - .setScale((1 / 414) * this.canvasWidth * this.dpr) - // .setAngle() - ); - this.leftRotatableStars.push( - this.matter.add - .sprite( - ((400 / 414) * this.canvasWidth + barWidth) * this.dpr, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) - .setScale(this.dpr) - .setAngle(35) - ); - // Third Row - startOffset += 180 * this.dpr; - this.leftRotatableStars.push( - this.matter.add - .sprite( - ((115 / 414) * this.canvasWidth + barWidth) * this.dpr, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) - .setScale(this.dpr) - .setAngle(30) - ); - this.rightRotatableStars.push( - this.matter.add - .sprite( - ((305 / 414) * this.canvasWidth + barWidth) * this.dpr, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) - .setScale(this.dpr) - .setAngle(5) - ); - // Fourth Row - startOffset += 160 * this.dpr; - this.rightRotatableStars.push( - this.matter.add - .sprite( - ((10 / 414) * this.canvasWidth + barWidth) * this.dpr, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) - .setScale(this.dpr) - .setAngle(8) - ); - this.leftRotatableStars.push( - this.matter.add - .sprite( - ((210 / 414) * this.canvasWidth + barWidth) * this.dpr, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) - .setScale(this.dpr) - .setAngle(30) - ); - this.leftRotatableStars.push( - this.matter.add - .sprite( - ((400 / 414) * this.canvasWidth + barWidth) * this.dpr, - startOffset, - "mini_star", - undefined, - { - shape: miniShapes["14"], - isStatic: true, - } - ) - .setScale(this.dpr) - .setAngle(35) - ); - return startOffset + 500 * this.dpr; - }; - - createStaticTriangles = ( - xOffset: number, - startOffset: number, - prodShapes: any, - obstaclesShapes: any - ) => { - const yOffset = startOffset + 833 / 2; - const baseSprite = this.matter.add - .sprite(xOffset, yOffset, "prod_texture_loaded_03", undefined, { - shape: prodShapes["03"], - isStatic: true, - }) - .setScale(this.dpr * (this.canvasWidth / (512 - 100))); - this.createTextureMask(xOffset, yOffset, baseSprite); - if (this.showObstacles) { - const randomObstaclePosition = _.sample([ - [100, startOffset], - [350, startOffset], - [this.centerX, startOffset + 200], - [100, startOffset + 400], - [400, startOffset + 400], - ]); - - const randomObstacle = _.sample(ObstacleNames); - if (randomObstaclePosition && randomObstacle) { - const target = this.matter.add.sprite( - randomObstaclePosition[0], - randomObstaclePosition[1], - `obstacle_${randomObstacle}`, - undefined, - { - shape: obstaclesShapes[ - randomObstacle as keyof typeof obstaclesShapes - ], - // angle: 124, - friction: 0, - frictionAir: 0, - frictionStatic: 0, - } - ); - target.setScale((0.17 / 414) * this.canvasWidth * this.dpr); - target.setInteractive(); - target.on("pointerdown", (e: any) => { - this.handleDamage(target, e); - }); - } - } - return startOffset + baseSprite.height * this.dpr; - }; - - handleDamage(target: Phaser.Physics.Matter.Sprite, e: any) { - // Logic for handling damage - console.log("Damage dealt to the target!"); - if (this.damageMultipliyer) { - target.setScale(target.scale / (1.1 * this.damageMultipliyer)); - const particleConfig = { - speed: { min: -50, max: 50 }, - scale: { start: 0.01, end: 0.1 }, - blendMode: "ADD", - // lifespan: 400, - alpha: 0.5, - particleBringToTop: true, - }; - const particle = this.add.particles( - e.worldX, - e.worldY, - "whack", - particleConfig - ); - // Add an event listener to destroy the emitter after the particles' lifespan - this.time.delayedCall( - 200, - () => { - // emitter.stop(); - particle.destroy(); // Destroys the particle manager and emitter - }, - [], - this - ); - // Play sound - if (this.damageMultipliyer === 1) - this.sound.play("low_whack", { volume: 0.5 }); - else this.sound.play("high_whack", { volume: 0.5 }); - } - if (target.scale <= 0.08) { - target.destroy(); - } - - // // Example: reduce health, show effects, etc. - // target.health = (target.health || 100) - 10; // Example: reduce health by 10 - // console.log("Target health:", target.health); - - // if (target.health <= 0) { - // console.log("Target destroyed!"); - // target.destroy(); // Destroy the target if health is 0 - // } - } - - createReduceSizeSlider = ( - xOffset: number, - startOffset: number, - prodShapes: any - ) => { - this.reduceSizeScreenOffset.push(startOffset - 400); - const yOffset = startOffset + 833 / 2; - const baseSprite = this.matter.add - .sprite( - xOffset + 3.5, - yOffset, - "prod_texture_loaded_16", - undefined, - { - shape: prodShapes["16"], - isStatic: true, - } - ) - .setScale(this.dpr * (this.canvasWidth / (512 - 100))); - // .setScale(this.cameras.main.width / 414); - this.createTextureMask(xOffset, yOffset, baseSprite); - startOffset += baseSprite.height * this.dpr; - this.increaseSizeScreenOffset.push(startOffset); - startOffset += 300; - return startOffset; - }; - createStopperSlider = ( - xOffset: number, - startOffset: number, - prodShapes: any - ) => { - // TODO: Scale the sprite - const yOffset = startOffset + 833 / 2; - const baseSprite = this.matter.add.sprite( - xOffset - 4, - yOffset, - "prod_texture_loaded_11", - undefined, - { - shape: prodShapes["11"], - isStatic: true, - } - ); - // .setScale(this.cameras.main.width / 414); - // Motion parts - this.upDownMotionElems.push( - { - matter: this.matter.add - .image(318, startOffset + 122, "left_block", undefined, { - isStatic: true, - }) - .setScale(0.18, 0.18), - startX: 315, - startY: startOffset + 122, - maxTop: 1, - maxBottom: 38, - moveSpeed: 0.1, - direction: "right", - } - // .setAngle(7.1) - ); - this.upDownMotionElems.push( - { - matter: this.matter.add - .image(102.8, startOffset + 275, "right_block", undefined, { - isStatic: true, - }) - .setScale(0.18, 0.18), - startX: 102.8, - startY: startOffset + 275, - maxTop: 1, - maxBottom: 28, - moveSpeed: 0.2, - direction: "left", - } - // .setAngle(7.1) - ); - this.upDownMotionElems.push( - { - matter: this.matter.add - .image(314, startOffset + 418, "left_block", undefined, { - isStatic: true, - }) - .setScale(0.18, 0.18), - startX: 314, - startY: startOffset + 418, - maxTop: 15, - maxBottom: -18, - moveSpeed: 0.15, - direction: "right", - } - // .setAngle(7.1) - ); - this.upDownMotionElems.push( - { - matter: this.matter.add - .image(102.8, startOffset + 568, "right_block", undefined, { - isStatic: true, - }) - .setScale(0.18, 0.18), - startX: 102.8, - startY: startOffset + 568, - maxTop: 1, - maxBottom: 28, - moveSpeed: 0.18, - direction: "left", - } - // .setAngle(7.1) - ); - this.upDownMotionElems.push( - { - matter: this.matter.add - .image(314, startOffset + 713, "left_block", undefined, { - isStatic: true, - }) - .setScale(0.18, 0.18), - startX: 314, - startY: startOffset + 713, - maxTop: 1, - maxBottom: 28, - moveSpeed: 0.1, - direction: "right", - } - // .setAngle(7.1) - ); - //TODO for the right & left blocks - this.upDownMotionElems - .map((e) => e.matter) - .map((image) => this.createTextureMask(image.x, image.y, image)); - this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite); - return startOffset + 842; - }; - createStaticCircles = ( - xOffset: number, - startOffset: number, - prodShapes: any, - obstaclesShapes: any - ) => { - const baseSprite = this.matter.add - .sprite(xOffset, startOffset, "prod_texture_loaded_01", undefined, { - shape: prodShapes["01"], - isStatic: true, - }) - .setScale(this.dpr * (this.canvasWidth / (512 - 100))); - const yOffset = startOffset + baseSprite.height / 2; - baseSprite.setPosition(baseSprite.x, yOffset); - this.createTextureMask(xOffset, yOffset, baseSprite); - if (this.showObstacles) { - const randomObstaclePosition = _.sample([ - [150, startOffset], - [350, startOffset], - [150, startOffset + 300], - [this.centerX, startOffset + 200], - [390, startOffset + 200], - [150, startOffset + 400], - [350, startOffset + 400], - [this.centerX, startOffset + 600], - ]); - const randomObstacle = _.sample(ObstacleNames); - if (randomObstaclePosition && randomObstacle) { - const target = this.matter.add.sprite( - randomObstaclePosition[0], - randomObstaclePosition[1], - `obstacle_${randomObstacle}`, - undefined, - { - shape: obstaclesShapes[ - randomObstacle as keyof typeof obstaclesShapes - ], - friction: 0, - frictionAir: 0, - frictionStatic: 0, - } - ); - target.setScale((0.17 / 414) * this.canvasWidth * this.dpr); - target.setInteractive(); - target.on("pointerdown", (e: any) => { - this.handleDamage(target, e); - }); - } - } - return startOffset + baseSprite.height * this.dpr; - }; - createZigzagSlider = ( - xOffset: number, - startOffset: number, - prodShapes: any, - obstaclesShapes: any - ) => { - const baseSprite = this.matter.add.sprite( - xOffset, - startOffset, - "prod_texture_loaded_07", - undefined, - { - shape: prodShapes["07"], - isStatic: true, - } - ); - baseSprite.setPosition( - baseSprite.x, - startOffset + baseSprite.height / 2 - ); - baseSprite.setScale(this.dpr * (this.canvasWidth / (512 - 100))); - this.createTextureMask( - xOffset, - startOffset + baseSprite.height / 2, - baseSprite - ); - if (this.showObstacles) { - const randomObstaclePosition = _.sample([ - [140, startOffset], - [350, startOffset], - [150, startOffset + 200], - [350, startOffset + 200], - [150, startOffset + 400], - [350, startOffset + 400], - ]); - const randomObstacle = _.sample(ObstacleNames); - if (randomObstaclePosition && randomObstacle) { - const target = this.matter.add - .sprite( - randomObstaclePosition[0], - randomObstaclePosition[1], - `obstacle_${randomObstacle}`, - undefined, - { - shape: obstaclesShapes[ - randomObstacle as keyof typeof obstaclesShapes - ], - // angle: 124, - friction: 0, - frictionAir: 0, - frictionStatic: 0, - } - ) - .setScale((0.17 / 414) * this.canvasWidth * this.dpr); - target.setInteractive(); - target.on("pointerdown", (e: any) => { - this.handleDamage(target, e); - }); - } - } - return startOffset + baseSprite.height * this.dpr; - }; - createMarbles = (marbleRadius: number, miniShapes: any) => { - this.largeCircle = this.matter.add.sprite( - this.centerX, - this.centerY - 100, - "wheel", - undefined, - { - shape: miniShapes["wheel"], - isStatic: true, - frictionStatic: 1, - friction: 1, - } - ); - // For Testing - // this.largeCircle.setScale(0.1); - // this.isRotating = false; - this.largeCircle.setScale( - (this.canvasWidth / this.largeCircle.width) * this.dpr - ); - const xOffsetValues = [ - this.centerX - 46, - this.centerX + 23, - this.centerX, - this.centerX + 23, - this.centerX + 46, - ]; - this.voices.map((v, i) => { - this.currentMarblesSizeIndices[i.toString()] = 0; - // const angle = i * this.angleIncrement; - // const x = this.centerX + this.radius * Math.cos(angle); - // const y = this.centerY + this.radius * Math.sin(angle); - const circleBody = this.matter.add.circle( - xOffsetValues[i], - this.centerY, - marbleRadius, - { - restitution: 0.4, - // density: 0.02, - friction: 0, - frictionAir: 0, - frictionStatic: 0, - label: v.id, - } - ); - this.marbles.push(circleBody); - this.marbleTrailParticles.push( - this.add.particles(0, 0, "trail", { - ...this.trailConfig, - follow: circleBody.position, - }) - ); - - // circleBody.emitter = emitter; - // this.trailsGroup.push(this.add.group()); - // this.trailGraphics.push(this.add.graphics()); - // this.trailPoints.push([]); - // // Create an image and attach it to the circle body - const circleImage = this.add - .image( - circleBody.position.x, - circleBody.position.y, - `resized_${v.id}` - ) - .setDepth(1); - circleImage.setDisplaySize(marbleRadius * 2, marbleRadius * 2); - circleImage.setOrigin(0.5, 0.5); - // Circle mask - const maskShape = this.make.graphics(); - maskShape.fillStyle(0xffffff); - maskShape.fillCircle(marbleRadius, marbleRadius, marbleRadius); - const mask = maskShape.createGeometryMask(); - - // Apply the mask to the image - circleImage.setMask(mask); - this.marblesMasks.push(maskShape); - - this.marblesImages.push(circleImage); - // Create label for each circle - let label = this.add.text( - circleImage.x, - circleImage.y - 560, - this.voices[i].name, - { - fontSize: "32px", - color: "#ffffff", - stroke: "#000", - strokeThickness: 4, - } - ); - label.setDepth(1); - this.labels.push(label); - }); - this.countdownText = this.add - .text(this.centerX, this.centerY - 100, "3", { - fontSize: `${64 * this.dpr}px`, - color: "#ffffff", - }) - .setOrigin(0.5); - }; - createHorizontalCrosses = ( - canvasWidth: number, - _startOffset: number, - miniShapes: any - ) => { - this.reduceSizeScreenOffset.push(_startOffset - 300); - let startOffset = _startOffset + 200; - let leftOffset = 20; - let rightOffset = canvasWidth - 20; - new Array(5).fill("").map(() => { - this.horizontalCrossRightRotation.push( - this.matter.add - .sprite(leftOffset, startOffset, "02_cross", undefined, { - shape: miniShapes["02"], - isStatic: true, - }) - .setScale((0.8 / 414) * this.canvasWidth * this.dpr) - ); - leftOffset += (80 / 414) * this.canvasWidth * this.dpr; - }); - startOffset += (250 / 414) * this.canvasWidth * this.dpr; - new Array(5).fill("").map(() => { - this.horizontalCrossLeftRotation.push( - this.matter.add - .sprite(rightOffset, startOffset, "02_cross", undefined, { - shape: miniShapes["02"], - isStatic: true, - }) - .setScale((0.8 / 414) * this.canvasWidth * this.dpr) - ); - rightOffset -= (80 / 414) * this.canvasWidth * this.dpr; - }); - leftOffset = 20; - startOffset += (250 / 414) * this.canvasWidth * this.dpr; - new Array(5).fill("").map(() => { - this.horizontalCrossRightRotation.push( - this.matter.add - .sprite(leftOffset, startOffset, "02_cross", undefined, { - shape: miniShapes["02"], - isStatic: true, - }) - .setScale((0.8 / 414) * this.canvasWidth * this.dpr) - ); - leftOffset += (80 / 414) * this.canvasWidth * this.dpr; - }); - rightOffset = canvasWidth - 20; - startOffset += (250 / 414) * this.canvasWidth * this.dpr; - new Array(5).fill("").map(() => { - this.horizontalCrossLeftRotation.push( - this.matter.add - .sprite(rightOffset, startOffset, "02_cross", undefined, { - shape: miniShapes["02"], - isStatic: true, - }) - .setScale((0.8 / 414) * this.canvasWidth * this.dpr) - ); - rightOffset -= (80 / 414) * this.canvasWidth * this.dpr; - }); - this.increaseSizeScreenOffset.push(startOffset); - return startOffset + 500 * this.dpr; - }; - showResult() { - const labelContent = this.winnerIdx === 1 ? "You Win!" : "You Lose"; - const xpContent = this.winnerIdx === 1 ? "+500 XP" : "+0 XP"; - - const label = this.add - .text(this.centerX, this.centerY - 180, labelContent, { - fontSize: `${64 * this.dpr}px`, - color: "#ffffff", - stroke: "#000", - strokeThickness: 4, - }) - .setScrollFactor(0); - label.setDepth(1); - label.setPosition( - label.x - label.width / 2, - label.y - label.height / 2 - ); - const labelXp = this.add - .text(this.centerX, this.centerY + 250, xpContent, { - fontSize: `${52 * this.dpr}px`, - color: "#573FC8", - stroke: "#fff", - strokeThickness: 4, - }) - .setScrollFactor(0); - // .setScale(this.dpr); - labelXp.setDepth(1); - labelXp.setPosition( - labelXp.x - labelXp.width / 2, - labelXp.y - labelXp.height / 2 - ); - EventBus.emit("game-over", this.winnerIdx === 1); - this.isResultShown = true; + // this.throttledUpdate = _.throttle(this.throttledUpdate.bind(this), 10); // Throttle interval in milliseconds } create() { console.log("Game Scene..."); - // if (this.showObstacles) { - // this.sound.add("low_whack", { loop: false, volume: 0.5 }); - // this.sound.add("high_whack", { loop: false, volume: 0.5 }); - // } - // // Center the background image - const centerX = this.cameras.main.width / 2; - // if (!this.enableMotion) { - const centerY = this.cameras.main.height / 2; - const bg = this.add - .image(centerX, centerY, "background") - .setScrollFactor(0); - bg.setDisplaySize(this.cameras.main.width, this.cameras.main.height); - // } else { - // this.background = this.add - // .tileSprite(0, 0, 0, 0, "background") - // .setScrollFactor(0) - // .setOrigin(0, 0); - // this.background.setScale( - // (414 / this.background.width) * this.dpr, - // (736 / this.background.height) * this.dpr - // ); - // this.add - // .image(this.centerX, this.centerY, "center_logo") - // .setDisplaySize(254, 84) - // .setScrollFactor(0); - // } - - // const siteUrl = this.add - // .text(this.centerX, this.centerY, "marblerace.ai", { - // fontSize: `${24 * this.dpr}px`, - // color: "#ffffff", - // stroke: "rgba(0,0,0,0.5)", - // strokeThickness: 2, - // }) - // .setScrollFactor(0); - // siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, siteUrl.y + 100); - // // siteUrl.setScale(this.dpr); - // // siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, siteUrl.y); - // // Enable camera scrolling - // const canvasWidth = this.cameras.main.width; - - // var prodShapes = this.cache.json.get("prod_shapes"); - // var miniShapes = this.cache.json.get("mini_shapes"); - // var obstaclesShapes = this.cache.json.get("obstacles_shapes"); - - // let startOffset = 800 * this.dpr; - // const xOffset = this.centerX; - // // this.selectedTracks = ["06", "07", "03", "01", "16"]; - // this.selectedTracks.map((trackNo) => { - // switch (trackNo) { - // case "01": - // startOffset = this.createStaticCircles( - // xOffset, - // startOffset, - // prodShapes, - // obstaclesShapes - // ); - // break; - // case "02": - // startOffset = this.createCrossScreen( - // startOffset, - // canvasWidth, - // miniShapes - // ); - // break; - // case "03": - // startOffset = this.createStaticTriangles( - // xOffset, - // startOffset, - // prodShapes, - // obstaclesShapes - // ); - // break; - // case "06": - // startOffset = this.createSeesawScreen( - // xOffset, - // startOffset, - // prodShapes, - // miniShapes, - // obstaclesShapes - // ); - // break; - // case "07": - // startOffset = this.createZigzagSlider( - // xOffset, - // startOffset, - // prodShapes, - // obstaclesShapes - // ); - // break; - // case "11": - // startOffset = this.createStopperSlider( - // xOffset, - // startOffset, - // prodShapes - // ); - // break; - // case "14": - // startOffset = this.createStarRotations( - // startOffset, - // miniShapes - // ); - // break; - // case "16": - // startOffset = this.createReduceSizeSlider( - // xOffset, - // startOffset, - // prodShapes - // ); - // break; - // case "21": - // startOffset = this.createCircleBlockers( - // xOffset, - // startOffset, - // prodShapes - // ); - // break; - // case "22": - // startOffset = this.createHorizontalCrosses( - // canvasWidth, - // startOffset, - // miniShapes - // ); - // break; - // } - // }); - // const finishOffset = startOffset + 250; - // this.add.image(centerX, finishOffset, "finish_line").setScale(0.5); - // this.finishLineOffset = finishOffset; - // // .setDisplaySize(960, 40); - // this.cameras.main.setBounds( - // 0, - // 0, - // this.cameras.main.width, - // finishOffset + 250 - // ); - // this.matter.world.setBounds( - // 0, - // 0, - // this.cameras.main.width, - // finishOffset + 800 - // ); - - // this.createMarbles(this.marbleRadius, miniShapes); - // this.crossLeftRotation.map((baseSprite) => - // this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) - // ); - // this.crossRightRotation.map((baseSprite) => - // this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) - // ); - // [...this.leftRotatableStars, ...this.rightRotatableStars].map( - // (baseSprite) => - // this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) - // ); - // [ - // ...this.horizontalCrossLeftRotation, - // ...this.horizontalCrossRightRotation, - // ].map((baseSprite) => - // this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) - // ); - - // let coundownValue = 3; - // // Start Countdown: - // const clock = this.time.addEvent({ - // delay: 1000, - // repeat: 2, - // callback: () => { - // if (this.countdownText) { - // coundownValue--; - // if (coundownValue > 0) { - // this.countdownText.setText(coundownValue.toString()); - // } else { - // this.countdownText.setText("Go!"); - // console.log("Go!"); - // // remove the large circle - // if (this.largeCircle?.body) { - // this.matter.world.remove( - // this.largeCircle.body, - // true - // ); - // this.largeCircle.destroy(); - // // this.matter.world.remove(this.largeCircle); - // } - // this.isRotating = false; - // this.countdownText.destroy(); - // clock.destroy(); - // this.cameras.main.startFollow(this.marblesImages[0]); - // } - // } - // }, - // }); - // marbleRaceOnlyInstrument( - // this.coverDocId, - // 120, - // this.musicStartOffset - // ).then(() => (this.isInstrumentPlaying = true)); - // // if (this.showObstacles) this.renderWeapons(); - // this.renderJoystickButtons(); - } - - graphics: Phaser.GameObjects.Graphics | undefined; - circle1: Phaser.GameObjects.Sprite | undefined; - outlineCircle1: Phaser.GameObjects.Sprite | undefined; - circle2: Phaser.GameObjects.Sprite | undefined; - outlineCircle2: Phaser.GameObjects.Sprite | undefined; - circle3: Phaser.GameObjects.Sprite | undefined; - outlineCircle3: Phaser.GameObjects.Sprite | undefined; - circle4: Phaser.GameObjects.Sprite | undefined; - outlineCircle4: Phaser.GameObjects.Sprite | undefined; - setIntervals: NodeJS.Timeout[] = []; - setTimeouts: NodeJS.Timeout[] = []; - tapTimings: number[] = []; - allTapTimings: number[] = []; - circleShouldFillInMs = 0; - showTapTimings: number[] = []; - currentTapIndex = 0; - beatsGroupLength = 8; - - availableCircles: Phaser.GameObjects.Sprite[] = []; - innerCircles: Phaser.GameObjects.Sprite[] = []; - outlineCircles: Phaser.GameObjects.Sprite[] = []; - - resultLabel: Phaser.GameObjects.Text | undefined; - tapScore: number = 0; - isBoosted = false; - - buttonRadius = 40 * this.dpr; - joystickHolder: Phaser.GameObjects.Container | undefined; - joystickFrame: Phaser.GameObjects.Image | undefined; - hasGroupPassed = true; - - renderJoystickButtons() { - const frameHeight = this.cameras.main.height / 3; - let circleYOffset = - this.cameras.main.height / 2 + frameHeight - this.buttonRadius; - // .image(0, 0, "joystick_frame") - // .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); - this.circle1 = this.add - .sprite( - this.cameras.main.width / 2 - 200, - circleYOffset, - "green_dot" - ) - .setDisplaySize(0, 0) - .setScrollFactor(0); - - this.outlineCircle1 = this.add - .sprite( - this.cameras.main.width / 2 - 200, - circleYOffset, - "green_dot_outline" - ) - .setScrollFactor(0) - .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); - this.circle2 = this.add - .sprite( - this.cameras.main.width / 2 + 200, - circleYOffset, - "green_dot" - ) - .setDisplaySize(0, 0) - .setScrollFactor(0); - - this.outlineCircle2 = this.add - .sprite( - this.cameras.main.width / 2 + 200, - circleYOffset, - "green_dot_outline" - ) - .setScrollFactor(0) - .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); - circleYOffset += this.buttonRadius * 2; - this.circle3 = this.add - .sprite( - this.cameras.main.width / 2 - this.buttonRadius, - circleYOffset, - "green_dot" - ) - .setDisplaySize(0, 0) - .setScrollFactor(0); - - this.outlineCircle3 = this.add - .sprite( - this.cameras.main.width / 2 - this.buttonRadius, - circleYOffset, - "green_dot_outline" - ) - .setScrollFactor(0) - .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); - this.circle4 = this.add - .sprite( - this.cameras.main.width / 2 + this.buttonRadius, - circleYOffset, - "green_dot" - ) - .setDisplaySize(0, 0) - .setScrollFactor(0); - - this.outlineCircle4 = this.add - .sprite( - this.cameras.main.width / 2 + this.buttonRadius, - circleYOffset, - "green_dot_outline" - ) - .setScrollFactor(0) - .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); - this.availableCircles = [ - this.circle1, - this.circle2, - this.circle3, - this.circle4, - ]; - this.innerCircles = [ - this.circle1, - this.circle2, - this.circle3, - this.circle4, - ]; - this.outlineCircles = [ - this.outlineCircle1, - this.outlineCircle2, - this.outlineCircle3, - this.outlineCircle4, - ]; - const fxs = this.outlineCircles.map((c) => { - c.preFX?.setPadding(32); - return c.preFX?.addGlow(0xffffff, 0, 0, true, 0.1, 32); - }); - this.tweens.add({ - targets: fxs, - outerStrength: 10, - }); - [...this.innerCircles, ...this.outlineCircles].map((c) => { - c.setDepth(10); - c.setAlpha(0); - }); - this.events.on("destroy", () => { - this.setTimeouts.map((timeout) => clearTimeout(timeout)); - this.setIntervals.map((interval) => clearInterval(interval)); - }); - this.joystickFrame = this.add - .image( - this.cameras.main.width / 2, - this.cameras.main.height / 2 + frameHeight, - "joystick_frame" - ) - .setDepth(9) - .setScrollFactor(0) - .setDisplaySize(this.cameras.main.width, frameHeight) - .setAlpha(0); - // this.joystickHolder = this.add - // .container( - // this.cameras.main.width / 2, - // this.cameras.main.height / 2 + frameHeight, - // [ - // this.circle1, - // this.outlineCircle1, - // this.circle2, - // this.outlineCircle2, - // this.circle3, - // this.outlineCircle3, - // this.circle4, - // this.outlineCircle4, - // ] - // ) - // .setDepth(999999) - // .setDisplaySize(this.cameras.main.width, frameHeight) - // .setScrollFactor(0); - } - isJoystickButtonsShown = false; - - hideJoystickButtons() { - this.isJoystickButtonsShown = false; - this.innerCircles.map((c) => { - c.setAlpha(0); - }); - this.outlineCircles.map((c) => { - c.setAlpha(0); - }); - this.innerCircles.map((c) => { - c.removeListener("pointerdown"); - }); - this.joystickFrame?.setTint(undefined); - this.joystickFrame?.setAlpha(0); - } - showJoystickButtons() { - this.isJoystickButtonsShown = true; - this.hasGroupPassed = false; - this.innerCircles.map((c) => { - c.setAlpha(1); - }); - this.outlineCircles.map((c) => { - c.setAlpha(1); - }); - this.joystickFrame?.setAlpha(1); } - boostMultipler: number = 0; - tapResultLabel: Phaser.GameObjects.Text | undefined; - tapResultLabelTimer: NodeJS.Timeout | undefined; - // update(time: number, delta: number): void { - // update(): void { - // const currentTime = getToneCurrentTime(); - - // if (this.tapScore >= 40) { - // this.tapScore = 0; - // this.isBoosted = true; - // this.boostMultipler = this.marbles[0].velocity.y; - // this.marbleTrailParticles[0].setConfig({ - // color: [0xfacc22, 0xf89800, 0xf83600, 0x9f0404], - // colorEase: "quad.out", - // lifespan: 2400, - // angle: { min: -100, max: -80 }, - // scale: { start: 1, end: 0, ease: "sine.out" }, - // speed: { min: 250, max: 350 }, - // advance: 2000, - // blendMode: "ADD", - // }); - // this.hideJoystickButtons(); - // // this.tapResultLabel?.destroy(); - // // this.tapResultLabel = this.add - // // .text( - // // this.cameras.main.width / 2, - // // this.cameras.main.height / 2, - // // "Boosted", - // // { - // // fontSize: `${42 * this.dpr}px`, - // // color: "white", - // // stroke: "rgba(0,0,0,1)", - // // strokeThickness: 6, - // // backgroundColor: "rgba(0,0,0,1)", - // // } - // // ) - // // .setScrollFactor(0); - // // this.tapResultLabel?.setPosition( - // // this.tapResultLabel.x - this.tapResultLabel.width / 2, - // // this.tapResultLabel.y - this.tapResultLabel.height / 2 - // // ); - // // if (this.tapResultLabelTimer) { - // // clearTimeout(this.tapResultLabelTimer); - // // } - // // this.tapResultLabelTimer = setTimeout(() => { - // // // this.matter.world.setGravity(0, this.initialGravity); - // // this.tapResultLabel?.destroy(); - // // }, 2000); - // } - // const _currentTapIndex = this.currentTapIndex; - // const nextTapTiming = - // this.showTapTimings[_currentTapIndex] - - // this.circleShouldFillInMs / 1000; - // if (currentTime >= nextTapTiming) { - // // console.log("Current Tap Idx: ", _currentTapIndex); - // this.currentTapIndex++; - // if (!this.isBoosted) { - // this.showJoystickButtons(); - // const circleToFill = _.sample(this.availableCircles); - // if (circleToFill) { - // this.availableCircles = this.availableCircles.filter( - // (c) => c !== circleToFill - // ); - // circleToFill.setInteractive(); - // circleToFill.once("pointerdown", () => { - // // Hide the Circle - // circleToFill.setDisplaySize(0, 0); - // circleToFill.setAlpha(0); - // // Add a Label at the center of the screen with scrollFactor 0 - // const newCurrentTime = getToneCurrentTime(); - // const expectedTapTime = - // this.showTapTimings[_currentTapIndex]; - // const difference = expectedTapTime - newCurrentTime; - // const resultText = - // difference < this.perfectTapTime - // ? "Perfect" - // : difference < this.goodTapTime - // ? "Good" - // : "Miss"; - // this.tapScore += - // resultText === "Perfect" - // ? 10 - // : resultText === "Good" - // ? 5 - // : 0; - // // Set green/success tint to the joystick frame - // // green: #00ff00 - // // red: #ff0000 - // // yellow: #ffff00 - // this.joystickFrame?.setTint( - // resultText === "Perfect" - // ? 0xffff00 - // : resultText === "Good" - // ? 0xffff00 - // : 0xff0000 - // ); - // // this.tapResultLabel?.destroy(); - // // this.tapResultLabel = this.add - // // .text( - // // this.cameras.main.width / 2, - // // this.cameras.main.height / 2, - // // resultText, - // // { - // // fontSize: `${42 * this.dpr}px`, - // // color: - // // resultText === "Perfect" - // // ? "green" - // // : resultText === "Good" - // // ? "yellow" - // // : "red", - // // stroke: "rgba(0,0,0,1)", - // // strokeThickness: 6, - // // backgroundColor: "rgba(0,0,0,1)", - // // } - // // ) - // // .setScrollFactor(0); - // // this.tapResultLabel.setPosition( - // // this.tapResultLabel.x - - // // this.tapResultLabel.width / 2, - // // this.tapResultLabel.y - - // // this.tapResultLabel.height / 2 - // // ); - // if (this.tapResultLabelTimer) { - // // this.joystickFrame?.setTint(undefined); - // clearTimeout(this.tapResultLabelTimer); - // } - - // // Destroy the label after 1 second - // this.tapResultLabelTimer = setTimeout(() => { - // this.joystickFrame?.setTint(undefined); - // // this.tapResultLabel?.destroy(); - // }, 500); - // circleToFill.removeInteractive(); - // this.availableCircles.push(circleToFill); - // }); - // // Gradually Increase the radius of the circle to be 80 - // // Create a SetInterval - // const interval = setInterval(() => { - // if (circleToFill) { - // const radiuToIncreasePerMs = - // this.buttonRadius / - // (this.circleShouldFillInMs / 10); - - // circleToFill.setDisplaySize( - // circleToFill.displayWidth + - // radiuToIncreasePerMs * 2, - // circleToFill.displayHeight + - // radiuToIncreasePerMs * 2 - // ); - // } - // }, 10); - // this.setIntervals.push(interval); - // const timeout = setTimeout(() => { - // circleToFill.setDisplaySize(0, 0); - // this.availableCircles.push(circleToFill); - // circleToFill.removeInteractive(); - // clearInterval(interval); - // }, this.circleShouldFillInMs); - // this.setTimeouts.push(timeout); - // // } - // } - // } - // } - // if ( - // _currentTapIndex && - // _currentTapIndex % this.beatsGroupLength === 0 && - // this.hasGroupPassed === false - // ) { - // this.hasGroupPassed = true; - // // console.log("Group Passed"); - // // this.marbleTrailParticles[0].setConfig({ - // // ...this.trailConfig, - // // scale: this.marbleTrailParticles[0].scale, - // // follow: this.marbles[0].position, - // // }); - // // this.marbleTrailParticles[0].destroy(); - // this.hideJoystickButtons(); - // } - // if ( - // this.isBoosted && - // this.boostMultipler < 20 && - // this.boostMultipler > 0 - // ) { - // const firstMarble = this.marbles[0]; // TODO: User chosen marble - // this.matter.body.setVelocity(firstMarble, { - // x: firstMarble.velocity.x, - // y: this.boostMultipler, - // }); - // this.boostMultipler += 0.1; - // } - // if ( - // this.isBoosted && - // this.boostMultipler >= 20 && - // this.hasGroupPassed - // ) { - // this.isBoosted = false; - // this.boostMultipler = 0; - // this.marbleTrailParticles[0].destroy(); - // this.marbleTrailParticles[0] = this.add - // .particles(0, 0, "trail", { - // ...this.trailConfig, - // follow: this.marbles[0].position, - // }) - // .setDepth(0); - // } - - // if (this.damageMultipliyer === 1) { - // // Highlight level 1 hammer - // this.level2Hammer?.setScale( - // (0.1 / 414) * this.canvasWidth * this.dpr - // ); - // this.level1Hammer?.setScale( - // (0.2 / 414) * this.canvasWidth * this.dpr - // ); - // } else if (this.damageMultipliyer === 1.5) { - // // Highlight level 2 hammer - // this.level1Hammer?.setScale( - // (0.1 / 414) * this.canvasWidth * this.dpr - // ); - // this.level2Hammer?.setScale( - // (0.2 / 414) * this.canvasWidth * this.dpr - // ); - // } - // if (this.isGameOver && this.isResultShown === false) { - // // if (this.isResultShown) return; - // this.showResult(); - // } - // // if (this.enableMotion && !this.isRotating) - // // this.background.tilePositionX += 0.08; - // if (this.marbles.length) { - // if (this.isRotating) { - // // Update the base angle to create the circular motion - // this.baseAngle += 0.01; // Adjust this value to change the speed of rotation - // this.largeCircle?.setRotation(this.baseAngle); - // this.matter.body.setAngularVelocity( - // this.largeCircle?.body as BodyType, - // 0.15 - // ); - // } - // // Optimize marble updates - // for (let i = 0; i < this.marbles.length; i++) { - // const voiceBody = this.marbles[i]; - // const marbleImage = this.marblesImages[i]; - // const marbleMask = this.marblesMasks[i]; - // const label = this.labels[i]; - // const currentCrossIndex = - // this.currentMarblesSizeIndices[i.toString()]; - - // // Update marble image position and rotation - // if (marbleImage) { - // marbleImage.setPosition( - // voiceBody.position.x, - // voiceBody.position.y - // ); - // marbleImage.setRotation(voiceBody.angle); - // } - - // // Update marble mask position - // if (marbleMask) { - // marbleMask.setPosition( - // voiceBody.position.x - voiceBody.circleRadius, - // voiceBody.position.y - voiceBody.circleRadius - // ); - // } - - // // Update label position - // if (label) { - // label.setPosition( - // voiceBody.position.x - label.width / 2, - // voiceBody.position.y - 60 - // ); - // } - - // // Check for size changes - // const isHeightReduced = this.heightReducedIndices.includes(i); - // const y = voiceBody.position.y; - - // if ( - // isHeightReduced && - // y > this.increaseSizeScreenOffset[currentCrossIndex] - // ) { - // // Increase size - // this.currentMarblesSizeIndices[i.toString()]++; - // this.matter.body.scale(voiceBody, 2, 2); - // if (marbleImage) - // marbleImage.setDisplaySize( - // this.marbleRadius * 2, - // this.marbleRadius * 2 - // ); - // if (marbleMask) marbleMask.scale = 1; - // this.heightReducedIndices = - // this.heightReducedIndices.filter((idx) => idx !== i); - // this.marbleTrailParticles[i].setConfig(this.trailConfig); - // } else if ( - // !isHeightReduced && - // y > this.reduceSizeScreenOffset[currentCrossIndex] && - // y < this.increaseSizeScreenOffset[currentCrossIndex] - // ) { - // // Reduce size - // this.heightReducedIndices.push(i); - // this.matter.body.scale(voiceBody, 0.5, 0.5); - // if (marbleImage) - // marbleImage.setDisplaySize( - // this.marbleRadius, - // this.marbleRadius - // ); - // if (marbleMask) marbleMask.scale = 0.5; - // this.marbleTrailParticles[i].setConfig({ - // ...this.trailConfig, - // scale: { start: 0.5, end: 0.01 }, - // }); - // } - // } - // // TODO: Optimized Code - // // this.crossRightRotation.map((c) => { - // // c.setAngle(c.angle + 2); - // // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); - // // }); - // // this.crossLeftRotation.map((c) => { - // // c.setAngle(c.angle - 2); - // // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); - // // }); - // if (this.isInstrumentPlaying && this.isRotating === false) { - // // /* - // // let largest = -Infinity; - // // let secondLargest = -Infinity; - // // let largestIndex = -1; - // // let finishedPositions = []; - // // let voicesPositions = []; - - // // for (let i = 0; i < this.marbles.length; i++) { - // // const y = this.marbles[i].position.y; - // // voicesPositions.push(y); - // // if (y < this.finishLineOffset) { - // // finishedPositions.push(y); - // // if (y > largest) { - // // secondLargest = largest; - // // largest = y; - // // largestIndex = i; - // // } else if (y > secondLargest) { - // // secondLargest = y; - // // } - // // } - // // } - // // */ - // const unFinishedPositions = []; - // const finishedPositions = []; - // const voicesPositions = []; - // for (let i = 0; i < this.marbles.length; i++) { - // const y = this.marbles[i].position.y; - // voicesPositions.push(y); - // if (y < this.finishLineOffset) { - // unFinishedPositions.push(y); - // } else if (y > this.finishLineOffset) { - // finishedPositions.push(y); - // } - // } - // // Above is the refactored code - // // const voicesPositions = this.marbles.map((m) => m.position.y); - // // const unFinishedPositions = voicesPositions.filter( - // // (y) => y < this.finishLineOffset - // // ); - // // const finishedPositions = voicesPositions.filter( - // // (y) => y > this.finishLineOffset - // // ); - - // if (this.winnerIdx === -1 && finishedPositions.length) { - // this.winnerIdx = voicesPositions.indexOf( - // finishedPositions[0] - // ); - // } - // const largest = Math.max(...unFinishedPositions); - // const largestIndex = voicesPositions.findIndex( - // (v) => v === largest - // ); - // const secondLargest = Math.max( - // ...unFinishedPositions.filter((p) => p !== largest) - // ); - // if (largestIndex === -1) { - // this.isGameOver = true; - // return; - // } - // if ( - // this.prevVoiceIdx !== largestIndex && - // largest > secondLargest + this.marbleRadius - // ) - // this.throttledUpdate(largestIndex); - // // else if (secondLargest >= largest - this.marbleRadius * 2) - // // this.throttledUpdate(secondLargestIndex, false); - // if (this.autoScroll) { - // // this.cameras.main.startFollow(this.marblesImages[0]); - // // this.cameras.main.scrollY = largest - 300 * this.dpr; - // } - // } - - // // Optimised Code - // // let largest = -Infinity; - // // let secondLargest = -Infinity; - // // let index = -1; - - // // for (let i = 0; i < this.marbles.length; i++) { - // // const y = this.marbles[i].position.y; - // // if (y < this.finishLineOffset) { - // // if (y > largest) { - // // secondLargest = largest; - // // largest = y; - // // index = i; - // // } else if (y > secondLargest) { - // // secondLargest = y; - // // } - // // } - // // } - // // TODO: Uncomment this - // // this.leftRotatableStars.map((rs) => rs.setAngle(rs.angle - 0.4)); - // // this.rightRotatableStars.map((rs) => rs.setAngle(rs.angle + 0.4)); - // // this.horizontalCrossRightRotation.map((rs) => - // // rs.setAngle(rs.angle + 2.5) - // // ); - // // this.horizontalCrossLeftRotation.map((rs) => - // // rs.setAngle(rs.angle - 2.5) - // // ); - - // // Bars up/down motion - // // this.motionTimeForUpDownWard += delta; - // // this.upDownMotionElems.map( - // // ({ - // // matter, - // // startX, - // // startY, - // // moveSpeed, - // // maxBottom, - // // maxTop, - // // direction, - // // }) => { - // // const amplitude = (maxBottom - maxTop) / 2; - // // const offset = amplitude * Math.sin(time * (moveSpeed * 0.01)); - // // // // Calculate new y position using a sine wave for smooth up and down movement - // // // const range = maxBottom - maxTop; - // // // const midPoint = maxTop + range / 2; - // // // Calculate the new position considering the angle - // // if (direction === "right") { - // // const newX = - // // startX + offset * Math.sin(Phaser.Math.DegToRad(7.1)); - // // const newY = - // // startY - offset * Math.cos(Phaser.Math.DegToRad(7.1)); - // // // Update the rectangle's y position using a sine wave - // // matter.setPosition(newX, newY); - // // } else { - // // const newX = - // // startX + offset * Math.sin(Phaser.Math.DegToRad(-7.1)); - // // const newY = - // // startY - offset * Math.cos(Phaser.Math.DegToRad(-7.1)); - // // // Update the rectangle's y position using a sine wave - // // matter.setPosition(newX, newY); - // // } - // // } - // // ); - // } - // } } - -// !wget -c "https://github.com/CPJKU/beat_this/raw/main/tests/It%20Don't%20Mean%20A%20Thing%20-%20Kings%20of%20Swing.mp3" -O music.mp3 - -// !ffmpeg -i music.mp3 -f segment -segment_time 10 -c copy "music-%03d.mp3" - diff --git a/src/game/scenes/Preloader.ts b/src/game/scenes/Preloader.ts index eceea1c..944fe7a 100644 --- a/src/game/scenes/Preloader.ts +++ b/src/game/scenes/Preloader.ts @@ -6,16 +6,6 @@ export type GameVoiceInfo = { name: string; avatar: string; }; -export const ObstacleNames = [ - "shiba", - "appalled_girlfriend", - "distracted_boyfriend", - "harold", - "meme_man", - "pedro", - "roll_safe", - "wojack", -]; export default class Preloader extends Phaser.Scene { public params: IGameDataParams; constructor() { @@ -26,310 +16,13 @@ export default class Preloader extends Phaser.Scene { this.params = data; } - // Create an off-screen canvas - canvas = document.createElement("canvas"); - resize(img: HTMLImageElement) { - const targetWidth = 46; - const targetHeight = 46; - const canvas = this.canvas; - const ctx = canvas.getContext("2d"); - - // Set initial size to original image size - let width = img.width; - let height = img.height; - if (!ctx) return; - // Resample in steps - while (width > 2 * targetWidth && height > 2 * targetHeight) { - width = Math.floor(width / 2); - height = Math.floor(height / 2); - - // Resize the canvas to the new size - canvas.width = width; - canvas.height = height; - - // Draw the image onto the canvas - ctx.drawImage(img, 0, 0, width, height); - } - - // Now, do the final resize to the target dimensions - canvas.width = targetWidth; - canvas.height = targetHeight; - - // Set high quality for the final resize - ctx.imageSmoothingEnabled = true; - ctx.imageSmoothingQuality = "high"; - - // Draw the image at the final size - ctx.drawImage(img, 0, 0, 46, 46); - - // canvas.toBlob((blob) => { - // if (blob) { - // const blobUrl = URL.createObjectURL(blob); - // const img = new Image(); - // img.src = blobUrl; - // img.crossOrigin = "anonymous"; - // const texture = this.textures.addImage("resizedImage", img); - // this.add.image(100, 100, "resizedImage").setOrigin(0.5, 0.5); - // } - // }); - - // Pass the resized image data to the callback - return canvas.toDataURL(); - } preload() { console.log("Preloader..."); - // this.load.image( - // "green_dot", - // "assets/sprite/rhythmicpads/green_dot.png" - // ); - // this.load.image( - // "green_dot_outline", - // "assets/sprite/rhythmicpads/green_dot_outline.png" - // ); - // this.load.image( - // "joystick_frame", - // "assets/sprite/rhythmicpads/joystick_frame.jpg" - // ); - this.load.image("background", this.params.backgroundPath); - // ObstacleNames.map((name) => { - // this.load.image( - // `obstacle_${name}`, - // `assets/sprite/obstacles/${name}.png` - // ); - // }); - // this.load.image("hammer_1", "assets/sprite/weapons/hammer_level_1.png"); - // this.load.image("hammer_2", "assets/sprite/weapons/hammer_level_2.png"); - // this.load.image("whack", "/assets/sprite/weapons/whack.png"); - // this.load.audio("low_whack", "/assets/sounds/low_whack.wav"); - // this.load.audio("high_whack", "/assets/sounds/high_whack.wav"); - // if (this.params.enableMotion) - // this.load.image("center_logo", "assets/transparent_logo.png"); - // // TODO: Enable the below and comment out the rest of the images - // if (this.params.voices.length) { - // this.params.voices.map((voice) => { - // // this.load.image(voice.id, voice.avatar); - // // const image = new Image(); - // // image.src = voice.avatar; - // // image.crossOrigin = "anonymous"; - // // new Promise((res) => { - // // image.onload = () => { - // // const dataUrl = this.resize(image); - // // res(dataUrl); - // // }; - // // }).then((dataurl) => { - // // // Add the newly created image as a texture - // // // this.textures.addBase64(`resized_${voice.id}`, dataurl); - // // this.load.image(`resized_${voice.id}`, dataurl as string); - // // }); - // this.load.image(`resized_${voice.id}`, voice.avatar); - // this.load.image( - // `resized_${voice.id}_mouth`, - // `https://voxaudio.nusic.fm/voice_models%2Favatars%2Fthumbs%2Fgifs%2F${voice.id}_200x200.png?alt=media` - // ); - // }); - // } - // // this.load.json( - // // "screen_sprite_data", - // // "assets/sprite/screen_sprite.json" - // // ); - // // ["01", "16", "03", "07", "06"] - // this.params.selectedTracks.map((trackNo) => { - // switch (trackNo) { - // case "01": - // this.load.image( - // "prod_texture_loaded_01", - // "assets/sprite/01.png" - // ); - // break; - // case "02": - // case "22": - // this.load.image("02_cross", "assets/sprite/02_cross.png"); - // break; - // case "03": - // this.load.image( - // "prod_texture_loaded_03", - // "assets/sprite/03.png" - // ); - // break; - // case "06": - // this.load.image( - // "prod_texture_loaded_06", - // "assets/sprite/06.png" - // ); - // this.load.image("06b", "assets/sprite/06b.png"); - // break; - // case "07": - // this.load.image( - // "prod_texture_loaded_07", - // "assets/sprite/07.png" - // ); - // break; - // case "11": - // this.load.image( - // "left_block", - // "assets/sprite/left_block.png" - // ); - // this.load.image( - // "right_block", - // "assets/sprite/right_block.png" - // ); - // this.load.image( - // "prod_texture_loaded_11", - // "assets/sprite/11.png" - // ); - // break; - // case "14": - // this.load.image("mini_star", "assets/sprite/14_mini.png"); - // this.load.image("14_mini", "assets/sprite/14_mini.png"); - // break; - // case "16": - // this.load.image( - // "prod_texture_loaded_16", - // "assets/sprite/16.png" - // ); - // break; - // case "21": - // this.load.image( - // "prod_texture_loaded_21", - // "assets/sprite/21.png" - // ); - // break; - // } - // }); - - // this.load.json("prod_shapes", "assets/physics/new_shapes.json"); - // this.load.json( - // "obstacles_shapes", - // "assets/physics/obstacles_shapes.json" - // ); - // // Mini - // this.load.image("bar", "assets/sprite/bar.png"); - // this.load.json("mini_shapes", "assets/physics/mini_shapes.json"); - // this.load.image("textureImage", this.params.skinPath); - // this.load.image("wheel", "assets/sprite/wheel.png"); - // this.load.image("finish_line", "assets/finish.png"); - // this.load.image("trail", this.params.trailPath); - - // this.load.once("complete", () => { - // const spriteData = this.cache.json.get("screen_sprite_data"); - - // this.params.selectedTracks.map((trackNo) => { - // switch (trackNo) { - // case "01": - // const texture01 = this.textures - // .get("prod_texture_loaded_01") - // .getSourceImage(); - // this.textures.addAtlas( - // "prod_texture_loaded_01", - // texture01 as HTMLImageElement, - // spriteData - // ); - // break; - // case "02": - // case "22": - // this.load.image( - // "02_cross", - // "assets/sprite/02_cross.png" - // ); - // break; - // case "03": - // this.load.atlas( - // "prod_texture_loaded_03", - // "assets/sprite/03.png", - // "assets/sprite/screen_sprite.json" - // ); - // break; - // case "06": - // this.load.atlas( - // "prod_texture_loaded_06", - // "assets/sprite/06.png", - // "assets/sprite/screen_sprite.json" - // ); - // this.load.image("06b", "assets/sprite/06b.png"); - // break; - // case "07": - // this.load.atlas( - // "prod_texture_loaded_07", - // "assets/sprite/07.png", - // "assets/sprite/screen_sprite.json" - // ); - // break; - // case "11": - // this.load.image( - // "left_block", - // "assets/sprite/left_block.png" - // ); - // this.load.image( - // "right_block", - // "assets/sprite/right_block.png" - // ); - // this.load.atlas( - // "prod_texture_loaded_11", - // "assets/sprite/11.png", - // "assets/sprite/screen_sprite.json" - // ); - // break; - // case "14": - // this.load.image( - // "mini_star", - // "assets/sprite/14_mini.png" - // ); - // this.load.atlas( - // "14_mini", - // "assets/sprite/14_mini.png", - // "assets/sprite/screen_sprite.json" - // ); - // break; - // case "16": - // this.load.atlas( - // "prod_texture_loaded_16", - // "assets/sprite/16.png", - // "assets/sprite/screen_sprite.json" - // ); - // break; - // case "21": - // this.load.atlas( - // "prod_texture_loaded_21", - // "assets/sprite/21.png", - // "assets/sprite/screen_sprite.json" - // ); - // break; - // } - // }); - // }); + // this.load.image("background", this.params.backgroundPath); } create() { - // this.input.on( - // "wheel", - // ( - // pointer: any, - // gameObjects: any, - // deltaX: any, - // deltaY: any, - // deltaZ: any - // ) => { - // this.cameras.main.scrollY += deltaY * 0.5; // Adjust the scroll speed - // } - // ); - // this.matter.add.image(400, 300, 'sky') this.scene.start("game", this.params); - - // const particles = this.add.particles('red') - - // const emitter = particles.createEmitter({ - // speed: 100, - // scale: { start: 1, end: 0 }, - // blendMode: 'ADD' - // }) - - // const logo = this.physics.add.image(400, 100, 'logo') - - // logo.setVelocity(100, 200) - // logo.setBounce(1, 1) - // logo.setCollideWorldBounds(true) - - // emitter.startFollow(logo) } } From e977b57d498822f4a9b9f719535fd4ace28b083c Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Tue, 5 Nov 2024 23:54:06 +0530 Subject: [PATCH 20/22] fix: add bg --- src/game/main.ts | 8 ++++---- src/game/scenes/Game.ts | 3 ++- src/game/scenes/Preloader.ts | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/game/main.ts b/src/game/main.ts index 3235cbd..9d17554 100644 --- a/src/game/main.ts +++ b/src/game/main.ts @@ -32,12 +32,12 @@ const config: Phaser.Types.Core.GameConfig = { }; const StartGame = (parent: string, data: IGameDataParams) => { - if (data.gravityY && config.physics?.matter?.gravity) - config.physics.matter.gravity.y = data.gravityY; + // if (data.gravityY && config.physics?.matter?.gravity) + // config.physics.matter.gravity.y = data.gravityY; const game = new Game({ ...config, - width: data.dprAdjustedWidth, - height: data.dprAdjustedHeight, + width: 414, + height: 670, parent, // scale: { mode: Phaser.Scale.FIT, autoRound: true }, }); diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 842c1fb..6d5b2ad 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -3,10 +3,11 @@ import Phaser from "phaser"; export default class Game extends Phaser.Scene { constructor() { super("game"); - // this.throttledUpdate = _.throttle(this.throttledUpdate.bind(this), 10); // Throttle interval in milliseconds } create() { console.log("Game Scene..."); + this.add.image(0, 0, "background").setOrigin(0, 0); } } + diff --git a/src/game/scenes/Preloader.ts b/src/game/scenes/Preloader.ts index 944fe7a..b317371 100644 --- a/src/game/scenes/Preloader.ts +++ b/src/game/scenes/Preloader.ts @@ -18,7 +18,7 @@ export default class Preloader extends Phaser.Scene { preload() { console.log("Preloader..."); - // this.load.image("background", this.params.backgroundPath); + this.load.image("background", this.params.backgroundPath); } create() { From 4204aaf8a2197476da36ad8db6638960fbc6fa01 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Wed, 6 Nov 2024 00:05:41 +0530 Subject: [PATCH 21/22] fix: only preloader --- src/App.tsx | 84 ++++++++++++++--------------- src/game/PhaserGame.tsx | 100 +++++++++++++++++------------------ src/game/scenes/Preloader.ts | 100 +++++++++++++++++++++++++++++++++++ 3 files changed, 192 insertions(+), 92 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 6190c13..5e47613 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -336,28 +336,28 @@ function App() { {ready && coverDoc ? ( ) : ( ) : ( ( function PhaserGame( { - // voices, - // coverDocId, - // musicStartOffset, - // skinPath, + voices, + coverDocId, + musicStartOffset, + skinPath, backgroundPath, - // selectedTracks, - // noOfRaceTracks, - // gravityY, + selectedTracks, + noOfRaceTracks, + gravityY, // width, - // enableMotion, - // trailPath, - // trailsLifeSpace, - // trailsOpacity, - // trailEndSize, - // recordDuration, - // isRecord, + enableMotion, + trailPath, + trailsLifeSpace, + trailsOpacity, + trailEndSize, + recordDuration, + isRecord, }, ref ) { @@ -121,25 +121,25 @@ export const PhaserGame = forwardRef( // const dprAdjustedHeight = height * dpr; game.current = StartGame("game-container", { - // voices, - // coverDocId, - // musicStartOffset, - // skinPath, + voices, + coverDocId, + musicStartOffset, + skinPath, backgroundPath, - // selectedTracks, - // noOfRaceTracks, - // gravityY, + selectedTracks, + noOfRaceTracks, + gravityY, // dprAdjustedWidth, // dprAdjustedHeight, - // width, - // height, - // enableMotion, - // trailPath, - // trailsLifeSpace, - // trailsOpacity, - // trailEndSize, - // recordDuration, - // isRecord, + width, + height, + enableMotion, + trailPath, + trailsLifeSpace, + trailsOpacity, + trailEndSize, + recordDuration, + isRecord, }); if (typeof ref === "function") { diff --git a/src/game/scenes/Preloader.ts b/src/game/scenes/Preloader.ts index b317371..255cbbc 100644 --- a/src/game/scenes/Preloader.ts +++ b/src/game/scenes/Preloader.ts @@ -6,6 +6,16 @@ export type GameVoiceInfo = { name: string; avatar: string; }; +export const ObstacleNames = [ + "shiba", + "appalled_girlfriend", + "distracted_boyfriend", + "harold", + "meme_man", + "pedro", + "roll_safe", + "wojack", +]; export default class Preloader extends Phaser.Scene { public params: IGameDataParams; constructor() { @@ -19,6 +29,96 @@ export default class Preloader extends Phaser.Scene { preload() { console.log("Preloader..."); this.load.image("background", this.params.backgroundPath); + ObstacleNames.map((name) => { + this.load.image( + `obstacle_${name}`, + `assets/sprite/obstacles/${name}.png` + ); + }); + this.load.image("hammer_1", "assets/sprite/weapons/hammer_level_1.png"); + this.load.image("hammer_2", "assets/sprite/weapons/hammer_level_2.png"); + if (this.params.enableMotion) + this.load.image("center_logo", "assets/transparent_logo.png"); + // this.load.json( + // "screen_sprite_data", + // "assets/sprite/screen_sprite.json" + // ); + this.params.selectedTracks.map((trackNo) => { + switch (trackNo) { + case "01": + this.load.image( + "prod_texture_loaded_01", + "assets/sprite/01.png" + ); + break; + case "02": + case "22": + this.load.image("02_cross", "assets/sprite/02_cross.png"); + break; + case "03": + this.load.image( + "prod_texture_loaded_03", + "assets/sprite/03.png" + ); + break; + case "06": + this.load.image( + "prod_texture_loaded_06", + "assets/sprite/06.png" + ); + this.load.image("06b", "assets/sprite/06b.png"); + break; + case "07": + this.load.image( + "prod_texture_loaded_07", + "assets/sprite/07.png" + ); + break; + case "11": + this.load.image( + "left_block", + "assets/sprite/left_block.png" + ); + this.load.image( + "right_block", + "assets/sprite/right_block.png" + ); + this.load.image( + "prod_texture_loaded_11", + "assets/sprite/11.png" + ); + break; + case "14": + this.load.image("mini_star", "assets/sprite/14_mini.png"); + this.load.image("14_mini", "assets/sprite/14_mini.png"); + break; + case "16": + this.load.image( + "prod_texture_loaded_16", + "assets/sprite/16.png" + ); + break; + case "21": + this.load.image( + "prod_texture_loaded_21", + "assets/sprite/21.png" + ); + break; + } + }); + + this.load.json("prod_shapes", "assets/physics/new_shapes.json"); + this.load.json( + "obstacles_shapes", + "assets/physics/obstacles_shapes.json" + ); + // Mini + this.load.image("bar", "assets/sprite/bar.png"); + this.load.json("mini_shapes", "assets/physics/mini_shapes.json"); + this.load.image("textureImage", this.params.skinPath); + this.load.image("wheel", "assets/sprite/wheel.png"); + this.load.image("finish_line", "assets/finish.png"); + this.load.image("trail", this.params.trailPath); } create() { From e5ba354ff6f8bdefb1016f6afc02fc29412ba620 Mon Sep 17 00:00:00 2001 From: logesh2496 Date: Wed, 6 Nov 2024 00:13:21 +0530 Subject: [PATCH 22/22] fix: add game code --- src/game/scenes/Game.ts | 1968 +++++++++++++++++++++++++++++++++- src/game/scenes/Preloader.ts | 9 +- 2 files changed, 1972 insertions(+), 5 deletions(-) diff --git a/src/game/scenes/Game.ts b/src/game/scenes/Game.ts index 6d5b2ad..ddbe877 100644 --- a/src/game/scenes/Game.ts +++ b/src/game/scenes/Game.ts @@ -1,13 +1,1979 @@ import Phaser from "phaser"; +// import { +// getToneCurrentTime, +// marbleRaceOnlyInstrument, +// marbleRacePlayVocals, +// } from "../../hooks/useTonejs"; +import _ from "lodash"; +import { GameVoiceInfo, ObstacleNames } from "./Preloader"; +import { BodyType } from "matter"; +import { + createBeatsGroupWithInterval, + duplicateArrayElemToN, + getBeatsArray, +} from "../../helpers"; +import { EventBus } from "../EventBus"; +import { IGameDataParams } from "../PhaserGame"; export default class Game extends Phaser.Scene { constructor() { super("game"); + this.throttledUpdate = _.throttle(this.throttledUpdate.bind(this), 10); // Throttle interval in milliseconds + } + public sky: Phaser.Physics.Matter.Image | undefined; + public marbles: MatterJS.BodyType[] = []; + public marblesImages: Phaser.GameObjects.Image[] = []; + public marblesMasks: Phaser.GameObjects.Graphics[] = []; + public isInstrumentPlaying: boolean = false; + public autoScroll = true; + public prevVoiceIdx = -1; + public leftRotatableStars: Phaser.Physics.Matter.Sprite[] = []; + public rightRotatableStars: Phaser.Physics.Matter.Sprite[] = []; + public reduceSizeScreenOffset: number[] = []; + public increaseSizeScreenOffset: number[] = []; + public currentMarblesSizeIndices: { [key: string]: number } = {}; + public heightReducedIndices: number[] = []; + public upDownMotionElems: { + matter: Phaser.Physics.Matter.Image; + startX: number; + startY: number; + maxTop: number; + maxBottom: number; + moveSpeed: number; + direction: "left" | "right"; + }[] = []; + public labels: Phaser.GameObjects.Text[] = []; + public motionTimeForUpDownWard = 0; + public crossRightRotation: Phaser.Physics.Matter.Sprite[] = []; + public crossLeftRotation: Phaser.Physics.Matter.Sprite[] = []; + public horizontalCrossRightRotation: Phaser.Physics.Matter.Sprite[] = []; + public horizontalCrossLeftRotation: Phaser.Physics.Matter.Sprite[] = []; + // public trails: { x: number; y: number }[][] = []; + // public trailGraphics: Phaser.GameObjects.Graphics[] = []; + // public trailsGroup: Phaser.GameObjects.Group[] = []; + public trailLength: number = 0; + public trailPoints: { + x: number; + y: number; + angle: number; + // size: number; + }[][] = []; + // public shape: any; + public voices: GameVoiceInfo[] = []; + public coverDocId: string = ""; + public musicStartOffset: number = 0; + public selectedTracks: string[] = []; + public noOfRaceTracks: number = 0; + largeCircle: Phaser.Physics.Matter.Image | undefined; + isRotating = true; + baseAngle = 0; + centerX = 0; + centerY = 0; + radius = 100; + angleIncrement = (2 * Math.PI) / 5; + countdownText: Phaser.GameObjects.Text | undefined; + finishLineOffset: number = 0; + marbleRadius = 23; + background: Phaser.GameObjects.TileSprite | undefined; + enableMotion: boolean = false; + marbleTrailParticles: Phaser.GameObjects.Particles.ParticleEmitter[] = []; + isGameOver: boolean = false; + winnerIdx: number = -1; + isResultShown = false; + damageMultipliyer: number = 1; + level1Hammer: Phaser.GameObjects.Sprite | undefined; + level2Hammer: Phaser.GameObjects.Sprite | undefined; + canvasWidth: number = 0; + canvasHeight: number = 0; + dpr: number = 2; + trailConfig = { + speed: { min: -50, max: 50 }, + scale: { + start: this.dpr, + end: this.dpr * 0.5, + }, + blendMode: "ADD", + lifespan: 400, + alpha: 0.5, + }; + showObstacles: boolean = false; + initialGravity: number = 0; + perfectTapTime: number = 0; + goodTapTime: number = 0; + + init(data: IGameDataParams) { + // Sort the voices randomly + this.voices = data.voices; + // .sort(() => Math.random() - 0.5); + this.coverDocId = data.coverDocId; + this.musicStartOffset = data.musicStartOffset; + this.allTapTimings = getBeatsArray( + this.coverDocId, + this.musicStartOffset + ); + this.circleShouldFillInMs = + (this.allTapTimings[1] - this.allTapTimings[0]) * 3 * 1000; + this.perfectTapTime = this.circleShouldFillInMs / 3 / 1000; + this.goodTapTime = this.circleShouldFillInMs / 2 / 1000; + this.showTapTimings = createBeatsGroupWithInterval( + this.allTapTimings, + this.beatsGroupLength, + 4, + 12 + ); + + this.noOfRaceTracks = data.noOfRaceTracks || 5; + this.selectedTracks = duplicateArrayElemToN( + data.selectedTracks, + this.noOfRaceTracks + ); + this.enableMotion = data.enableMotion; + this.canvasWidth = data.width; + this.marbleRadius = (22 / 414) * this.canvasWidth * this.dpr; + if (data.height) this.canvasHeight = data.height; + this.centerX = this.cameras.main.width / 2; + this.centerY = this.cameras.main.height / 2; + this.trailConfig.scale.end = data.trailEndSize; + this.trailConfig.lifespan = data.trailsLifeSpace; + this.trailConfig.alpha = data.trailsOpacity; + this.dpr = 2; + this.showObstacles = data.showObstacles || false; + this.initialGravity = data.gravityY || 0; + } + + throttledUpdate(index: number, switchOld: boolean = true) { + this.prevVoiceIdx = index; + // Logic that should be throttled + // marbleRacePlayVocals(this.coverDocId, this.voices[index].id); + } + + renderWeapons() { + this.level1Hammer = this.add + .sprite( + (350 / 414) * this.canvasWidth * this.dpr, + (550 / 414) * this.canvasWidth * this.dpr, + "hammer_1" + ) + .setScale((0.1 / 414) * this.canvasWidth * this.dpr) + .setScrollFactor(0) + .setInteractive() + .on("pointerdown", () => { + this.damageMultipliyer = 1; + }); + + this.level2Hammer = this.add + .sprite( + (350 / 414) * this.canvasWidth * this.dpr, + (630 / 414) * this.canvasWidth * this.dpr, + "hammer_2" + ) + .setScale((0.1 / 414) * this.canvasWidth * this.dpr) + .setScrollFactor(0) + .setInteractive() + .on("pointerdown", () => { + this.damageMultipliyer = 1.5; + }); + } + + createTextureMask = ( + xOffset: number, + yOffset: number, + baseSprite: Phaser.Physics.Matter.Sprite | Phaser.Physics.Matter.Image + ) => { + // Create the texture sprite + const textureSprite = this.add.sprite(xOffset, yOffset, "textureImage"); + textureSprite.setScale(this.dpr); + + // Use the base sprite's texture as a mask for the texture sprite + const mask = new Phaser.Display.Masks.BitmapMask(this, baseSprite); + textureSprite.setMask(mask); + + // Optionally, hide the base sprite if you only want to show the texture + baseSprite.setVisible(false); + }; + + createCrossScreen = ( + startOffset: number, + canvasWidth: number, + miniShapes: any + ) => { + // TODO: Scale the sprite + startOffset += 151; + const l1CrossLeft = this.matter.add.sprite( + 18 * this.dpr, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } + ); + l1CrossLeft.setScale(this.dpr); + this.crossRightRotation.push(l1CrossLeft); + const l1CrossRight = this.matter.add.sprite( + canvasWidth - 18 * this.dpr, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } + ); + l1CrossRight.setScale(this.dpr); + this.crossLeftRotation.push(l1CrossRight); + startOffset += 200 * this.dpr; + const l2CrossLeft = this.matter.add.sprite( + 126 * this.dpr, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } + ); + l2CrossLeft.setScale(this.dpr); + this.crossLeftRotation.push(l2CrossLeft); + const l2CrossRight = this.matter.add.sprite( + canvasWidth - 126 * this.dpr, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } + ); + l2CrossRight.setScale(this.dpr); + this.crossRightRotation.push(l2CrossRight); + startOffset += 200 * this.dpr; + const l3CrossLeft = this.matter.add.sprite( + 18 * this.dpr, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } + ); + l3CrossLeft.setScale(this.dpr); + this.crossRightRotation.push(l3CrossLeft); + const l3CrossRight = this.matter.add.sprite( + canvasWidth - 18 * this.dpr, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } + ); + l3CrossRight.setScale(this.dpr); + this.crossLeftRotation.push(l3CrossRight); + startOffset += 200 * this.dpr; + const l4CrossLeft = this.matter.add.sprite( + 126 * this.dpr, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } + ); + l4CrossLeft.setScale(this.dpr); + this.crossLeftRotation.push(l4CrossLeft); + const l4CrossRight = this.matter.add.sprite( + canvasWidth - 126 * this.dpr, + startOffset, + "02_cross", + undefined, + { + shape: miniShapes["02"], + isStatic: true, + } + ); + l4CrossRight.setScale(this.dpr); + this.crossRightRotation.push(l4CrossRight); + + return startOffset + 500 * this.dpr; + }; + createSeesawScreen = ( + xOffset: number, + startOffset: number, + prodShapes: any, + miniShapes: any, + obstaclesShapes: any + ) => { + const baseSprite = this.matter.add + .sprite(xOffset, startOffset, "prod_texture_loaded_06", undefined, { + shape: prodShapes["06"], + isStatic: true, + }) + .setScale(this.dpr * (this.canvasWidth / (512 - 100))); + const yOffset = startOffset + baseSprite.height / 2; + baseSprite.setPosition(xOffset, yOffset); + const seesawX = xOffset - 2; + // 132 for 414 width + // 110 for 344 width + // FOrumula (132/414)*width + 30 + const seesawContraintY = -(132 / 414) * this.canvasWidth; + const seesawY = yOffset + seesawContraintY; + const seesaw = this.matter.add + .sprite(seesawX, seesawY, "06b", undefined, { + shape: miniShapes["06b"], + // isStatic: true, + }) + .setScale(this.dpr); + const contraint = this.matter.constraint.create({ + bodyA: seesaw.body as BodyType, + bodyB: baseSprite.body as BodyType, + pointA: { x: 0, y: 0 }, + pointB: { + x: -2, + y: seesawContraintY * this.dpr, + }, + stiffness: 1, + length: 0, + }); + if (this.showObstacles) { + const randomObstaclePosition = _.sample([ + [this.centerX, seesawY - 200], + [this.centerX - 100, seesawY], + [this.centerX + 100, seesawY], + [this.centerX, seesawY + 200], + [this.centerX - 100, seesawY + 400], + [this.centerX + 100, seesawY + 400], + ]); + + const randomObstacle = _.sample(ObstacleNames); + if (randomObstaclePosition && randomObstacle) { + const target = this.matter.add + .sprite( + randomObstaclePosition[0], + randomObstaclePosition[1], + `obstacle_${randomObstacle}`, + undefined, + { + shape: obstaclesShapes[ + randomObstacle as keyof typeof obstaclesShapes + ], + friction: 0, + frictionAir: 0, + frictionStatic: 0, + } + ) + .setScale((0.17 / 414) * this.canvasWidth * this.dpr); + target.setInteractive(); + target.on("pointerdown", (e: any) => { + this.handleDamage(target, e); + }); + } + } + this.matter.world.add(contraint); + this.createTextureMask(seesawX, seesawY, seesaw); + this.createTextureMask(xOffset, yOffset, baseSprite); + return startOffset + baseSprite.height * this.dpr; + }; + createCircleBlockers = ( + xOffset: number, + startOffset: number, + prodShapes: any + ) => { + const yOffset = startOffset + 833 / 2; + const baseSprite = this.matter.add + .sprite(xOffset, yOffset, "prod_texture_loaded_21", undefined, { + shape: prodShapes["21"], + isStatic: true, + }) + .setScale(this.dpr * (this.canvasWidth / (512 - 100))); + this.createTextureMask(xOffset, yOffset, baseSprite); + return startOffset + baseSprite.height * this.dpr; + }; + createStarRotations = (_startOffset: number, miniShapes: any) => { + // TODO: Scale the sprite + // Stars + const barWidth = 0; + let startOffset = _startOffset + 250; + // this.matter.add.sprite( + // barWidth / 2, + // startOffset + 270, + // "bar", + // undefined, + // { + // shape: miniShapes["bar"], + // isStatic: true, + // } + // ); + // this.matter.add.sprite(487, startOffset + 270, "bar", undefined, { + // shape: miniShapes["bar"], + // isStatic: true, + // }); + + // First Row + this.leftRotatableStars.push( + this.matter.add + .sprite( + ((115 / 414) * this.canvasWidth + barWidth) * this.dpr, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale((1 / 414) * this.canvasWidth * this.dpr) + .setAngle(35) + ); + + this.rightRotatableStars.push( + this.matter.add + .sprite( + ((305 / 414) * this.canvasWidth + barWidth) * this.dpr, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale((1 / 414) * this.canvasWidth * this.dpr) + ); + // Second Row + startOffset += 165 * this.dpr; + this.rightRotatableStars.push( + this.matter.add + .sprite( + ((10 / 414) * this.canvasWidth + barWidth) * this.dpr, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale((1 / 414) * this.canvasWidth * this.dpr) + .setAngle(5) + ); + this.rightRotatableStars.push( + this.matter.add + .sprite( + ((206 / 414) * this.canvasWidth + barWidth) * this.dpr, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale((1 / 414) * this.canvasWidth * this.dpr) + // .setAngle() + ); + this.leftRotatableStars.push( + this.matter.add + .sprite( + ((400 / 414) * this.canvasWidth + barWidth) * this.dpr, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(this.dpr) + .setAngle(35) + ); + // Third Row + startOffset += 180 * this.dpr; + this.leftRotatableStars.push( + this.matter.add + .sprite( + ((115 / 414) * this.canvasWidth + barWidth) * this.dpr, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(this.dpr) + .setAngle(30) + ); + this.rightRotatableStars.push( + this.matter.add + .sprite( + ((305 / 414) * this.canvasWidth + barWidth) * this.dpr, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(this.dpr) + .setAngle(5) + ); + // Fourth Row + startOffset += 160 * this.dpr; + this.rightRotatableStars.push( + this.matter.add + .sprite( + ((10 / 414) * this.canvasWidth + barWidth) * this.dpr, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(this.dpr) + .setAngle(8) + ); + this.leftRotatableStars.push( + this.matter.add + .sprite( + ((210 / 414) * this.canvasWidth + barWidth) * this.dpr, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(this.dpr) + .setAngle(30) + ); + this.leftRotatableStars.push( + this.matter.add + .sprite( + ((400 / 414) * this.canvasWidth + barWidth) * this.dpr, + startOffset, + "mini_star", + undefined, + { + shape: miniShapes["14"], + isStatic: true, + } + ) + .setScale(this.dpr) + .setAngle(35) + ); + return startOffset + 500 * this.dpr; + }; + + createStaticTriangles = ( + xOffset: number, + startOffset: number, + prodShapes: any, + obstaclesShapes: any + ) => { + const yOffset = startOffset + 833 / 2; + const baseSprite = this.matter.add + .sprite(xOffset, yOffset, "prod_texture_loaded_03", undefined, { + shape: prodShapes["03"], + isStatic: true, + }) + .setScale(this.dpr * (this.canvasWidth / (512 - 100))); + this.createTextureMask(xOffset, yOffset, baseSprite); + if (this.showObstacles) { + const randomObstaclePosition = _.sample([ + [100, startOffset], + [350, startOffset], + [this.centerX, startOffset + 200], + [100, startOffset + 400], + [400, startOffset + 400], + ]); + + const randomObstacle = _.sample(ObstacleNames); + if (randomObstaclePosition && randomObstacle) { + const target = this.matter.add.sprite( + randomObstaclePosition[0], + randomObstaclePosition[1], + `obstacle_${randomObstacle}`, + undefined, + { + shape: obstaclesShapes[ + randomObstacle as keyof typeof obstaclesShapes + ], + // angle: 124, + friction: 0, + frictionAir: 0, + frictionStatic: 0, + } + ); + target.setScale((0.17 / 414) * this.canvasWidth * this.dpr); + target.setInteractive(); + target.on("pointerdown", (e: any) => { + this.handleDamage(target, e); + }); + } + } + return startOffset + baseSprite.height * this.dpr; + }; + + handleDamage(target: Phaser.Physics.Matter.Sprite, e: any) { + // Logic for handling damage + console.log("Damage dealt to the target!"); + if (this.damageMultipliyer) { + target.setScale(target.scale / (1.1 * this.damageMultipliyer)); + const particleConfig = { + speed: { min: -50, max: 50 }, + scale: { start: 0.01, end: 0.1 }, + blendMode: "ADD", + // lifespan: 400, + alpha: 0.5, + particleBringToTop: true, + }; + const particle = this.add.particles( + e.worldX, + e.worldY, + "whack", + particleConfig + ); + // Add an event listener to destroy the emitter after the particles' lifespan + this.time.delayedCall( + 200, + () => { + // emitter.stop(); + particle.destroy(); // Destroys the particle manager and emitter + }, + [], + this + ); + // Play sound + if (this.damageMultipliyer === 1) + this.sound.play("low_whack", { volume: 0.5 }); + else this.sound.play("high_whack", { volume: 0.5 }); + } + if (target.scale <= 0.08) { + target.destroy(); + } + + // // Example: reduce health, show effects, etc. + // target.health = (target.health || 100) - 10; // Example: reduce health by 10 + // console.log("Target health:", target.health); + + // if (target.health <= 0) { + // console.log("Target destroyed!"); + // target.destroy(); // Destroy the target if health is 0 + // } + } + + createReduceSizeSlider = ( + xOffset: number, + startOffset: number, + prodShapes: any + ) => { + this.reduceSizeScreenOffset.push(startOffset - 400); + const yOffset = startOffset + 833 / 2; + const baseSprite = this.matter.add + .sprite( + xOffset + 3.5, + yOffset, + "prod_texture_loaded_16", + undefined, + { + shape: prodShapes["16"], + isStatic: true, + } + ) + .setScale(this.dpr * (this.canvasWidth / (512 - 100))); + // .setScale(this.cameras.main.width / 414); + this.createTextureMask(xOffset, yOffset, baseSprite); + startOffset += baseSprite.height * this.dpr; + this.increaseSizeScreenOffset.push(startOffset); + startOffset += 300; + return startOffset; + }; + createStopperSlider = ( + xOffset: number, + startOffset: number, + prodShapes: any + ) => { + // TODO: Scale the sprite + const yOffset = startOffset + 833 / 2; + const baseSprite = this.matter.add.sprite( + xOffset - 4, + yOffset, + "prod_texture_loaded_11", + undefined, + { + shape: prodShapes["11"], + isStatic: true, + } + ); + // .setScale(this.cameras.main.width / 414); + // Motion parts + this.upDownMotionElems.push( + { + matter: this.matter.add + .image(318, startOffset + 122, "left_block", undefined, { + isStatic: true, + }) + .setScale(0.18, 0.18), + startX: 315, + startY: startOffset + 122, + maxTop: 1, + maxBottom: 38, + moveSpeed: 0.1, + direction: "right", + } + // .setAngle(7.1) + ); + this.upDownMotionElems.push( + { + matter: this.matter.add + .image(102.8, startOffset + 275, "right_block", undefined, { + isStatic: true, + }) + .setScale(0.18, 0.18), + startX: 102.8, + startY: startOffset + 275, + maxTop: 1, + maxBottom: 28, + moveSpeed: 0.2, + direction: "left", + } + // .setAngle(7.1) + ); + this.upDownMotionElems.push( + { + matter: this.matter.add + .image(314, startOffset + 418, "left_block", undefined, { + isStatic: true, + }) + .setScale(0.18, 0.18), + startX: 314, + startY: startOffset + 418, + maxTop: 15, + maxBottom: -18, + moveSpeed: 0.15, + direction: "right", + } + // .setAngle(7.1) + ); + this.upDownMotionElems.push( + { + matter: this.matter.add + .image(102.8, startOffset + 568, "right_block", undefined, { + isStatic: true, + }) + .setScale(0.18, 0.18), + startX: 102.8, + startY: startOffset + 568, + maxTop: 1, + maxBottom: 28, + moveSpeed: 0.18, + direction: "left", + } + // .setAngle(7.1) + ); + this.upDownMotionElems.push( + { + matter: this.matter.add + .image(314, startOffset + 713, "left_block", undefined, { + isStatic: true, + }) + .setScale(0.18, 0.18), + startX: 314, + startY: startOffset + 713, + maxTop: 1, + maxBottom: 28, + moveSpeed: 0.1, + direction: "right", + } + // .setAngle(7.1) + ); + //TODO for the right & left blocks + this.upDownMotionElems + .map((e) => e.matter) + .map((image) => this.createTextureMask(image.x, image.y, image)); + this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite); + return startOffset + 842; + }; + createStaticCircles = ( + xOffset: number, + startOffset: number, + prodShapes: any, + obstaclesShapes: any + ) => { + const baseSprite = this.matter.add + .sprite(xOffset, startOffset, "prod_texture_loaded_01", undefined, { + shape: prodShapes["01"], + isStatic: true, + }) + .setScale(this.dpr * (this.canvasWidth / (512 - 100))); + const yOffset = startOffset + baseSprite.height / 2; + baseSprite.setPosition(baseSprite.x, yOffset); + this.createTextureMask(xOffset, yOffset, baseSprite); + if (this.showObstacles) { + const randomObstaclePosition = _.sample([ + [150, startOffset], + [350, startOffset], + [150, startOffset + 300], + [this.centerX, startOffset + 200], + [390, startOffset + 200], + [150, startOffset + 400], + [350, startOffset + 400], + [this.centerX, startOffset + 600], + ]); + const randomObstacle = _.sample(ObstacleNames); + if (randomObstaclePosition && randomObstacle) { + const target = this.matter.add.sprite( + randomObstaclePosition[0], + randomObstaclePosition[1], + `obstacle_${randomObstacle}`, + undefined, + { + shape: obstaclesShapes[ + randomObstacle as keyof typeof obstaclesShapes + ], + friction: 0, + frictionAir: 0, + frictionStatic: 0, + } + ); + target.setScale((0.17 / 414) * this.canvasWidth * this.dpr); + target.setInteractive(); + target.on("pointerdown", (e: any) => { + this.handleDamage(target, e); + }); + } + } + return startOffset + baseSprite.height * this.dpr; + }; + createZigzagSlider = ( + xOffset: number, + startOffset: number, + prodShapes: any, + obstaclesShapes: any + ) => { + const baseSprite = this.matter.add.sprite( + xOffset, + startOffset, + "prod_texture_loaded_07", + undefined, + { + shape: prodShapes["07"], + isStatic: true, + } + ); + baseSprite.setPosition( + baseSprite.x, + startOffset + baseSprite.height / 2 + ); + baseSprite.setScale(this.dpr * (this.canvasWidth / (512 - 100))); + this.createTextureMask( + xOffset, + startOffset + baseSprite.height / 2, + baseSprite + ); + if (this.showObstacles) { + const randomObstaclePosition = _.sample([ + [140, startOffset], + [350, startOffset], + [150, startOffset + 200], + [350, startOffset + 200], + [150, startOffset + 400], + [350, startOffset + 400], + ]); + const randomObstacle = _.sample(ObstacleNames); + if (randomObstaclePosition && randomObstacle) { + const target = this.matter.add + .sprite( + randomObstaclePosition[0], + randomObstaclePosition[1], + `obstacle_${randomObstacle}`, + undefined, + { + shape: obstaclesShapes[ + randomObstacle as keyof typeof obstaclesShapes + ], + // angle: 124, + friction: 0, + frictionAir: 0, + frictionStatic: 0, + } + ) + .setScale((0.17 / 414) * this.canvasWidth * this.dpr); + target.setInteractive(); + target.on("pointerdown", (e: any) => { + this.handleDamage(target, e); + }); + } + } + return startOffset + baseSprite.height * this.dpr; + }; + createMarbles = (marbleRadius: number, miniShapes: any) => { + this.largeCircle = this.matter.add.sprite( + this.centerX, + this.centerY - 100, + "wheel", + undefined, + { + shape: miniShapes["wheel"], + isStatic: true, + frictionStatic: 1, + friction: 1, + } + ); + // For Testing + // this.largeCircle.setScale(0.1); + // this.isRotating = false; + this.largeCircle.setScale( + (this.canvasWidth / this.largeCircle.width) * this.dpr + ); + const xOffsetValues = [ + this.centerX - 46, + this.centerX + 23, + this.centerX, + this.centerX + 23, + this.centerX + 46, + ]; + this.voices.map((v, i) => { + this.currentMarblesSizeIndices[i.toString()] = 0; + // const angle = i * this.angleIncrement; + // const x = this.centerX + this.radius * Math.cos(angle); + // const y = this.centerY + this.radius * Math.sin(angle); + const circleBody = this.matter.add.circle( + xOffsetValues[i], + this.centerY, + marbleRadius, + { + restitution: 0.4, + // density: 0.02, + friction: 0, + frictionAir: 0, + frictionStatic: 0, + label: v.id, + } + ); + this.marbles.push(circleBody); + this.marbleTrailParticles.push( + this.add.particles(0, 0, "trail", { + ...this.trailConfig, + follow: circleBody.position, + }) + ); + + // circleBody.emitter = emitter; + // this.trailsGroup.push(this.add.group()); + // this.trailGraphics.push(this.add.graphics()); + // this.trailPoints.push([]); + // // Create an image and attach it to the circle body + const circleImage = this.add + .image( + circleBody.position.x, + circleBody.position.y, + `resized_${v.id}` + ) + .setDepth(1); + circleImage.setDisplaySize(marbleRadius * 2, marbleRadius * 2); + circleImage.setOrigin(0.5, 0.5); + // Circle mask + const maskShape = this.make.graphics(); + maskShape.fillStyle(0xffffff); + maskShape.fillCircle(marbleRadius, marbleRadius, marbleRadius); + const mask = maskShape.createGeometryMask(); + + // Apply the mask to the image + circleImage.setMask(mask); + this.marblesMasks.push(maskShape); + + this.marblesImages.push(circleImage); + // Create label for each circle + let label = this.add.text( + circleImage.x, + circleImage.y - 560, + this.voices[i].name, + { + fontSize: "32px", + color: "#ffffff", + stroke: "#000", + strokeThickness: 4, + } + ); + label.setDepth(1); + this.labels.push(label); + }); + this.countdownText = this.add + .text(this.centerX, this.centerY - 100, "3", { + fontSize: `${64 * this.dpr}px`, + color: "#ffffff", + }) + .setOrigin(0.5); + }; + createHorizontalCrosses = ( + canvasWidth: number, + _startOffset: number, + miniShapes: any + ) => { + this.reduceSizeScreenOffset.push(_startOffset - 300); + let startOffset = _startOffset + 200; + let leftOffset = 20; + let rightOffset = canvasWidth - 20; + new Array(5).fill("").map(() => { + this.horizontalCrossRightRotation.push( + this.matter.add + .sprite(leftOffset, startOffset, "02_cross", undefined, { + shape: miniShapes["02"], + isStatic: true, + }) + .setScale((0.8 / 414) * this.canvasWidth * this.dpr) + ); + leftOffset += (80 / 414) * this.canvasWidth * this.dpr; + }); + startOffset += (250 / 414) * this.canvasWidth * this.dpr; + new Array(5).fill("").map(() => { + this.horizontalCrossLeftRotation.push( + this.matter.add + .sprite(rightOffset, startOffset, "02_cross", undefined, { + shape: miniShapes["02"], + isStatic: true, + }) + .setScale((0.8 / 414) * this.canvasWidth * this.dpr) + ); + rightOffset -= (80 / 414) * this.canvasWidth * this.dpr; + }); + leftOffset = 20; + startOffset += (250 / 414) * this.canvasWidth * this.dpr; + new Array(5).fill("").map(() => { + this.horizontalCrossRightRotation.push( + this.matter.add + .sprite(leftOffset, startOffset, "02_cross", undefined, { + shape: miniShapes["02"], + isStatic: true, + }) + .setScale((0.8 / 414) * this.canvasWidth * this.dpr) + ); + leftOffset += (80 / 414) * this.canvasWidth * this.dpr; + }); + rightOffset = canvasWidth - 20; + startOffset += (250 / 414) * this.canvasWidth * this.dpr; + new Array(5).fill("").map(() => { + this.horizontalCrossLeftRotation.push( + this.matter.add + .sprite(rightOffset, startOffset, "02_cross", undefined, { + shape: miniShapes["02"], + isStatic: true, + }) + .setScale((0.8 / 414) * this.canvasWidth * this.dpr) + ); + rightOffset -= (80 / 414) * this.canvasWidth * this.dpr; + }); + this.increaseSizeScreenOffset.push(startOffset); + return startOffset + 500 * this.dpr; + }; + showResult() { + const labelContent = this.winnerIdx === 1 ? "You Win!" : "You Lose"; + const xpContent = this.winnerIdx === 1 ? "+500 XP" : "+0 XP"; + + const label = this.add + .text(this.centerX, this.centerY - 180, labelContent, { + fontSize: `${64 * this.dpr}px`, + color: "#ffffff", + stroke: "#000", + strokeThickness: 4, + }) + .setScrollFactor(0); + label.setDepth(1); + label.setPosition( + label.x - label.width / 2, + label.y - label.height / 2 + ); + const labelXp = this.add + .text(this.centerX, this.centerY + 250, xpContent, { + fontSize: `${52 * this.dpr}px`, + color: "#573FC8", + stroke: "#fff", + strokeThickness: 4, + }) + .setScrollFactor(0); + // .setScale(this.dpr); + labelXp.setDepth(1); + labelXp.setPosition( + labelXp.x - labelXp.width / 2, + labelXp.y - labelXp.height / 2 + ); + EventBus.emit("game-over", this.winnerIdx === 1); + this.isResultShown = true; } create() { console.log("Game Scene..."); - this.add.image(0, 0, "background").setOrigin(0, 0); + if (this.showObstacles) { + this.sound.add("low_whack", { loop: false, volume: 0.5 }); + this.sound.add("high_whack", { loop: false, volume: 0.5 }); + } + // Center the background image + const centerX = this.cameras.main.width / 2; + if (!this.enableMotion) { + const centerY = this.cameras.main.height / 2; + const bg = this.add + .image(centerX, centerY, "background") + .setScrollFactor(0); + bg.setDisplaySize( + this.cameras.main.width, + this.cameras.main.height + ); + } else { + this.background = this.add + .tileSprite(0, 0, 0, 0, "background") + .setScrollFactor(0) + .setOrigin(0, 0); + this.background.setScale( + (414 / this.background.width) * this.dpr, + (736 / this.background.height) * this.dpr + ); + this.add + .image(this.centerX, this.centerY, "center_logo") + .setDisplaySize(254, 84) + .setScrollFactor(0); + } + + const siteUrl = this.add + .text(this.centerX, this.centerY, "marblerace.ai", { + fontSize: `${24 * this.dpr}px`, + color: "#ffffff", + stroke: "rgba(0,0,0,0.5)", + strokeThickness: 2, + }) + .setScrollFactor(0); + siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, siteUrl.y + 100); + // siteUrl.setScale(this.dpr); + // siteUrl.setPosition(siteUrl.x - siteUrl.width / 2, siteUrl.y); + // Enable camera scrolling + const canvasWidth = this.cameras.main.width; + + var prodShapes = this.cache.json.get("prod_shapes"); + var miniShapes = this.cache.json.get("mini_shapes"); + var obstaclesShapes = this.cache.json.get("obstacles_shapes"); + + let startOffset = 800 * this.dpr; + const xOffset = this.centerX; + // this.selectedTracks = ["06", "07", "03", "01", "16"]; + this.selectedTracks.map((trackNo) => { + switch (trackNo) { + case "01": + startOffset = this.createStaticCircles( + xOffset, + startOffset, + prodShapes, + obstaclesShapes + ); + break; + case "02": + startOffset = this.createCrossScreen( + startOffset, + canvasWidth, + miniShapes + ); + break; + case "03": + startOffset = this.createStaticTriangles( + xOffset, + startOffset, + prodShapes, + obstaclesShapes + ); + break; + case "06": + startOffset = this.createSeesawScreen( + xOffset, + startOffset, + prodShapes, + miniShapes, + obstaclesShapes + ); + break; + case "07": + startOffset = this.createZigzagSlider( + xOffset, + startOffset, + prodShapes, + obstaclesShapes + ); + break; + case "11": + startOffset = this.createStopperSlider( + xOffset, + startOffset, + prodShapes + ); + break; + case "14": + startOffset = this.createStarRotations( + startOffset, + miniShapes + ); + break; + case "16": + startOffset = this.createReduceSizeSlider( + xOffset, + startOffset, + prodShapes + ); + break; + case "21": + startOffset = this.createCircleBlockers( + xOffset, + startOffset, + prodShapes + ); + break; + case "22": + startOffset = this.createHorizontalCrosses( + canvasWidth, + startOffset, + miniShapes + ); + break; + } + }); + const finishOffset = startOffset + 250; + this.add.image(centerX, finishOffset, "finish_line").setScale(0.5); + this.finishLineOffset = finishOffset; + // .setDisplaySize(960, 40); + this.cameras.main.setBounds( + 0, + 0, + this.cameras.main.width, + finishOffset + 250 + ); + this.matter.world.setBounds( + 0, + 0, + this.cameras.main.width, + finishOffset + 800 + ); + + this.createMarbles(this.marbleRadius, miniShapes); + this.crossLeftRotation.map((baseSprite) => + this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) + ); + this.crossRightRotation.map((baseSprite) => + this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) + ); + [...this.leftRotatableStars, ...this.rightRotatableStars].map( + (baseSprite) => + this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) + ); + [ + ...this.horizontalCrossLeftRotation, + ...this.horizontalCrossRightRotation, + ].map((baseSprite) => + this.createTextureMask(baseSprite.x, baseSprite.y, baseSprite) + ); + + let coundownValue = 3; + // Start Countdown: + const clock = this.time.addEvent({ + delay: 1000, + repeat: 2, + callback: () => { + if (this.countdownText) { + coundownValue--; + if (coundownValue > 0) { + this.countdownText.setText(coundownValue.toString()); + } else { + this.countdownText.setText("Go!"); + console.log("Go!"); + // remove the large circle + if (this.largeCircle?.body) { + this.matter.world.remove( + this.largeCircle.body, + true + ); + this.largeCircle.destroy(); + // this.matter.world.remove(this.largeCircle); + } + this.isRotating = false; + this.countdownText.destroy(); + clock.destroy(); + this.cameras.main.startFollow(this.marblesImages[0]); + } + } + }, + }); + // marbleRaceOnlyInstrument( + // this.coverDocId, + // 120, + // this.musicStartOffset + // ).then(() => (this.isInstrumentPlaying = true)); + // if (this.showObstacles) this.renderWeapons(); + this.renderJoystickButtons(); + } + + graphics: Phaser.GameObjects.Graphics | undefined; + circle1: Phaser.GameObjects.Sprite | undefined; + outlineCircle1: Phaser.GameObjects.Sprite | undefined; + circle2: Phaser.GameObjects.Sprite | undefined; + outlineCircle2: Phaser.GameObjects.Sprite | undefined; + circle3: Phaser.GameObjects.Sprite | undefined; + outlineCircle3: Phaser.GameObjects.Sprite | undefined; + circle4: Phaser.GameObjects.Sprite | undefined; + outlineCircle4: Phaser.GameObjects.Sprite | undefined; + setIntervals: NodeJS.Timeout[] = []; + setTimeouts: NodeJS.Timeout[] = []; + tapTimings: number[] = []; + allTapTimings: number[] = []; + circleShouldFillInMs = 0; + showTapTimings: number[] = []; + currentTapIndex = 0; + beatsGroupLength = 8; + + availableCircles: Phaser.GameObjects.Sprite[] = []; + innerCircles: Phaser.GameObjects.Sprite[] = []; + outlineCircles: Phaser.GameObjects.Sprite[] = []; + + resultLabel: Phaser.GameObjects.Text | undefined; + tapScore: number = 0; + isBoosted = false; + + buttonRadius = 40 * this.dpr; + joystickHolder: Phaser.GameObjects.Container | undefined; + joystickFrame: Phaser.GameObjects.Image | undefined; + hasGroupPassed = true; + + renderJoystickButtons() { + const frameHeight = this.cameras.main.height / 3; + let circleYOffset = + this.cameras.main.height / 2 + frameHeight - this.buttonRadius; + // .image(0, 0, "joystick_frame") + // .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); + this.circle1 = this.add + .sprite( + this.cameras.main.width / 2 - 200, + circleYOffset, + "green_dot" + ) + .setDisplaySize(0, 0) + .setScrollFactor(0); + + this.outlineCircle1 = this.add + .sprite( + this.cameras.main.width / 2 - 200, + circleYOffset, + "green_dot_outline" + ) + .setScrollFactor(0) + .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); + this.circle2 = this.add + .sprite( + this.cameras.main.width / 2 + 200, + circleYOffset, + "green_dot" + ) + .setDisplaySize(0, 0) + .setScrollFactor(0); + + this.outlineCircle2 = this.add + .sprite( + this.cameras.main.width / 2 + 200, + circleYOffset, + "green_dot_outline" + ) + .setScrollFactor(0) + .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); + circleYOffset += this.buttonRadius * 2; + this.circle3 = this.add + .sprite( + this.cameras.main.width / 2 - this.buttonRadius, + circleYOffset, + "green_dot" + ) + .setDisplaySize(0, 0) + .setScrollFactor(0); + + this.outlineCircle3 = this.add + .sprite( + this.cameras.main.width / 2 - this.buttonRadius, + circleYOffset, + "green_dot_outline" + ) + .setScrollFactor(0) + .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); + this.circle4 = this.add + .sprite( + this.cameras.main.width / 2 + this.buttonRadius, + circleYOffset, + "green_dot" + ) + .setDisplaySize(0, 0) + .setScrollFactor(0); + + this.outlineCircle4 = this.add + .sprite( + this.cameras.main.width / 2 + this.buttonRadius, + circleYOffset, + "green_dot_outline" + ) + .setScrollFactor(0) + .setDisplaySize(this.buttonRadius * 2, this.buttonRadius * 2); + this.availableCircles = [ + this.circle1, + this.circle2, + this.circle3, + this.circle4, + ]; + this.innerCircles = [ + this.circle1, + this.circle2, + this.circle3, + this.circle4, + ]; + this.outlineCircles = [ + this.outlineCircle1, + this.outlineCircle2, + this.outlineCircle3, + this.outlineCircle4, + ]; + const fxs = this.outlineCircles.map((c) => { + c.preFX?.setPadding(32); + return c.preFX?.addGlow(0xffffff, 0, 0, true, 0.1, 32); + }); + this.tweens.add({ + targets: fxs, + outerStrength: 10, + }); + [...this.innerCircles, ...this.outlineCircles].map((c) => { + c.setDepth(10); + c.setAlpha(0); + }); + this.events.on("destroy", () => { + this.setTimeouts.map((timeout) => clearTimeout(timeout)); + this.setIntervals.map((interval) => clearInterval(interval)); + }); + this.joystickFrame = this.add + .image( + this.cameras.main.width / 2, + this.cameras.main.height / 2 + frameHeight, + "joystick_frame" + ) + .setDepth(9) + .setScrollFactor(0) + .setDisplaySize(this.cameras.main.width, frameHeight) + .setAlpha(0); + // this.joystickHolder = this.add + // .container( + // this.cameras.main.width / 2, + // this.cameras.main.height / 2 + frameHeight, + // [ + // this.circle1, + // this.outlineCircle1, + // this.circle2, + // this.outlineCircle2, + // this.circle3, + // this.outlineCircle3, + // this.circle4, + // this.outlineCircle4, + // ] + // ) + // .setDepth(999999) + // .setDisplaySize(this.cameras.main.width, frameHeight) + // .setScrollFactor(0); + } + isJoystickButtonsShown = false; + + hideJoystickButtons() { + this.isJoystickButtonsShown = false; + this.innerCircles.map((c) => { + c.setAlpha(0); + }); + this.outlineCircles.map((c) => { + c.setAlpha(0); + }); + this.innerCircles.map((c) => { + c.removeListener("pointerdown"); + }); + this.joystickFrame?.setTint(undefined); + this.joystickFrame?.setAlpha(0); + } + showJoystickButtons() { + this.isJoystickButtonsShown = true; + this.hasGroupPassed = false; + this.innerCircles.map((c) => { + c.setAlpha(1); + }); + this.outlineCircles.map((c) => { + c.setAlpha(1); + }); + this.joystickFrame?.setAlpha(1); + } + boostMultipler: number = 0; + tapResultLabel: Phaser.GameObjects.Text | undefined; + tapResultLabelTimer: NodeJS.Timeout | undefined; + // update(time: number, delta: number): void { + update(): void { + const currentTime = 100; + + if (this.tapScore >= 40) { + this.tapScore = 0; + this.isBoosted = true; + this.boostMultipler = this.marbles[0].velocity.y; + this.marbleTrailParticles[0].setConfig({ + color: [0xfacc22, 0xf89800, 0xf83600, 0x9f0404], + colorEase: "quad.out", + lifespan: 2400, + angle: { min: -100, max: -80 }, + scale: { start: 1, end: 0, ease: "sine.out" }, + speed: { min: 250, max: 350 }, + advance: 2000, + blendMode: "ADD", + }); + this.hideJoystickButtons(); + // this.tapResultLabel?.destroy(); + // this.tapResultLabel = this.add + // .text( + // this.cameras.main.width / 2, + // this.cameras.main.height / 2, + // "Boosted", + // { + // fontSize: `${42 * this.dpr}px`, + // color: "white", + // stroke: "rgba(0,0,0,1)", + // strokeThickness: 6, + // backgroundColor: "rgba(0,0,0,1)", + // } + // ) + // .setScrollFactor(0); + // this.tapResultLabel?.setPosition( + // this.tapResultLabel.x - this.tapResultLabel.width / 2, + // this.tapResultLabel.y - this.tapResultLabel.height / 2 + // ); + // if (this.tapResultLabelTimer) { + // clearTimeout(this.tapResultLabelTimer); + // } + // this.tapResultLabelTimer = setTimeout(() => { + // // this.matter.world.setGravity(0, this.initialGravity); + // this.tapResultLabel?.destroy(); + // }, 2000); + } + const _currentTapIndex = this.currentTapIndex; + const nextTapTiming = + this.showTapTimings[_currentTapIndex] - + this.circleShouldFillInMs / 1000; + if (currentTime >= nextTapTiming) { + // console.log("Current Tap Idx: ", _currentTapIndex); + this.currentTapIndex++; + if (!this.isBoosted) { + this.showJoystickButtons(); + const circleToFill = _.sample(this.availableCircles); + if (circleToFill) { + this.availableCircles = this.availableCircles.filter( + (c) => c !== circleToFill + ); + circleToFill.setInteractive(); + circleToFill.once("pointerdown", () => { + // Hide the Circle + circleToFill.setDisplaySize(0, 0); + circleToFill.setAlpha(0); + // Add a Label at the center of the screen with scrollFactor 0 + const newCurrentTime = 150; + const expectedTapTime = + this.showTapTimings[_currentTapIndex]; + const difference = expectedTapTime - newCurrentTime; + const resultText = + difference < this.perfectTapTime + ? "Perfect" + : difference < this.goodTapTime + ? "Good" + : "Miss"; + this.tapScore += + resultText === "Perfect" + ? 10 + : resultText === "Good" + ? 5 + : 0; + // Set green/success tint to the joystick frame + // green: #00ff00 + // red: #ff0000 + // yellow: #ffff00 + this.joystickFrame?.setTint( + resultText === "Perfect" + ? 0xffff00 + : resultText === "Good" + ? 0xffff00 + : 0xff0000 + ); + // this.tapResultLabel?.destroy(); + // this.tapResultLabel = this.add + // .text( + // this.cameras.main.width / 2, + // this.cameras.main.height / 2, + // resultText, + // { + // fontSize: `${42 * this.dpr}px`, + // color: + // resultText === "Perfect" + // ? "green" + // : resultText === "Good" + // ? "yellow" + // : "red", + // stroke: "rgba(0,0,0,1)", + // strokeThickness: 6, + // backgroundColor: "rgba(0,0,0,1)", + // } + // ) + // .setScrollFactor(0); + // this.tapResultLabel.setPosition( + // this.tapResultLabel.x - + // this.tapResultLabel.width / 2, + // this.tapResultLabel.y - + // this.tapResultLabel.height / 2 + // ); + if (this.tapResultLabelTimer) { + // this.joystickFrame?.setTint(undefined); + clearTimeout(this.tapResultLabelTimer); + } + + // Destroy the label after 1 second + this.tapResultLabelTimer = setTimeout(() => { + this.joystickFrame?.setTint(undefined); + // this.tapResultLabel?.destroy(); + }, 500); + circleToFill.removeInteractive(); + this.availableCircles.push(circleToFill); + }); + // Gradually Increase the radius of the circle to be 80 + // Create a SetInterval + const interval = setInterval(() => { + if (circleToFill) { + const radiuToIncreasePerMs = + this.buttonRadius / + (this.circleShouldFillInMs / 10); + + circleToFill.setDisplaySize( + circleToFill.displayWidth + + radiuToIncreasePerMs * 2, + circleToFill.displayHeight + + radiuToIncreasePerMs * 2 + ); + } + }, 10); + this.setIntervals.push(interval); + const timeout = setTimeout(() => { + circleToFill.setDisplaySize(0, 0); + this.availableCircles.push(circleToFill); + circleToFill.removeInteractive(); + clearInterval(interval); + }, this.circleShouldFillInMs); + this.setTimeouts.push(timeout); + // } + } + } + } + if ( + _currentTapIndex && + _currentTapIndex % this.beatsGroupLength === 0 && + this.hasGroupPassed === false + ) { + this.hasGroupPassed = true; + // console.log("Group Passed"); + // this.marbleTrailParticles[0].setConfig({ + // ...this.trailConfig, + // scale: this.marbleTrailParticles[0].scale, + // follow: this.marbles[0].position, + // }); + // this.marbleTrailParticles[0].destroy(); + this.hideJoystickButtons(); + } + if ( + this.isBoosted && + this.boostMultipler < 20 && + this.boostMultipler > 0 + ) { + const firstMarble = this.marbles[0]; // TODO: User chosen marble + this.matter.body.setVelocity(firstMarble, { + x: firstMarble.velocity.x, + y: this.boostMultipler, + }); + this.boostMultipler += 0.1; + } + if ( + this.isBoosted && + this.boostMultipler >= 20 && + this.hasGroupPassed + ) { + this.isBoosted = false; + this.boostMultipler = 0; + this.marbleTrailParticles[0].destroy(); + this.marbleTrailParticles[0] = this.add + .particles(0, 0, "trail", { + ...this.trailConfig, + follow: this.marbles[0].position, + }) + .setDepth(0); + } + + if (this.damageMultipliyer === 1) { + // Highlight level 1 hammer + this.level2Hammer?.setScale( + (0.1 / 414) * this.canvasWidth * this.dpr + ); + this.level1Hammer?.setScale( + (0.2 / 414) * this.canvasWidth * this.dpr + ); + } else if (this.damageMultipliyer === 1.5) { + // Highlight level 2 hammer + this.level1Hammer?.setScale( + (0.1 / 414) * this.canvasWidth * this.dpr + ); + this.level2Hammer?.setScale( + (0.2 / 414) * this.canvasWidth * this.dpr + ); + } + if (this.isGameOver && this.isResultShown === false) { + // if (this.isResultShown) return; + this.showResult(); + } + // if (this.enableMotion && !this.isRotating) + // this.background.tilePositionX += 0.08; + if (this.marbles.length) { + if (this.isRotating) { + // Update the base angle to create the circular motion + this.baseAngle += 0.01; // Adjust this value to change the speed of rotation + this.largeCircle?.setRotation(this.baseAngle); + this.matter.body.setAngularVelocity( + this.largeCircle?.body as BodyType, + 0.15 + ); + } + // Optimize marble updates + for (let i = 0; i < this.marbles.length; i++) { + const voiceBody = this.marbles[i]; + const marbleImage = this.marblesImages[i]; + const marbleMask = this.marblesMasks[i]; + const label = this.labels[i]; + const currentCrossIndex = + this.currentMarblesSizeIndices[i.toString()]; + + // Update marble image position and rotation + if (marbleImage) { + marbleImage.setPosition( + voiceBody.position.x, + voiceBody.position.y + ); + marbleImage.setRotation(voiceBody.angle); + } + + // Update marble mask position + if (marbleMask) { + marbleMask.setPosition( + voiceBody.position.x - voiceBody.circleRadius, + voiceBody.position.y - voiceBody.circleRadius + ); + } + + // Update label position + if (label) { + label.setPosition( + voiceBody.position.x - label.width / 2, + voiceBody.position.y - 60 + ); + } + + // Check for size changes + const isHeightReduced = this.heightReducedIndices.includes(i); + const y = voiceBody.position.y; + + if ( + isHeightReduced && + y > this.increaseSizeScreenOffset[currentCrossIndex] + ) { + // Increase size + this.currentMarblesSizeIndices[i.toString()]++; + this.matter.body.scale(voiceBody, 2, 2); + if (marbleImage) + marbleImage.setDisplaySize( + this.marbleRadius * 2, + this.marbleRadius * 2 + ); + if (marbleMask) marbleMask.scale = 1; + this.heightReducedIndices = + this.heightReducedIndices.filter((idx) => idx !== i); + this.marbleTrailParticles[i].setConfig(this.trailConfig); + } else if ( + !isHeightReduced && + y > this.reduceSizeScreenOffset[currentCrossIndex] && + y < this.increaseSizeScreenOffset[currentCrossIndex] + ) { + // Reduce size + this.heightReducedIndices.push(i); + this.matter.body.scale(voiceBody, 0.5, 0.5); + if (marbleImage) + marbleImage.setDisplaySize( + this.marbleRadius, + this.marbleRadius + ); + if (marbleMask) marbleMask.scale = 0.5; + this.marbleTrailParticles[i].setConfig({ + ...this.trailConfig, + scale: { start: 0.5, end: 0.01 }, + }); + } + } + // TODO: Optimized Code + // this.crossRightRotation.map((c) => { + // c.setAngle(c.angle + 2); + // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); + // }); + // this.crossLeftRotation.map((c) => { + // c.setAngle(c.angle - 2); + // this.matter.body.setAngularVelocity(c.body as BodyType, 0.05); + // }); + if (this.isInstrumentPlaying && this.isRotating === false) { + // /* + // let largest = -Infinity; + // let secondLargest = -Infinity; + // let largestIndex = -1; + // let finishedPositions = []; + // let voicesPositions = []; + + // for (let i = 0; i < this.marbles.length; i++) { + // const y = this.marbles[i].position.y; + // voicesPositions.push(y); + // if (y < this.finishLineOffset) { + // finishedPositions.push(y); + // if (y > largest) { + // secondLargest = largest; + // largest = y; + // largestIndex = i; + // } else if (y > secondLargest) { + // secondLargest = y; + // } + // } + // } + // */ + const unFinishedPositions = []; + const finishedPositions = []; + const voicesPositions = []; + for (let i = 0; i < this.marbles.length; i++) { + const y = this.marbles[i].position.y; + voicesPositions.push(y); + if (y < this.finishLineOffset) { + unFinishedPositions.push(y); + } else if (y > this.finishLineOffset) { + finishedPositions.push(y); + } + } + // Above is the refactored code + // const voicesPositions = this.marbles.map((m) => m.position.y); + // const unFinishedPositions = voicesPositions.filter( + // (y) => y < this.finishLineOffset + // ); + // const finishedPositions = voicesPositions.filter( + // (y) => y > this.finishLineOffset + // ); + + if (this.winnerIdx === -1 && finishedPositions.length) { + this.winnerIdx = voicesPositions.indexOf( + finishedPositions[0] + ); + } + const largest = Math.max(...unFinishedPositions); + const largestIndex = voicesPositions.findIndex( + (v) => v === largest + ); + const secondLargest = Math.max( + ...unFinishedPositions.filter((p) => p !== largest) + ); + if (largestIndex === -1) { + this.isGameOver = true; + return; + } + if ( + this.prevVoiceIdx !== largestIndex && + largest > secondLargest + this.marbleRadius + ) + this.throttledUpdate(largestIndex); + // else if (secondLargest >= largest - this.marbleRadius * 2) + // this.throttledUpdate(secondLargestIndex, false); + if (this.autoScroll) { + // this.cameras.main.startFollow(this.marblesImages[0]); + // this.cameras.main.scrollY = largest - 300 * this.dpr; + } + } + + // Optimised Code + // let largest = -Infinity; + // let secondLargest = -Infinity; + // let index = -1; + + // for (let i = 0; i < this.marbles.length; i++) { + // const y = this.marbles[i].position.y; + // if (y < this.finishLineOffset) { + // if (y > largest) { + // secondLargest = largest; + // largest = y; + // index = i; + // } else if (y > secondLargest) { + // secondLargest = y; + // } + // } + // } + // TODO: Uncomment this + // this.leftRotatableStars.map((rs) => rs.setAngle(rs.angle - 0.4)); + // this.rightRotatableStars.map((rs) => rs.setAngle(rs.angle + 0.4)); + // this.horizontalCrossRightRotation.map((rs) => + // rs.setAngle(rs.angle + 2.5) + // ); + // this.horizontalCrossLeftRotation.map((rs) => + // rs.setAngle(rs.angle - 2.5) + // ); + + // Bars up/down motion + // this.motionTimeForUpDownWard += delta; + // this.upDownMotionElems.map( + // ({ + // matter, + // startX, + // startY, + // moveSpeed, + // maxBottom, + // maxTop, + // direction, + // }) => { + // const amplitude = (maxBottom - maxTop) / 2; + // const offset = amplitude * Math.sin(time * (moveSpeed * 0.01)); + // // // Calculate new y position using a sine wave for smooth up and down movement + // // const range = maxBottom - maxTop; + // // const midPoint = maxTop + range / 2; + // // Calculate the new position considering the angle + // if (direction === "right") { + // const newX = + // startX + offset * Math.sin(Phaser.Math.DegToRad(7.1)); + // const newY = + // startY - offset * Math.cos(Phaser.Math.DegToRad(7.1)); + // // Update the rectangle's y position using a sine wave + // matter.setPosition(newX, newY); + // } else { + // const newX = + // startX + offset * Math.sin(Phaser.Math.DegToRad(-7.1)); + // const newY = + // startY - offset * Math.cos(Phaser.Math.DegToRad(-7.1)); + // // Update the rectangle's y position using a sine wave + // matter.setPosition(newX, newY); + // } + // } + // ); + } } } +// !wget -c "https://github.com/CPJKU/beat_this/raw/main/tests/It%20Don't%20Mean%20A%20Thing%20-%20Kings%20of%20Swing.mp3" -O music.mp3 + +// !ffmpeg -i music.mp3 -f segment -segment_time 10 -c copy "music-%03d.mp3" + diff --git a/src/game/scenes/Preloader.ts b/src/game/scenes/Preloader.ts index 255cbbc..317f378 100644 --- a/src/game/scenes/Preloader.ts +++ b/src/game/scenes/Preloader.ts @@ -39,10 +39,11 @@ export default class Preloader extends Phaser.Scene { this.load.image("hammer_2", "assets/sprite/weapons/hammer_level_2.png"); if (this.params.enableMotion) this.load.image("center_logo", "assets/transparent_logo.png"); - // this.load.json( - // "screen_sprite_data", - // "assets/sprite/screen_sprite.json" - // ); + if (this.params.voices.length) { + this.params.voices.map((voice) => { + this.load.image(`resized_${voice.id}`, voice.avatar); + }); + } this.params.selectedTracks.map((trackNo) => { switch (trackNo) { case "01":