import { createCard } from "./createCard.js"; /** * Card Memory Game by Francisco Pereira (Gammafp) * ----------------------------------------------- * * Test your memory skills in this classic game of matching pairs. * Flip over cards to reveal pictures, and try to remember where each image is located. * Match all the pairs to win! * * Music credits: * "Fat Caps" by Audionautix is licensed under the Creative Commons Attribution 4.0 license. https://creativecommons.org/licenses/by/4.0/ * Artist http://audionautix.com/ */ export class Play extends Phaser.Scene { // All cards names cardNames = ["card-0", "card-1", "card-2", "card-3", "card-4", "card-5"]; // Cards Game Objects cards = []; // History of card opened cardOpened = undefined; // Can play the game canMove = false; // Game variables lives = 0; // Grid configuration gridConfiguration = { x: 113, y: 102, paddingX: 10, paddingY: 10 } constructor () { super({ key: 'Play' }); } init () { // Fadein camera this.cameras.main.fadeIn(500); this.lives = 10; this.volumeButton(); } create () { // Background image this.add.image(this.gridConfiguration.x - 63, this.gridConfiguration.y - 77, "background").setOrigin(0); const titleText = this.add.text(this.sys.game.scale.width / 2, this.sys.game.scale.height / 2, "Memory Card Game\nClick to Play", { align: "center", strokeThickness: 4, fontSize: 40, fontStyle: "bold", color: "#8c7ae6" } ) .setOrigin(.5) .setDepth(3) .setInteractive(); // title tween like retro arcade this.add.tween({ targets: titleText, duration: 800, ease: (value) => (value > .8), alpha: 0, repeat: -1, yoyo: true, }); // Text Events titleText.on(Phaser.Input.Events.POINTER_OVER, () => { titleText.setColor("#9c88ff"); this.input.setDefaultCursor("pointer"); }); titleText.on(Phaser.Input.Events.POINTER_OUT, () => { titleText.setColor("#8c7ae6"); this.input.setDefaultCursor("default"); }); titleText.on(Phaser.Input.Events.POINTER_DOWN, () => { this.sound.play("whoosh", { volume: 1.3 }); this.add.tween({ targets: titleText, ease: Phaser.Math.Easing.Bounce.InOut, y: -1000, onComplete: () => { if (!this.sound.get("theme-song")) { this.sound.play("theme-song", { loop: true, volume: .5 }); } this.startGame(); } }) }); } restartGame () { this.cardOpened = undefined; this.cameras.main.fadeOut(200 * this.cards.length); this.cards.reverse().map((card, index) => { this.add.tween({ targets: card.gameObject, duration: 500, y: 1000, delay: index * 100, onComplete: () => { card.gameObject.destroy(); } }) }); this.time.addEvent({ delay: 200 * this.cards.length, callback: () => { this.cards = []; this.canMove = false; this.scene.restart(); this.sound.play("card-slide", { volume: 1.2 }); } }) } createGridCards () { // Phaser random array position const gridCardNames = Phaser.Utils.Array.Shuffle([...this.cardNames, ...this.cardNames]); return gridCardNames.map((name, index) => { const newCard = createCard({ scene: this, x: this.gridConfiguration.x + (98 + this.gridConfiguration.paddingX) * (index % 4), y: -1000, frontTexture: name, cardName: name }); this.add.tween({ targets: newCard.gameObject, duration: 800, delay: index * 100, onStart: () => this.sound.play("card-slide", { volume: 1.2 }), y: this.gridConfiguration.y + (128 + this.gridConfiguration.paddingY) * Math.floor(index / 4) }) return newCard; }); } createHearts () { return Array.from(new Array(this.lives)).map((el, index) => { const heart = this.add.image(this.sys.game.scale.width + 1000, 20, "heart") .setScale(2) this.add.tween({ targets: heart, ease: Phaser.Math.Easing.Expo.InOut, duration: 1000, delay: 1000 + index * 200, x: 140 + 30 * index // marginLeft + spaceBetween * index }); return heart; }); } volumeButton () { const volumeIcon = this.add.image(25, 25, "volume-icon").setName("volume-icon"); volumeIcon.setInteractive(); // Mouse enter volumeIcon.on(Phaser.Input.Events.POINTER_OVER, () => { this.input.setDefaultCursor("pointer"); }); // Mouse leave volumeIcon.on(Phaser.Input.Events.POINTER_OUT, () => { console.log("Mouse leave"); this.input.setDefaultCursor("default"); }); volumeIcon.on(Phaser.Input.Events.POINTER_DOWN, () => { if (this.sound.volume === 0) { this.sound.setVolume(1); volumeIcon.setTexture("volume-icon"); volumeIcon.setAlpha(1); } else { this.sound.setVolume(0); volumeIcon.setTexture("volume-icon_off"); volumeIcon.setAlpha(.5) } }); } startGame () { // WinnerText and GameOverText const winnerText = this.add.text(this.sys.game.scale.width / 2, -1000, "YOU WIN", { align: "center", strokeThickness: 4, fontSize: 40, fontStyle: "bold", color: "#8c7ae6" } ).setOrigin(.5) .setDepth(3) .setInteractive(); const gameOverText = this.add.text(this.sys.game.scale.width / 2, -1000, "GAME OVER\nClick to restart", { align: "center", strokeThickness: 4, fontSize: 40, fontStyle: "bold", color: "#ff0000" } ) .setName("gameOverText") .setDepth(3) .setOrigin(.5) .setInteractive(); // Start lifes images const hearts = this.createHearts(); // Create a grid of cards this.cards = this.createGridCards(); // Start canMove this.time.addEvent({ delay: 200 * this.cards.length, callback: () => { this.canMove = true; } }); // Game Logic this.input.on(Phaser.Input.Events.POINTER_MOVE, (pointer) => { if (this.canMove) { const card = this.cards.find(card => card.gameObject.hasFaceAt(pointer.x, pointer.y)); if (card) { this.input.setDefaultCursor("pointer"); } else { if(go[0]) { if(go[0].name !== "volume-icon") { this.input.setDefaultCursor("pointer"); } } else { this.input.setDefaultCursor("default"); } } } }); this.input.on(Phaser.Input.Events.POINTER_DOWN, (pointer) => { if (this.canMove && this.cards.length) { const card = this.cards.find(card => card.gameObject.hasFaceAt(pointer.x, pointer.y)); if (card) { this.canMove = false; // Detect if there is a card opened if (this.cardOpened !== undefined) { // If the card is the same that the opened not do anything if (this.cardOpened.gameObject.x === card.gameObject.x && this.cardOpened.gameObject.y === card.gameObject.y) { this.canMove = true; return false; } card.flip(() => { if (this.cardOpened.cardName === card.cardName) { // ------- Match ------- this.sound.play("card-match"); // Destroy card selected and card opened from history this.cardOpened.destroy(); card.destroy(); // remove card destroyed from array this.cards = this.cards.filter(cardLocal => cardLocal.cardName !== card.cardName); // reset history card opened this.cardOpened = undefined; this.canMove = true; } else { // ------- No match ------- this.sound.play("card-mismatch"); this.cameras.main.shake(600, 0.01); // remove life and heart const lastHeart = hearts[hearts.length - 1]; this.add.tween({ targets: lastHeart, ease: Phaser.Math.Easing.Expo.InOut, duration: 1000, y: - 1000, onComplete: () => { lastHeart.destroy(); hearts.pop(); } }); this.lives -= 1; // Flip last card selected and flip the card opened from history and reset history card.flip(); this.cardOpened.flip(() => { this.cardOpened = undefined; this.canMove = true; }); } // Check if the game is over if (this.lives === 0) { // Show Game Over text this.sound.play("whoosh", { volume: 1.3 }); this.add.tween({ targets: gameOverText, ease: Phaser.Math.Easing.Bounce.Out, y: this.sys.game.scale.height / 2, }); this.canMove = false; } // Check if the game is won if (this.cards.length === 0) { this.sound.play("whoosh", { volume: 1.3 }); this.sound.play("victory"); this.add.tween({ targets: winnerText, ease: Phaser.Math.Easing.Bounce.Out, y: this.sys.game.scale.height / 2, }); this.canMove = false; } }); } else if (this.cardOpened === undefined && this.lives > 0 && this.cards.length > 0) { // If there is not a card opened save the card selected card.flip(() => { this.canMove = true; }); this.cardOpened = card; } } } }); // Text events winnerText.on(Phaser.Input.Events.POINTER_OVER, () => { winnerText.setColor("#FF7F50"); this.input.setDefaultCursor("pointer"); }); winnerText.on(Phaser.Input.Events.POINTER_OUT, () => { winnerText.setColor("#8c7ae6"); this.input.setDefaultCursor("default"); }); winnerText.on(Phaser.Input.Events.POINTER_DOWN, () => { this.sound.play("whoosh", { volume: 1.3 }); this.add.tween({ targets: winnerText, ease: Phaser.Math.Easing.Bounce.InOut, y: -1000, onComplete: () => { this.restartGame(); } }) }); gameOverText.on(Phaser.Input.Events.POINTER_OVER, () => { gameOverText.setColor("#FF7F50"); this.input.setDefaultCursor("pointer"); }); gameOverText.on(Phaser.Input.Events.POINTER_OUT, () => { gameOverText.setColor("#8c7ae6"); this.input.setDefaultCursor("default"); }); gameOverText.on(Phaser.Input.Events.POINTER_DOWN, () => { this.add.tween({ targets: gameOverText, ease: Phaser.Math.Easing.Bounce.InOut, y: -1000, onComplete: () => { this.restartGame(); } }) }); } }
/** * Create a card game object */ export const createCard = ({ scene, x, y, frontTexture, cardName }) => { let isFlipping = false; const rotation = { y: 0 }; const backTexture = "card-back"; const card = scene.add.plane(x, y, backTexture) .setName(cardName) .setInteractive(); // start with the card face down card.modelRotationY = 180; const flipCard = (callbackComplete) => { if (isFlipping) { return; } scene.add.tween({ targets: [rotation], y: (rotation.y === 180) ? 0 : 180, ease: Phaser.Math.Easing.Expo.Out, duration: 500, onStart: () => { isFlipping = true; scene.sound.play("card-flip"); scene.tweens.chain({ targets: card, ease: Phaser.Math.Easing.Expo.InOut, tweens: [ { duration: 200, scale: 1.1, }, { duration: 300, scale: 1 }, ] }) }, onUpdate: () => { // card.modelRotation.y = Phaser.Math.DegToRad(180) + Phaser.Math.DegToRad(rotation.y); card.rotateY = 180 + rotation.y; const cardRotation = Math.floor(card.rotateY) % 360; if ((cardRotation >= 0 && cardRotation <= 90) || (cardRotation >= 270 && cardRotation <= 359)) { card.setTexture(frontTexture); } else { card.setTexture(backTexture); } }, onComplete: () => { isFlipping = false; if (callbackComplete) { callbackComplete(); } } }); } const destroy = () => { scene.add.tween({ targets: [card], y: card.y - 1000, easing: Phaser.Math.Easing.Elastic.In, duration: 500, onComplete: () => { card.destroy(); } }) } return { gameObject: card, flip: flipCard, destroy, cardName } }
export class Preloader extends Phaser.Scene { constructor() { super({ key: 'Preloader' }); } preload () { this.load.setBaseURL('https://cdn.phaserfiles.com/v385'); this.load.setPath("assets/games/card-memory-game/"); this.load.image("volume-icon", "ui/volume-icon.png"); this.load.image("volume-icon_off", "ui/volume-icon_off.png"); this.load.audio("theme-song", "audio/fat-caps-audionatix.mp3"); this.load.audio("whoosh", "audio/whoosh.mp3"); this.load.audio("card-flip", "audio/card-flip.mp3"); this.load.audio("card-match", "audio/card-match.mp3"); this.load.audio("card-mismatch", "audio/card-mismatch.mp3"); this.load.audio("card-slide", "audio/card-slide.mp3"); this.load.audio("victory", "audio/victory.mp3"); this.load.image("background"); this.load.image("card-back", "cards/card-back.png"); this.load.image("card-0", "cards/card-0.png"); this.load.image("card-1", "cards/card-1.png"); this.load.image("card-2", "cards/card-2.png"); this.load.image("card-3", "cards/card-3.png"); this.load.image("card-4", "cards/card-4.png"); this.load.image("card-5", "cards/card-5.png"); this.load.image("heart", "ui/heart.png"); } create () { this.scene.start("Play"); } }
import { Preloader } from './Preloader.js'; import { Play } from './Play.js'; const config = { title: 'Card Memory Game', type: Phaser.AUTO, backgroundColor: "#192a56", width: 549, height: 480, parent: "phaser-example", render: { pixelArt: true, }, scene: [ Preloader, Play ] }; new Phaser.Game(config);
Scan to open on your mobile device
import { createCard } from "./createCard.js"; /** * Card Memory Game by Francisco Pereira (Gammafp) * ----------------------------------------------- * * Test your memory skills in this classic game of matching pairs. * Flip over cards to reveal pictures, and try to remember where each image is located. * Match all the pairs to win! * * Music credits: * "Fat Caps" by Audionautix is licensed under the Creative Commons Attribution 4.0 license. https://creativecommons.org/licenses/by/4.0/ * Artist http://audionautix.com/ */ export class Play extends Phaser.Scene { // All cards names cardNames = ["card-0", "card-1", "card-2", "card-3", "card-4", "card-5"]; // Cards Game Objects cards = []; // History of card opened cardOpened = undefined; // Can play the game canMove = false; // Game variables lives = 0; // Grid configuration gridConfiguration = { x: 113, y: 102, paddingX: 10, paddingY: 10 } constructor () { super({ key: 'Play' }); } init () { // Fadein camera this.cameras.main.fadeIn(500); this.lives = 10; this.volumeButton(); } create () { // Background image this.add.image(this.gridConfiguration.x - 63, this.gridConfiguration.y - 77, "background").setOrigin(0); const titleText = this.add.text(this.sys.game.scale.width / 2, this.sys.game.scale.height / 2, "Memory Card Game\nClick to Play", { align: "center", strokeThickness: 4, fontSize: 40, fontStyle: "bold", color: "#8c7ae6" } ) .setOrigin(.5) .setDepth(3) .setInteractive(); // title tween like retro arcade this.add.tween({ targets: titleText, duration: 800, ease: (value) => (value > .8), alpha: 0, repeat: -1, yoyo: true, }); // Text Events titleText.on(Phaser.Input.Events.POINTER_OVER, () => { titleText.setColor("#9c88ff"); this.input.setDefaultCursor("pointer"); }); titleText.on(Phaser.Input.Events.POINTER_OUT, () => { titleText.setColor("#8c7ae6"); this.input.setDefaultCursor("default"); }); titleText.on(Phaser.Input.Events.POINTER_DOWN, () => { this.sound.play("whoosh", { volume: 1.3 }); this.add.tween({ targets: titleText, ease: Phaser.Math.Easing.Bounce.InOut, y: -1000, onComplete: () => { if (!this.sound.get("theme-song")) { this.sound.play("theme-song", { loop: true, volume: .5 }); } this.startGame(); } }) }); } restartGame () { this.cardOpened = undefined; this.cameras.main.fadeOut(200 * this.cards.length); this.cards.reverse().map((card, index) => { this.add.tween({ targets: card.gameObject, duration: 500, y: 1000, delay: index * 100, onComplete: () => { card.gameObject.destroy(); } }) }); this.time.addEvent({ delay: 200 * this.cards.length, callback: () => { this.cards = []; this.canMove = false; this.scene.restart(); this.sound.play("card-slide", { volume: 1.2 }); } }) } createGridCards () { // Phaser random array position const gridCardNames = Phaser.Utils.Array.Shuffle([...this.cardNames, ...this.cardNames]); return gridCardNames.map((name, index) => { const newCard = createCard({ scene: this, x: this.gridConfiguration.x + (98 + this.gridConfiguration.paddingX) * (index % 4), y: -1000, frontTexture: name, cardName: name }); this.add.tween({ targets: newCard.gameObject, duration: 800, delay: index * 100, onStart: () => this.sound.play("card-slide", { volume: 1.2 }), y: this.gridConfiguration.y + (128 + this.gridConfiguration.paddingY) * Math.floor(index / 4) }) return newCard; }); } createHearts () { return Array.from(new Array(this.lives)).map((el, index) => { const heart = this.add.image(this.sys.game.scale.width + 1000, 20, "heart") .setScale(2) this.add.tween({ targets: heart, ease: Phaser.Math.Easing.Expo.InOut, duration: 1000, delay: 1000 + index * 200, x: 140 + 30 * index // marginLeft + spaceBetween * index }); return heart; }); } volumeButton () { const volumeIcon = this.add.image(25, 25, "volume-icon").setName("volume-icon"); volumeIcon.setInteractive(); // Mouse enter volumeIcon.on(Phaser.Input.Events.POINTER_OVER, () => { this.input.setDefaultCursor("pointer"); }); // Mouse leave volumeIcon.on(Phaser.Input.Events.POINTER_OUT, () => { console.log("Mouse leave"); this.input.setDefaultCursor("default"); }); volumeIcon.on(Phaser.Input.Events.POINTER_DOWN, () => { if (this.sound.volume === 0) { this.sound.setVolume(1); volumeIcon.setTexture("volume-icon"); volumeIcon.setAlpha(1); } else { this.sound.setVolume(0); volumeIcon.setTexture("volume-icon_off"); volumeIcon.setAlpha(.5) } }); } startGame () { // WinnerText and GameOverText const winnerText = this.add.text(this.sys.game.scale.width / 2, -1000, "YOU WIN", { align: "center", strokeThickness: 4, fontSize: 40, fontStyle: "bold", color: "#8c7ae6" } ).setOrigin(.5) .setDepth(3) .setInteractive(); const gameOverText = this.add.text(this.sys.game.scale.width / 2, -1000, "GAME OVER\nClick to restart", { align: "center", strokeThickness: 4, fontSize: 40, fontStyle: "bold", color: "#ff0000" } ) .setName("gameOverText") .setDepth(3) .setOrigin(.5) .setInteractive(); // Start lifes images const hearts = this.createHearts(); // Create a grid of cards this.cards = this.createGridCards(); // Start canMove this.time.addEvent({ delay: 200 * this.cards.length, callback: () => { this.canMove = true; } }); // Game Logic this.input.on(Phaser.Input.Events.POINTER_MOVE, (pointer) => { if (this.canMove) { const card = this.cards.find(card => card.gameObject.hasFaceAt(pointer.x, pointer.y)); if (card) { this.input.setDefaultCursor("pointer"); } else { if(go[0]) { if(go[0].name !== "volume-icon") { this.input.setDefaultCursor("pointer"); } } else { this.input.setDefaultCursor("default"); } } } }); this.input.on(Phaser.Input.Events.POINTER_DOWN, (pointer) => { if (this.canMove && this.cards.length) { const card = this.cards.find(card => card.gameObject.hasFaceAt(pointer.x, pointer.y)); if (card) { this.canMove = false; // Detect if there is a card opened if (this.cardOpened !== undefined) { // If the card is the same that the opened not do anything if (this.cardOpened.gameObject.x === card.gameObject.x && this.cardOpened.gameObject.y === card.gameObject.y) { this.canMove = true; return false; } card.flip(() => { if (this.cardOpened.cardName === card.cardName) { // ------- Match ------- this.sound.play("card-match"); // Destroy card selected and card opened from history this.cardOpened.destroy(); card.destroy(); // remove card destroyed from array this.cards = this.cards.filter(cardLocal => cardLocal.cardName !== card.cardName); // reset history card opened this.cardOpened = undefined; this.canMove = true; } else { // ------- No match ------- this.sound.play("card-mismatch"); this.cameras.main.shake(600, 0.01); // remove life and heart const lastHeart = hearts[hearts.length - 1]; this.add.tween({ targets: lastHeart, ease: Phaser.Math.Easing.Expo.InOut, duration: 1000, y: - 1000, onComplete: () => { lastHeart.destroy(); hearts.pop(); } }); this.lives -= 1; // Flip last card selected and flip the card opened from history and reset history card.flip(); this.cardOpened.flip(() => { this.cardOpened = undefined; this.canMove = true; }); } // Check if the game is over if (this.lives === 0) { // Show Game Over text this.sound.play("whoosh", { volume: 1.3 }); this.add.tween({ targets: gameOverText, ease: Phaser.Math.Easing.Bounce.Out, y: this.sys.game.scale.height / 2, }); this.canMove = false; } // Check if the game is won if (this.cards.length === 0) { this.sound.play("whoosh", { volume: 1.3 }); this.sound.play("victory"); this.add.tween({ targets: winnerText, ease: Phaser.Math.Easing.Bounce.Out, y: this.sys.game.scale.height / 2, }); this.canMove = false; } }); } else if (this.cardOpened === undefined && this.lives > 0 && this.cards.length > 0) { // If there is not a card opened save the card selected card.flip(() => { this.canMove = true; }); this.cardOpened = card; } } } }); // Text events winnerText.on(Phaser.Input.Events.POINTER_OVER, () => { winnerText.setColor("#FF7F50"); this.input.setDefaultCursor("pointer"); }); winnerText.on(Phaser.Input.Events.POINTER_OUT, () => { winnerText.setColor("#8c7ae6"); this.input.setDefaultCursor("default"); }); winnerText.on(Phaser.Input.Events.POINTER_DOWN, () => { this.sound.play("whoosh", { volume: 1.3 }); this.add.tween({ targets: winnerText, ease: Phaser.Math.Easing.Bounce.InOut, y: -1000, onComplete: () => { this.restartGame(); } }) }); gameOverText.on(Phaser.Input.Events.POINTER_OVER, () => { gameOverText.setColor("#FF7F50"); this.input.setDefaultCursor("pointer"); }); gameOverText.on(Phaser.Input.Events.POINTER_OUT, () => { gameOverText.setColor("#8c7ae6"); this.input.setDefaultCursor("default"); }); gameOverText.on(Phaser.Input.Events.POINTER_DOWN, () => { this.add.tween({ targets: gameOverText, ease: Phaser.Math.Easing.Bounce.InOut, y: -1000, onComplete: () => { this.restartGame(); } }) }); } }
/** * Create a card game object */ export const createCard = ({ scene, x, y, frontTexture, cardName }) => { let isFlipping = false; const rotation = { y: 0 }; const backTexture = "card-back"; const card = scene.add.plane(x, y, backTexture) .setName(cardName) .setInteractive(); // start with the card face down card.modelRotationY = 180; const flipCard = (callbackComplete) => { if (isFlipping) { return; } scene.add.tween({ targets: [rotation], y: (rotation.y === 180) ? 0 : 180, ease: Phaser.Math.Easing.Expo.Out, duration: 500, onStart: () => { isFlipping = true; scene.sound.play("card-flip"); scene.tweens.chain({ targets: card, ease: Phaser.Math.Easing.Expo.InOut, tweens: [ { duration: 200, scale: 1.1, }, { duration: 300, scale: 1 }, ] }) }, onUpdate: () => { // card.modelRotation.y = Phaser.Math.DegToRad(180) + Phaser.Math.DegToRad(rotation.y); card.rotateY = 180 + rotation.y; const cardRotation = Math.floor(card.rotateY) % 360; if ((cardRotation >= 0 && cardRotation <= 90) || (cardRotation >= 270 && cardRotation <= 359)) { card.setTexture(frontTexture); } else { card.setTexture(backTexture); } }, onComplete: () => { isFlipping = false; if (callbackComplete) { callbackComplete(); } } }); } const destroy = () => { scene.add.tween({ targets: [card], y: card.y - 1000, easing: Phaser.Math.Easing.Elastic.In, duration: 500, onComplete: () => { card.destroy(); } }) } return { gameObject: card, flip: flipCard, destroy, cardName } }
export class Preloader extends Phaser.Scene { constructor() { super({ key: 'Preloader' }); } preload () { this.load.setBaseURL('https://cdn.phaserfiles.com/v385'); this.load.setPath("assets/games/card-memory-game/"); this.load.image("volume-icon", "ui/volume-icon.png"); this.load.image("volume-icon_off", "ui/volume-icon_off.png"); this.load.audio("theme-song", "audio/fat-caps-audionatix.mp3"); this.load.audio("whoosh", "audio/whoosh.mp3"); this.load.audio("card-flip", "audio/card-flip.mp3"); this.load.audio("card-match", "audio/card-match.mp3"); this.load.audio("card-mismatch", "audio/card-mismatch.mp3"); this.load.audio("card-slide", "audio/card-slide.mp3"); this.load.audio("victory", "audio/victory.mp3"); this.load.image("background"); this.load.image("card-back", "cards/card-back.png"); this.load.image("card-0", "cards/card-0.png"); this.load.image("card-1", "cards/card-1.png"); this.load.image("card-2", "cards/card-2.png"); this.load.image("card-3", "cards/card-3.png"); this.load.image("card-4", "cards/card-4.png"); this.load.image("card-5", "cards/card-5.png"); this.load.image("heart", "ui/heart.png"); } create () { this.scene.start("Play"); } }
import { Preloader } from './Preloader.js'; import { Play } from './Play.js'; const config = { title: 'Card Memory Game', type: Phaser.AUTO, backgroundColor: "#192a56", width: 549, height: 480, parent: "phaser-example", render: { pixelArt: true, }, scene: [ Preloader, Play ] }; new Phaser.Game(config);