/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0, currentLevel: 1 }); /**** * Classes ****/ var Card = Container.expand(function (cardValue) { var self = Container.call(this); // The card's value (which determines its matching pair) self.cardValue = cardValue; // Card state self.isFlipped = false; self.isMatched = false; // Create card back (visible when card is face down) var back = self.attachAsset('cardBack', { anchorX: 0.5, anchorY: 0.5 }); // Create card front (visible when card is face up) var front = self.attachAsset('cardFront', { anchorX: 0.5, anchorY: 0.5, visible: false }); // Create card symbol (identifies the card) var symbol = self.attachAsset('cardMatch' + (cardValue % 10 + 1), { anchorX: 0.5, anchorY: 0.5, visible: false }); // Center the symbol on the card symbol.x = 0; symbol.y = 0; // Method to flip card face up self.flipUp = function () { if (self.isFlipped || self.isMatched) { return false; } LK.getSound('flip').play(); self.isFlipped = true; // Hide back, show front and symbol tween(back, { scaleX: 0 }, { duration: 150, onFinish: function onFinish() { back.visible = false; front.visible = true; symbol.visible = true; tween(front, { scaleX: 1 }, { duration: 150 }); tween(symbol, { scaleX: 1 }, { duration: 150 }); } }); return true; }; // Method to flip card face down self.flipDown = function () { if (!self.isFlipped || self.isMatched) { return; } self.isFlipped = false; // Hide front and symbol, show back tween(front, { scaleX: 0 }, { duration: 150, onFinish: function onFinish() { front.visible = false; symbol.visible = false; back.visible = true; tween(back, { scaleX: 1 }, { duration: 150 }); } }); }; // Method to mark card as matched self.setMatched = function () { self.isMatched = true; tween(self, { alpha: 0.7 }, { duration: 300 }); }; // Event handler for card click/tap self.down = function (x, y, obj) { if (!gameActive || self.isMatched || self.isFlipped) { return; } var flipped = self.flipUp(); if (flipped) { cardsFlipped.push(self); checkForMatch(); } }; // Pre-scale the back to ensure proper initial state front.scaleX = 0; symbol.scaleX = 0; return self; }); var Timer = Container.expand(function (duration) { var self = Container.call(this); self.duration = duration || 60000; // Default 60 seconds self.timeRemaining = self.duration; self.isRunning = false; // Create timer background var background = self.attachAsset('timerBarBg', { anchorX: 0, anchorY: 0.5 }); // Create timer bar that will shrink var bar = self.attachAsset('timerBar', { anchorX: 0, anchorY: 0.5 }); // Method to start the timer self.start = function () { self.timeRemaining = self.duration; self.isRunning = true; self.updateDisplay(); }; // Method to stop the timer self.stop = function () { self.isRunning = false; }; // Method to reset the timer self.reset = function (newDuration) { if (newDuration) { self.duration = newDuration; } self.timeRemaining = self.duration; self.updateDisplay(); }; // Update timer display based on time remaining self.updateDisplay = function () { var percentRemaining = self.timeRemaining / self.duration; bar.scale.x = Math.max(0, percentRemaining); }; // Method to update timer each frame self.update = function () { if (!self.isRunning) { return; } self.timeRemaining -= 16.67; // Approximate ms per frame at 60fps if (self.timeRemaining <= 0) { self.timeRemaining = 0; self.isRunning = false; if (gameActive) { gameActive = false; LK.showGameOver(); } } self.updateDisplay(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x34495e }); /**** * Game Code ****/ // Game state variables var gameActive = false; var cards = []; var cardsFlipped = []; var pairsFound = 0; var totalPairs = 0; var currentLevel = storage.currentLevel || 1; var score = 0; var moves = 0; var gridSize = 4; // Initial grid size (4x4) var previewTime = 3000; // Initial preview time in ms // UI elements var timer; var scoreTxt; var levelTxt; var movesTxt; // Initialize the game function initGame() { // Play background music LK.playMusic('gameMusic'); // Set up UI elements setupUI(); // Determine level settings calculateLevelSettings(); // Create card grid createCardGrid(); // Start the level with preview phase startLevel(); } // Set up UI elements function setupUI() { // Create timer timer = new Timer(60000); // 60 seconds timer.x = 2048 / 2 - 900; // Center timer horizontally timer.y = 100; game.addChild(timer); // Create score text scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(1, 0); LK.gui.topRight.addChild(scoreTxt); // Create level text levelTxt = new Text2('Level: ' + currentLevel, { size: 60, fill: 0xFFFFFF }); levelTxt.anchor.set(0, 0); LK.gui.topRight.addChild(levelTxt); levelTxt.y = 70; // Create moves text movesTxt = new Text2('Moves: 0', { size: 60, fill: 0xFFFFFF }); movesTxt.anchor.set(0, 0); LK.gui.topRight.addChild(movesTxt); movesTxt.y = 140; } // Calculate settings based on current level function calculateLevelSettings() { // Increase grid size every 3 levels if (currentLevel <= 3) { gridSize = 4; // 4x4 grid (16 cards, 8 pairs) } else if (currentLevel <= 6) { gridSize = 6; // 6x6 grid (36 cards, 18 pairs) } else { gridSize = 8; // 8x8 grid (64 cards, 32 pairs) } // Decrease preview time as levels increase previewTime = Math.max(1000, 3000 - (currentLevel - 1) * 300); // Adjust timer based on grid size var timerDuration = 30000 + gridSize * gridSize * 500; timer.reset(timerDuration); // Reset moves counter moves = 0; updateMovesText(); } // Create the grid of cards for the current level function createCardGrid() { // Clear any existing cards for (var i = 0; i < cards.length; i++) { if (cards[i].parent) { cards[i].parent.removeChild(cards[i]); } } cards = []; cardsFlipped = []; pairsFound = 0; // Calculate total pairs based on grid size totalPairs = gridSize * gridSize / 2; // Create array of card values (pairs) var cardValues = []; for (var i = 0; i < totalPairs; i++) { cardValues.push(i); cardValues.push(i); } // Shuffle the card values shuffleArray(cardValues); // Calculate card size and spacing based on grid size var cardSpacing = 20; var cardWidth = 200; var cardHeight = 280; // Calculate total grid width and height var gridWidth = gridSize * cardWidth + (gridSize - 1) * cardSpacing; var gridHeight = gridSize * cardHeight + (gridSize - 1) * cardSpacing; // Starting position for the grid (centered on screen) var startX = (2048 - gridWidth) / 2 + cardWidth / 2; var startY = (2732 - gridHeight) / 2 + cardHeight / 2; // Create and position cards var index = 0; for (var row = 0; row < gridSize; row++) { for (var col = 0; col < gridSize; col++) { // Ensure we don't try to create more cards than we have values if (index < cardValues.length) { var card = new Card(cardValues[index]); card.x = startX + col * (cardWidth + cardSpacing); card.y = startY + row * (cardHeight + cardSpacing); game.addChild(card); cards.push(card); index++; } } } } // Start a new level function startLevel() { // Reset state cardsFlipped = []; pairsFound = 0; // Update level text levelTxt.setText('Level: ' + currentLevel); // Preview phase - show all cards briefly for (var i = 0; i < cards.length; i++) { cards[i].flipUp(); } // After preview, flip all cards face down and start gameplay LK.setTimeout(function () { for (var i = 0; i < cards.length; i++) { cards[i].flipDown(); } // Start the timer timer.start(); // Activate gameplay gameActive = true; }, previewTime); } // Check if the two flipped cards match function checkForMatch() { if (cardsFlipped.length !== 2) { return; } // Increment moves moves++; updateMovesText(); // Get the two flipped cards var card1 = cardsFlipped[0]; var card2 = cardsFlipped[1]; // Disable further interactions temporarily gameActive = false; // Check if cards match if (card1.cardValue === card2.cardValue) { // Cards match! LK.getSound('match').play(); // Mark both cards as matched card1.setMatched(); card2.setMatched(); // Increment pairs found pairsFound++; // Add score score += 100 + Math.floor(timer.timeRemaining / 100); updateScoreText(); // Check if level is complete if (pairsFound >= totalPairs) { levelComplete(); } else { // Re-enable gameplay for next move cardsFlipped = []; gameActive = true; } } else { // Cards don't match, flip them back LK.getSound('noMatch').play(); LK.setTimeout(function () { card1.flipDown(); card2.flipDown(); cardsFlipped = []; gameActive = true; }, 1000); } } // Handle level completion function levelComplete() { // Stop the timer timer.stop(); // Play level complete sound LK.getSound('levelComplete').play(); // Add time bonus var timeBonus = Math.floor(timer.timeRemaining / 10); score += timeBonus; updateScoreText(); // Update high score if needed if (score > storage.highScore) { storage.highScore = score; } // Increment level currentLevel++; storage.currentLevel = currentLevel; // Show you win screen or proceed to next level LK.setTimeout(function () { if (currentLevel > 10) { // Player completed all levels LK.showYouWin(); } else { // Set up next level calculateLevelSettings(); createCardGrid(); startLevel(); } }, 1500); } // Update the score text function updateScoreText() { scoreTxt.setText('Score: ' + score); } // Update the moves text function updateMovesText() { movesTxt.setText('Moves: ' + moves); } // Utility function to shuffle an array function shuffleArray(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; } // Game update function game.update = function () { // Update timer if it exists if (timer) { timer.update(); } }; // Initialize game when loaded initGame();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,433 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ highScore: 0,
+ currentLevel: 1
+});
+
+/****
+* Classes
+****/
+var Card = Container.expand(function (cardValue) {
+ var self = Container.call(this);
+ // The card's value (which determines its matching pair)
+ self.cardValue = cardValue;
+ // Card state
+ self.isFlipped = false;
+ self.isMatched = false;
+ // Create card back (visible when card is face down)
+ var back = self.attachAsset('cardBack', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Create card front (visible when card is face up)
+ var front = self.attachAsset('cardFront', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ visible: false
+ });
+ // Create card symbol (identifies the card)
+ var symbol = self.attachAsset('cardMatch' + (cardValue % 10 + 1), {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ visible: false
+ });
+ // Center the symbol on the card
+ symbol.x = 0;
+ symbol.y = 0;
+ // Method to flip card face up
+ self.flipUp = function () {
+ if (self.isFlipped || self.isMatched) {
+ return false;
+ }
+ LK.getSound('flip').play();
+ self.isFlipped = true;
+ // Hide back, show front and symbol
+ tween(back, {
+ scaleX: 0
+ }, {
+ duration: 150,
+ onFinish: function onFinish() {
+ back.visible = false;
+ front.visible = true;
+ symbol.visible = true;
+ tween(front, {
+ scaleX: 1
+ }, {
+ duration: 150
+ });
+ tween(symbol, {
+ scaleX: 1
+ }, {
+ duration: 150
+ });
+ }
+ });
+ return true;
+ };
+ // Method to flip card face down
+ self.flipDown = function () {
+ if (!self.isFlipped || self.isMatched) {
+ return;
+ }
+ self.isFlipped = false;
+ // Hide front and symbol, show back
+ tween(front, {
+ scaleX: 0
+ }, {
+ duration: 150,
+ onFinish: function onFinish() {
+ front.visible = false;
+ symbol.visible = false;
+ back.visible = true;
+ tween(back, {
+ scaleX: 1
+ }, {
+ duration: 150
+ });
+ }
+ });
+ };
+ // Method to mark card as matched
+ self.setMatched = function () {
+ self.isMatched = true;
+ tween(self, {
+ alpha: 0.7
+ }, {
+ duration: 300
+ });
+ };
+ // Event handler for card click/tap
+ self.down = function (x, y, obj) {
+ if (!gameActive || self.isMatched || self.isFlipped) {
+ return;
+ }
+ var flipped = self.flipUp();
+ if (flipped) {
+ cardsFlipped.push(self);
+ checkForMatch();
+ }
+ };
+ // Pre-scale the back to ensure proper initial state
+ front.scaleX = 0;
+ symbol.scaleX = 0;
+ return self;
+});
+var Timer = Container.expand(function (duration) {
+ var self = Container.call(this);
+ self.duration = duration || 60000; // Default 60 seconds
+ self.timeRemaining = self.duration;
+ self.isRunning = false;
+ // Create timer background
+ var background = self.attachAsset('timerBarBg', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ // Create timer bar that will shrink
+ var bar = self.attachAsset('timerBar', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ // Method to start the timer
+ self.start = function () {
+ self.timeRemaining = self.duration;
+ self.isRunning = true;
+ self.updateDisplay();
+ };
+ // Method to stop the timer
+ self.stop = function () {
+ self.isRunning = false;
+ };
+ // Method to reset the timer
+ self.reset = function (newDuration) {
+ if (newDuration) {
+ self.duration = newDuration;
+ }
+ self.timeRemaining = self.duration;
+ self.updateDisplay();
+ };
+ // Update timer display based on time remaining
+ self.updateDisplay = function () {
+ var percentRemaining = self.timeRemaining / self.duration;
+ bar.scale.x = Math.max(0, percentRemaining);
+ };
+ // Method to update timer each frame
+ self.update = function () {
+ if (!self.isRunning) {
+ return;
+ }
+ self.timeRemaining -= 16.67; // Approximate ms per frame at 60fps
+ if (self.timeRemaining <= 0) {
+ self.timeRemaining = 0;
+ self.isRunning = false;
+ if (gameActive) {
+ gameActive = false;
+ LK.showGameOver();
+ }
+ }
+ self.updateDisplay();
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x34495e
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var gameActive = false;
+var cards = [];
+var cardsFlipped = [];
+var pairsFound = 0;
+var totalPairs = 0;
+var currentLevel = storage.currentLevel || 1;
+var score = 0;
+var moves = 0;
+var gridSize = 4; // Initial grid size (4x4)
+var previewTime = 3000; // Initial preview time in ms
+// UI elements
+var timer;
+var scoreTxt;
+var levelTxt;
+var movesTxt;
+// Initialize the game
+function initGame() {
+ // Play background music
+ LK.playMusic('gameMusic');
+ // Set up UI elements
+ setupUI();
+ // Determine level settings
+ calculateLevelSettings();
+ // Create card grid
+ createCardGrid();
+ // Start the level with preview phase
+ startLevel();
+}
+// Set up UI elements
+function setupUI() {
+ // Create timer
+ timer = new Timer(60000); // 60 seconds
+ timer.x = 2048 / 2 - 900; // Center timer horizontally
+ timer.y = 100;
+ game.addChild(timer);
+ // Create score text
+ scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ scoreTxt.anchor.set(1, 0);
+ LK.gui.topRight.addChild(scoreTxt);
+ // Create level text
+ levelTxt = new Text2('Level: ' + currentLevel, {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ levelTxt.anchor.set(0, 0);
+ LK.gui.topRight.addChild(levelTxt);
+ levelTxt.y = 70;
+ // Create moves text
+ movesTxt = new Text2('Moves: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ movesTxt.anchor.set(0, 0);
+ LK.gui.topRight.addChild(movesTxt);
+ movesTxt.y = 140;
+}
+// Calculate settings based on current level
+function calculateLevelSettings() {
+ // Increase grid size every 3 levels
+ if (currentLevel <= 3) {
+ gridSize = 4; // 4x4 grid (16 cards, 8 pairs)
+ } else if (currentLevel <= 6) {
+ gridSize = 6; // 6x6 grid (36 cards, 18 pairs)
+ } else {
+ gridSize = 8; // 8x8 grid (64 cards, 32 pairs)
+ }
+ // Decrease preview time as levels increase
+ previewTime = Math.max(1000, 3000 - (currentLevel - 1) * 300);
+ // Adjust timer based on grid size
+ var timerDuration = 30000 + gridSize * gridSize * 500;
+ timer.reset(timerDuration);
+ // Reset moves counter
+ moves = 0;
+ updateMovesText();
+}
+// Create the grid of cards for the current level
+function createCardGrid() {
+ // Clear any existing cards
+ for (var i = 0; i < cards.length; i++) {
+ if (cards[i].parent) {
+ cards[i].parent.removeChild(cards[i]);
+ }
+ }
+ cards = [];
+ cardsFlipped = [];
+ pairsFound = 0;
+ // Calculate total pairs based on grid size
+ totalPairs = gridSize * gridSize / 2;
+ // Create array of card values (pairs)
+ var cardValues = [];
+ for (var i = 0; i < totalPairs; i++) {
+ cardValues.push(i);
+ cardValues.push(i);
+ }
+ // Shuffle the card values
+ shuffleArray(cardValues);
+ // Calculate card size and spacing based on grid size
+ var cardSpacing = 20;
+ var cardWidth = 200;
+ var cardHeight = 280;
+ // Calculate total grid width and height
+ var gridWidth = gridSize * cardWidth + (gridSize - 1) * cardSpacing;
+ var gridHeight = gridSize * cardHeight + (gridSize - 1) * cardSpacing;
+ // Starting position for the grid (centered on screen)
+ var startX = (2048 - gridWidth) / 2 + cardWidth / 2;
+ var startY = (2732 - gridHeight) / 2 + cardHeight / 2;
+ // Create and position cards
+ var index = 0;
+ for (var row = 0; row < gridSize; row++) {
+ for (var col = 0; col < gridSize; col++) {
+ // Ensure we don't try to create more cards than we have values
+ if (index < cardValues.length) {
+ var card = new Card(cardValues[index]);
+ card.x = startX + col * (cardWidth + cardSpacing);
+ card.y = startY + row * (cardHeight + cardSpacing);
+ game.addChild(card);
+ cards.push(card);
+ index++;
+ }
+ }
+ }
+}
+// Start a new level
+function startLevel() {
+ // Reset state
+ cardsFlipped = [];
+ pairsFound = 0;
+ // Update level text
+ levelTxt.setText('Level: ' + currentLevel);
+ // Preview phase - show all cards briefly
+ for (var i = 0; i < cards.length; i++) {
+ cards[i].flipUp();
+ }
+ // After preview, flip all cards face down and start gameplay
+ LK.setTimeout(function () {
+ for (var i = 0; i < cards.length; i++) {
+ cards[i].flipDown();
+ }
+ // Start the timer
+ timer.start();
+ // Activate gameplay
+ gameActive = true;
+ }, previewTime);
+}
+// Check if the two flipped cards match
+function checkForMatch() {
+ if (cardsFlipped.length !== 2) {
+ return;
+ }
+ // Increment moves
+ moves++;
+ updateMovesText();
+ // Get the two flipped cards
+ var card1 = cardsFlipped[0];
+ var card2 = cardsFlipped[1];
+ // Disable further interactions temporarily
+ gameActive = false;
+ // Check if cards match
+ if (card1.cardValue === card2.cardValue) {
+ // Cards match!
+ LK.getSound('match').play();
+ // Mark both cards as matched
+ card1.setMatched();
+ card2.setMatched();
+ // Increment pairs found
+ pairsFound++;
+ // Add score
+ score += 100 + Math.floor(timer.timeRemaining / 100);
+ updateScoreText();
+ // Check if level is complete
+ if (pairsFound >= totalPairs) {
+ levelComplete();
+ } else {
+ // Re-enable gameplay for next move
+ cardsFlipped = [];
+ gameActive = true;
+ }
+ } else {
+ // Cards don't match, flip them back
+ LK.getSound('noMatch').play();
+ LK.setTimeout(function () {
+ card1.flipDown();
+ card2.flipDown();
+ cardsFlipped = [];
+ gameActive = true;
+ }, 1000);
+ }
+}
+// Handle level completion
+function levelComplete() {
+ // Stop the timer
+ timer.stop();
+ // Play level complete sound
+ LK.getSound('levelComplete').play();
+ // Add time bonus
+ var timeBonus = Math.floor(timer.timeRemaining / 10);
+ score += timeBonus;
+ updateScoreText();
+ // Update high score if needed
+ if (score > storage.highScore) {
+ storage.highScore = score;
+ }
+ // Increment level
+ currentLevel++;
+ storage.currentLevel = currentLevel;
+ // Show you win screen or proceed to next level
+ LK.setTimeout(function () {
+ if (currentLevel > 10) {
+ // Player completed all levels
+ LK.showYouWin();
+ } else {
+ // Set up next level
+ calculateLevelSettings();
+ createCardGrid();
+ startLevel();
+ }
+ }, 1500);
+}
+// Update the score text
+function updateScoreText() {
+ scoreTxt.setText('Score: ' + score);
+}
+// Update the moves text
+function updateMovesText() {
+ movesTxt.setText('Moves: ' + moves);
+}
+// Utility function to shuffle an array
+function shuffleArray(array) {
+ for (var i = array.length - 1; i > 0; i--) {
+ var j = Math.floor(Math.random() * (i + 1));
+ var temp = array[i];
+ array[i] = array[j];
+ array[j] = temp;
+ }
+ return array;
+}
+// Game update function
+game.update = function () {
+ // Update timer if it exists
+ if (timer) {
+ timer.update();
+ }
+};
+// Initialize game when loaded
+initGame();
\ No newline at end of file
mg. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
cardfront mg. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
mg. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
cardback mg. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows