/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var ColorPage = Container.expand(function () {
var self = Container.call(this);
self.colorData = null;
self.backgroundImage = null;
self.colorText = null;
self.scratchOverlay = null;
self.isCompleted = false;
self.setupPage = function (colorInfo) {
self.colorData = colorInfo;
// Create background image
self.backgroundImage = self.addChild(LK.getAsset(colorInfo.assetId, {
anchorX: 0.5,
anchorY: 0.5
}));
self.backgroundImage.x = 1024;
self.backgroundImage.y = 1366;
// Create color text
self.colorText = new Text2(colorInfo.text, {
size: 120,
fill: 0xFFFFFF
});
self.colorText.anchor.set(0.5, 0.5);
self.colorText.x = 1024;
self.colorText.y = 200;
self.addChild(self.colorText);
// Create scratch overlay
self.scratchOverlay = self.addChild(new ScratchOverlay());
self.scratchOverlay.x = 124;
self.scratchOverlay.y = 666;
self.scratchOverlay.createOverlayGrid();
self.isCompleted = false;
};
self.handleScratch = function (x, y) {
if (self.isCompleted) return false;
var localX = x - self.scratchOverlay.x;
var localY = y - self.scratchOverlay.y;
var removedCount = self.scratchOverlay.scratchAt(localX, localY);
if (removedCount > 0) {
LK.getSound('scratch').play();
var revealedPercentage = self.scratchOverlay.getRevealedPercentage();
if (revealedPercentage >= 0.6) {
self.completePage();
return true;
}
}
return false;
};
self.completePage = function () {
self.isCompleted = true;
// Remove remaining overlay pieces with animation
for (var i = 0; i < self.scratchOverlay.overlayPieces.length; i++) {
var piece = self.scratchOverlay.overlayPieces[i];
if (piece.isVisible) {
tween(piece, {
alpha: 0
}, {
duration: 300,
easing: tween.easeOut
});
}
}
};
self.resetPage = function () {
self.scratchOverlay.resetOverlay();
self.isCompleted = false;
};
return self;
});
var ScratchOverlay = Container.expand(function () {
var self = Container.call(this);
// Array to store all gray overlay pieces
self.overlayPieces = [];
// Create a grid of gray overlay pieces
self.createOverlayGrid = function () {
var pieceSize = 150;
var rows = Math.ceil(1400 / pieceSize);
var cols = Math.ceil(1800 / pieceSize);
for (var row = 0; row < rows; row++) {
for (var col = 0; col < cols; col++) {
var overlay = self.addChild(LK.getAsset('grayOverlay', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1,
scaleY: 1
}));
overlay.x = col * pieceSize + pieceSize / 2;
overlay.y = row * pieceSize + pieceSize / 2;
overlay.isVisible = true;
self.overlayPieces.push(overlay);
}
}
};
// Remove overlay pieces in a circular area around the tap
self.scratchAt = function (x, y) {
var scratchRadius = 120;
var removedCount = 0;
for (var i = 0; i < self.overlayPieces.length; i++) {
var piece = self.overlayPieces[i];
if (piece.isVisible) {
var distance = Math.sqrt(Math.pow(piece.x - x, 2) + Math.pow(piece.y - y, 2));
if (distance <= scratchRadius) {
piece.alpha = 0;
piece.isVisible = false;
removedCount++;
}
}
}
return removedCount;
};
// Check if enough area has been revealed
self.getRevealedPercentage = function () {
var totalPieces = self.overlayPieces.length;
var hiddenPieces = 0;
for (var i = 0; i < self.overlayPieces.length; i++) {
if (self.overlayPieces[i].isVisible) {
hiddenPieces++;
}
}
return (totalPieces - hiddenPieces) / totalPieces;
};
// Reset overlay for next page
self.resetOverlay = function () {
for (var i = 0; i < self.overlayPieces.length; i++) {
self.overlayPieces[i].alpha = 1;
self.overlayPieces[i].isVisible = true;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2C3E50
});
/****
* Game Code
****/
// Scratch sound effect
// Colorful background images for each color theme
// Gray overlay shape for scratch-off effect
// Color themes data
var colorThemes = [{
text: "YELLOW",
assetId: "yellowWellies"
}, {
text: "BLUE",
assetId: "blueSky"
}, {
text: "RED",
assetId: "redApples"
}, {
text: "GREEN",
assetId: "greenDinosaur"
}, {
text: "PURPLE",
assetId: "purpleGrapes"
}, {
text: "ORANGE",
assetId: "orangePumpkin"
}, {
text: "WHITE",
assetId: "whiteSnow"
}, {
text: "BLACK",
assetId: "blackSpiders"
}];
var currentPageIndex = 0;
var currentPage = null;
var completionDelay = 0;
var isTransitioning = false;
// Initialize first page
function setupNewPage() {
if (currentPage) {
game.removeChild(currentPage);
}
currentPage = game.addChild(new ColorPage());
currentPage.setupPage(colorThemes[currentPageIndex]);
isTransitioning = false;
completionDelay = 0;
}
// Handle tap events
game.down = function (x, y, obj) {
if (isTransitioning) return;
if (currentPage && !currentPage.isCompleted) {
var pageCompleted = currentPage.handleScratch(x, y);
if (pageCompleted) {
completionDelay = 120; // 2 seconds at 60fps
isTransitioning = true;
}
}
};
// Start with first page
setupNewPage();
// Main game loop
game.update = function () {
if (completionDelay > 0) {
completionDelay--;
if (completionDelay <= 0) {
// Move to next page
currentPageIndex = (currentPageIndex + 1) % colorThemes.length;
setupNewPage();
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var ColorPage = Container.expand(function () {
var self = Container.call(this);
self.colorData = null;
self.backgroundImage = null;
self.colorText = null;
self.scratchOverlay = null;
self.isCompleted = false;
self.setupPage = function (colorInfo) {
self.colorData = colorInfo;
// Create background image
self.backgroundImage = self.addChild(LK.getAsset(colorInfo.assetId, {
anchorX: 0.5,
anchorY: 0.5
}));
self.backgroundImage.x = 1024;
self.backgroundImage.y = 1366;
// Create color text
self.colorText = new Text2(colorInfo.text, {
size: 120,
fill: 0xFFFFFF
});
self.colorText.anchor.set(0.5, 0.5);
self.colorText.x = 1024;
self.colorText.y = 200;
self.addChild(self.colorText);
// Create scratch overlay
self.scratchOverlay = self.addChild(new ScratchOverlay());
self.scratchOverlay.x = 124;
self.scratchOverlay.y = 666;
self.scratchOverlay.createOverlayGrid();
self.isCompleted = false;
};
self.handleScratch = function (x, y) {
if (self.isCompleted) return false;
var localX = x - self.scratchOverlay.x;
var localY = y - self.scratchOverlay.y;
var removedCount = self.scratchOverlay.scratchAt(localX, localY);
if (removedCount > 0) {
LK.getSound('scratch').play();
var revealedPercentage = self.scratchOverlay.getRevealedPercentage();
if (revealedPercentage >= 0.6) {
self.completePage();
return true;
}
}
return false;
};
self.completePage = function () {
self.isCompleted = true;
// Remove remaining overlay pieces with animation
for (var i = 0; i < self.scratchOverlay.overlayPieces.length; i++) {
var piece = self.scratchOverlay.overlayPieces[i];
if (piece.isVisible) {
tween(piece, {
alpha: 0
}, {
duration: 300,
easing: tween.easeOut
});
}
}
};
self.resetPage = function () {
self.scratchOverlay.resetOverlay();
self.isCompleted = false;
};
return self;
});
var ScratchOverlay = Container.expand(function () {
var self = Container.call(this);
// Array to store all gray overlay pieces
self.overlayPieces = [];
// Create a grid of gray overlay pieces
self.createOverlayGrid = function () {
var pieceSize = 150;
var rows = Math.ceil(1400 / pieceSize);
var cols = Math.ceil(1800 / pieceSize);
for (var row = 0; row < rows; row++) {
for (var col = 0; col < cols; col++) {
var overlay = self.addChild(LK.getAsset('grayOverlay', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1,
scaleY: 1
}));
overlay.x = col * pieceSize + pieceSize / 2;
overlay.y = row * pieceSize + pieceSize / 2;
overlay.isVisible = true;
self.overlayPieces.push(overlay);
}
}
};
// Remove overlay pieces in a circular area around the tap
self.scratchAt = function (x, y) {
var scratchRadius = 120;
var removedCount = 0;
for (var i = 0; i < self.overlayPieces.length; i++) {
var piece = self.overlayPieces[i];
if (piece.isVisible) {
var distance = Math.sqrt(Math.pow(piece.x - x, 2) + Math.pow(piece.y - y, 2));
if (distance <= scratchRadius) {
piece.alpha = 0;
piece.isVisible = false;
removedCount++;
}
}
}
return removedCount;
};
// Check if enough area has been revealed
self.getRevealedPercentage = function () {
var totalPieces = self.overlayPieces.length;
var hiddenPieces = 0;
for (var i = 0; i < self.overlayPieces.length; i++) {
if (self.overlayPieces[i].isVisible) {
hiddenPieces++;
}
}
return (totalPieces - hiddenPieces) / totalPieces;
};
// Reset overlay for next page
self.resetOverlay = function () {
for (var i = 0; i < self.overlayPieces.length; i++) {
self.overlayPieces[i].alpha = 1;
self.overlayPieces[i].isVisible = true;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2C3E50
});
/****
* Game Code
****/
// Scratch sound effect
// Colorful background images for each color theme
// Gray overlay shape for scratch-off effect
// Color themes data
var colorThemes = [{
text: "YELLOW",
assetId: "yellowWellies"
}, {
text: "BLUE",
assetId: "blueSky"
}, {
text: "RED",
assetId: "redApples"
}, {
text: "GREEN",
assetId: "greenDinosaur"
}, {
text: "PURPLE",
assetId: "purpleGrapes"
}, {
text: "ORANGE",
assetId: "orangePumpkin"
}, {
text: "WHITE",
assetId: "whiteSnow"
}, {
text: "BLACK",
assetId: "blackSpiders"
}];
var currentPageIndex = 0;
var currentPage = null;
var completionDelay = 0;
var isTransitioning = false;
// Initialize first page
function setupNewPage() {
if (currentPage) {
game.removeChild(currentPage);
}
currentPage = game.addChild(new ColorPage());
currentPage.setupPage(colorThemes[currentPageIndex]);
isTransitioning = false;
completionDelay = 0;
}
// Handle tap events
game.down = function (x, y, obj) {
if (isTransitioning) return;
if (currentPage && !currentPage.isCompleted) {
var pageCompleted = currentPage.handleScratch(x, y);
if (pageCompleted) {
completionDelay = 120; // 2 seconds at 60fps
isTransitioning = true;
}
}
};
// Start with first page
setupNewPage();
// Main game loop
game.update = function () {
if (completionDelay > 0) {
completionDelay--;
if (completionDelay <= 0) {
// Move to next page
currentPageIndex = (currentPageIndex + 1) % colorThemes.length;
setupNewPage();
}
}
};