/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var BunnyRunPlayer = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('easterBunny', { anchorX: 0.5, anchorY: 1.0, scaleX: 0.5, scaleY: 0.5 }); var lavaGraphics = self.attachAsset('lavaBunny', { anchorX: 0.5, anchorY: 1.0, scaleX: 0.5, scaleY: 0.5 }); lavaGraphics.visible = false; self.isJumping = false; self.jumpSpeed = 0; self.gravity = 1; self.groundY = 2400; self.transformToLava = function () { playerGraphics.visible = false; lavaGraphics.visible = true; tween(self, { tint: 0xff4444 }, { duration: 300, easing: tween.easeOut }); }; self.transformToNormal = function () { playerGraphics.visible = true; lavaGraphics.visible = false; tween(self, { tint: 0xffffff }, { duration: 300, easing: tween.easeOut }); }; self.update = function () { if (self.isJumping) { self.y += self.jumpSpeed; self.jumpSpeed += self.gravity; if (self.y >= self.groundY) { self.y = self.groundY; self.isJumping = false; self.jumpSpeed = 0; } } }; self.jump = function () { if (!self.isJumping) { self.isJumping = true; self.jumpSpeed = -35; } }; return self; }); var Egg = Container.expand(function (eggType) { var self = Container.call(this); var eggGraphics = self.attachAsset(eggType, { anchorX: 0.5, anchorY: 0.5 }); self.down = function (x, y, obj) { collectEgg(self); }; return self; }); var HighScoreButton = Container.expand(function () { var self = Container.call(this); var buttonGraphics = self.attachAsset('highScoreButton', { anchorX: 0.5, anchorY: 0.5 }); var buttonText = new Text2('HIGH SCORES', { size: 50, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.down = function (x, y, obj) { showHighScores(); }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 1.0 }); self.update = function () { self.x -= obstacleSpeed; }; return self; }); var PlayButton = Container.expand(function () { var self = Container.call(this); var buttonGraphics = self.attachAsset('playButton', { anchorX: 0.5, anchorY: 0.5 }); var buttonText = new Text2('PLAY', { size: 60, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.down = function (x, y, obj) { startGame(); }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerUpGraphics = self.attachAsset('powerUpSprite', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { self.x -= obstacleSpeed; }; return self; }); var XButton = Container.expand(function () { var self = Container.call(this); var buttonBackground = self.attachAsset('xButtonBackground', { anchorX: 0.5, anchorY: 0.5 }); var xText = new Text2('X', { size: 80, fill: 0xFFFFFF }); xText.anchor.set(0.5, 0.5); self.addChild(xText); self.down = function (x, y, obj) { closeShop(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x00ff00 }); /**** * Game Code ****/ var gameState = 'title'; // 'title', 'playing', 'shop', or 'bunnyrun' var bunnyRunPlayer; var obstacles = []; var powerUps = []; var bunnyRunSpeed = 5; var obstacleSpeed = 8; var bunnyRunScore = 0; var isLavaTransformed = false; var lavaTransformTimer = 0; var eggs = []; var totalEggs = 53; var eggTypes = ['egg1', 'egg2', 'egg3', 'egg4', 'egg5']; var playButton; var titleText; var titleBackground; var easterBunny; var lavaBunny; var shop; var scoreText; var remainingText; var shopBackground; var shopTitleText; var xButton; var upgradeButton1; var upgradeButton2; var upgradeText1; var upgradeText2; var eggCoinSprite1; var eggCoinSprite2; var eggCoinText1; var eggCoinText2; var eggCoins; var gameTimer; var gameTimeRemaining; var timerText; var clockSprite; // Title screen setup var titleBackground = LK.getAsset('titleBackground', { anchorX: 0.5, anchorY: 0.5 }); titleBackground.x = 2048 / 2; titleBackground.y = 600; game.addChild(titleBackground); titleText = new Text2('Easter Egg Hunt', { size: 120, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 2048 / 2; titleText.y = 600; game.addChild(titleText); easterBunny = LK.getAsset('easterBunny', { anchorX: 0.5, anchorY: 0.5 }); easterBunny.x = 2048 / 2; easterBunny.y = 1000; game.addChild(easterBunny); lavaBunny = LK.getAsset('lavaBunny', { anchorX: 0.5, anchorY: 0.5 }); lavaBunny.x = 2048 / 2; lavaBunny.y = 1000; lavaBunny.visible = false; game.addChild(lavaBunny); shop = LK.getAsset('shop', { anchorX: 0.5, anchorY: 0.5 }); shop.x = 2048 - 200; shop.y = 300; shop.down = function (x, y, obj) { if (gameState === 'title') { openShop(); } }; game.addChild(shop); playButton = game.addChild(new PlayButton()); playButton.x = 2048 / 2; playButton.y = 1400; // Blue box with "bunny run" text 2 steps under play button var bunnyRunBox = LK.getAsset('titleBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.0, scaleY: 0.6 }); bunnyRunBox.x = 2048 / 2; bunnyRunBox.y = playButton.y + 242; // 2 steps (240px) under play button bunnyRunBox.tint = 0x0000ff; // Blue color game.addChild(bunnyRunBox); var bunnyRunText = new Text2('bunny run', { size: 60, fill: 0xFFFFFF }); bunnyRunText.anchor.set(0.5, 0.5); bunnyRunText.x = bunnyRunBox.x; bunnyRunText.y = bunnyRunBox.y; bunnyRunBox.down = function (x, y, obj) { startBunnyRun(); }; game.addChild(bunnyRunText); // High Score button - positioned below bunny run button var highScoreButton = game.addChild(new HighScoreButton()); highScoreButton.x = 2048 / 2; highScoreButton.y = bunnyRunBox.y + 180; // Below bunny run button // Red UI box container var uiBox = LK.getAsset('titleBackground', { anchorX: 0.5, anchorY: 0, scaleX: 2.5, scaleY: 0.8 }); uiBox.x = 2048 / 2; uiBox.y = 100; uiBox.visible = false; game.addChild(uiBox); // UI elements scoreText = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); scoreText.x = 120; scoreText.y = 120; scoreText.visible = false; game.addChild(scoreText); remainingText = new Text2('Eggs Left: 0', { size: 80, fill: 0xFFFFFF }); remainingText.anchor.set(1, 0); remainingText.x = 2048 - 120; remainingText.y = 120; remainingText.visible = false; game.addChild(remainingText); timerText = new Text2('Time: 1:00', { size: 80, fill: 0xFFFFFF }); timerText.anchor.set(0.5, 0); timerText.x = 2048 / 2 + 162; timerText.y = 120; timerText.visible = false; game.addChild(timerText); clockSprite = LK.getAsset('clock', { anchorX: 0.5, anchorY: 0.5 }); clockSprite.x = 2048 / 2 - 160; clockSprite.y = 160; clockSprite.visible = false; game.addChild(clockSprite); // Shop screen setup shopBackground = LK.getAsset('titleBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.5, scaleY: 4 }); shopBackground.x = 2048 / 2; shopBackground.y = 2732 / 2; shopBackground.visible = false; game.addChild(shopBackground); shopTitleText = new Text2('Bunny Upgrades', { size: 100, fill: 0xFFFFFF }); shopTitleText.anchor.set(0.5, 0.5); shopTitleText.x = 2048 / 2; shopTitleText.y = 800; shopTitleText.visible = false; game.addChild(shopTitleText); xButton = game.addChild(new XButton()); xButton.x = 2048 / 2 + 800; xButton.y = 400; xButton.visible = false; upgradeButton1 = LK.getAsset('playButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2 }); upgradeButton1.x = 2048 / 2; upgradeButton1.y = 1200; upgradeButton1.visible = false; upgradeButton1.down = function (x, y, obj) { // Apply lava bunny skin if (eggCoins >= 5) { eggCoins -= 5; storage.eggCoins = eggCoins; storage.lavaBunnySkinApplied = true; easterBunny.visible = false; lavaBunny.visible = true; updateShopUI(); } }; game.addChild(upgradeButton1); upgradeText1 = new Text2('Lava Bunny Skin - 5 Egg Coins', { size: 50, fill: 0xFFFFFF }); upgradeText1.anchor.set(0.5, 0.5); upgradeText1.x = 2048 / 2; upgradeText1.y = 1200; upgradeText1.visible = false; game.addChild(upgradeText1); upgradeButton2 = LK.getAsset('playButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2 }); upgradeButton2.x = 2048 / 2; upgradeButton2.y = 1500; upgradeButton2.visible = false; upgradeButton2.down = function (x, y, obj) { // Apply ninja bunny skin if (eggCoins >= 8) { eggCoins -= 8; storage.eggCoins = eggCoins; easterBunny.tint = 0x2c2c54; // Dark blue-gray ninja color updateShopUI(); } else { // Show insufficient funds message var insufficientText = new Text2('You dont have egg coins for this', { size: 40, fill: 0xFFFFFF }); insufficientText.anchor.set(0.5, 0.5); insufficientText.x = 2048 / 2; insufficientText.y = 1400; game.addChild(insufficientText); LK.setTimeout(function () { insufficientText.destroy(); }, 2000); } }; game.addChild(upgradeButton2); upgradeText2 = new Text2('Ninja Bunny Skin - 8 Egg Coins', { size: 50, fill: 0xFFFFFF }); upgradeText2.anchor.set(0.5, 0.5); upgradeText2.x = 2048 / 2; upgradeText2.y = 1500; upgradeText2.visible = false; game.addChild(upgradeText2); // Initialize egg coins from storage eggCoins = storage.eggCoins || 0; // Egg coin sprite and text for lava bunny upgrade eggCoinSprite1 = LK.getAsset('eggCoin', { anchorX: 0.5, anchorY: 0.5 }); eggCoinSprite1.x = 2048 / 2 - 200; eggCoinSprite1.y = 1200; eggCoinSprite1.visible = false; game.addChild(eggCoinSprite1); eggCoinText1 = new Text2('0', { size: 40, fill: 0xFFFFFF }); eggCoinText1.anchor.set(0.5, 0.5); eggCoinText1.x = 2048 / 2 - 130; eggCoinText1.y = 1200; eggCoinText1.visible = false; game.addChild(eggCoinText1); // Egg coin sprite and text for ninja bunny upgrade eggCoinSprite2 = LK.getAsset('eggCoin', { anchorX: 0.5, anchorY: 0.5 }); eggCoinSprite2.x = 2048 / 2 - 200; eggCoinSprite2.y = 1500; eggCoinSprite2.visible = false; game.addChild(eggCoinSprite2); eggCoinText2 = new Text2('0', { size: 40, fill: 0xFFFFFF }); eggCoinText2.anchor.set(0.5, 0.5); eggCoinText2.x = 2048 / 2 - 130; eggCoinText2.y = 1500; eggCoinText2.visible = false; game.addChild(eggCoinText2); function startGame() { gameState = 'playing'; // Hide title screen titleText.visible = false; titleBackground.visible = false; easterBunny.visible = false; lavaBunny.visible = false; playButton.visible = false; shop.visible = false; bunnyRunBox.visible = false; bunnyRunText.visible = false; highScoreButton.visible = false; highScoreButton.visible = false; // Show UI uiBox.visible = true; scoreText.visible = true; remainingText.visible = true; timerText.visible = true; clockSprite.visible = true; // Initialize 1 minute timer (60 seconds) gameTimeRemaining = 60; updateTimerDisplay(); gameTimer = LK.setInterval(function () { gameTimeRemaining--; updateTimerDisplay(); // Check if time is up if (gameTimeRemaining <= 0) { LK.clearInterval(gameTimer); // Player loses - show game over LK.setTimeout(function () { LK.showGameOver(); }, 100); } }, 1000); // Reset score LK.setScore(0); updateUI(); // Create eggs createEggs(); } function createEggs() { eggs = []; for (var i = 0; i < totalEggs; i++) { var eggType = eggTypes[Math.floor(Math.random() * eggTypes.length)]; var egg = new Egg(eggType); // Random position with margins to keep eggs fully visible egg.x = 150 + Math.random() * (2048 - 300); egg.y = 300 + Math.random() * (2732 - 600); // Ensure eggs don't overlap too much var attempts = 0; var tooClose = true; while (tooClose && attempts < 20) { tooClose = false; for (var j = 0; j < eggs.length; j++) { var distance = Math.sqrt(Math.pow(egg.x - eggs[j].x, 2) + Math.pow(egg.y - eggs[j].y, 2)); if (distance < 120) { tooClose = true; egg.x = 150 + Math.random() * (2048 - 300); egg.y = 300 + Math.random() * (2732 - 600); break; } } attempts++; } eggs.push(egg); game.addChild(egg); // Add a subtle spawn animation egg.alpha = 0; egg.scaleX = 0.5; egg.scaleY = 0.5; tween(egg, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeOut }); } } function collectEgg(egg) { if (gameState !== 'playing') return; // Play collect sound LK.getSound('collect').play(); // Remove egg from array var index = eggs.indexOf(egg); if (index > -1) { eggs.splice(index, 1); } // Update score LK.setScore(LK.getScore() + 10); // Award egg coin eggCoins++; storage.eggCoins = eggCoins; // Animate egg collection tween(egg, { scaleX: 1.5, scaleY: 1.5, alpha: 0 }, { duration: 200, easing: tween.easeIn, onFinish: function onFinish() { egg.destroy(); } }); updateUI(); // Check win condition if (eggs.length === 0) { LK.clearInterval(gameTimer); // Save high score var currentScore = LK.getScore(); var highScore = storage.highScore || 0; if (currentScore > highScore) { storage.highScore = currentScore; } LK.setTimeout(function () { LK.showYouWin(); }, 500); } } function updateUI() { scoreText.setText('Score: ' + LK.getScore()); remainingText.setText('Eggs Left: ' + eggs.length); } function updateShopUI() { eggCoinText1.setText(eggCoins.toString()); eggCoinText2.setText(eggCoins.toString()); } function updateTimerDisplay() { var minutes = Math.floor(gameTimeRemaining / 60); var seconds = gameTimeRemaining % 60; var timeString = minutes + ':' + (seconds < 10 ? '0' : '') + seconds; timerText.setText('Time: ' + timeString); } function openShop() { gameState = 'shop'; // Hide title screen titleText.visible = false; titleBackground.visible = false; easterBunny.visible = false; lavaBunny.visible = false; playButton.visible = false; shop.visible = false; timerText.visible = false; uiBox.visible = false; clockSprite.visible = false; // Show shop screen shopBackground.visible = true; shopTitleText.visible = true; xButton.visible = true; upgradeButton1.visible = true; upgradeText1.visible = true; upgradeButton2.visible = true; upgradeText2.visible = true; eggCoinSprite1.visible = false; eggCoinText1.visible = false; eggCoinSprite2.visible = false; eggCoinText2.visible = false; updateShopUI(); } function showHighScores() { // Get high score from storage var highScore = storage.highScore || 0; // Create black box for high score display var highScoreBackground = LK.getAsset('titleBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 2.0, scaleY: 2.0 }); highScoreBackground.x = 2048 / 2; highScoreBackground.y = 2732 / 2; highScoreBackground.tint = 0x000000; // Black background game.addChild(highScoreBackground); // Create black box for high score title var highScoreTitleBackground = LK.getAsset('titleBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 0.8 }); highScoreTitleBackground.x = 2048 / 2; highScoreTitleBackground.y = 2732 / 2 - 200; highScoreTitleBackground.tint = 0x000000; // Black background game.addChild(highScoreTitleBackground); // Create high score title var highScoreTitleText = new Text2('HIGH SCORES', { size: 100, fill: 0xFFFFFF }); highScoreTitleText.anchor.set(0.5, 0.5); highScoreTitleText.x = 2048 / 2; highScoreTitleText.y = 2732 / 2 - 200; game.addChild(highScoreTitleText); // Create high score value display var highScoreValueText = new Text2('Best Score: ' + highScore, { size: 80, fill: 0xFFD700 }); highScoreValueText.anchor.set(0.5, 0.5); highScoreValueText.x = 2048 / 2; highScoreValueText.y = 2732 / 2; game.addChild(highScoreValueText); // Create close button var closeButton = LK.getAsset('playButton', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8 }); closeButton.x = 2048 / 2; closeButton.y = 2732 / 2 + 200; game.addChild(closeButton); var closeButtonText = new Text2('CLOSE', { size: 60, fill: 0xFFFFFF }); closeButtonText.anchor.set(0.5, 0.5); closeButtonText.x = closeButton.x; closeButtonText.y = closeButton.y; game.addChild(closeButtonText); // Add close functionality closeButton.down = function (x, y, obj) { highScoreBackground.destroy(); highScoreTitleBackground.destroy(); highScoreTitleText.destroy(); highScoreValueText.destroy(); closeButton.destroy(); closeButtonText.destroy(); }; } function closeShop() { gameState = 'title'; // Hide shop screen shopBackground.visible = false; shopTitleText.visible = false; xButton.visible = false; upgradeButton1.visible = false; upgradeText1.visible = false; upgradeButton2.visible = false; upgradeText2.visible = false; eggCoinSprite1.visible = false; eggCoinText1.visible = false; eggCoinSprite2.visible = false; eggCoinText2.visible = false; // Show title screen titleText.visible = true; titleBackground.visible = true; if (storage.lavaBunnySkinApplied) { lavaBunny.visible = true; easterBunny.visible = false; } else { easterBunny.visible = true; lavaBunny.visible = false; } playButton.visible = true; shop.visible = true; highScoreButton.visible = true; if (gameState === 'playing') { timerText.visible = true; uiBox.visible = true; clockSprite.visible = true; } } function startBunnyRun() { gameState = 'bunnyrun'; bunnyRunScore = 0; // Hide title screen titleText.visible = false; titleBackground.visible = false; easterBunny.visible = false; lavaBunny.visible = false; playButton.visible = false; shop.visible = false; highScoreButton.visible = false; bunnyRunBox.visible = false; bunnyRunText.visible = false; // Create ground var ground = LK.getAsset('ground', { anchorX: 0, anchorY: 1.0 }); ground.x = 0; ground.y = 2732; game.addChild(ground); // Create player bunnyRunPlayer = new BunnyRunPlayer(); bunnyRunPlayer.x = 300; bunnyRunPlayer.y = 2400; game.addChild(bunnyRunPlayer); // Clear obstacles array obstacles = []; // Clear power-ups array powerUps = []; // Reset transformation state isLavaTransformed = false; lavaTransformTimer = 0; // Show bunny run UI var bunnyRunScoreText = new Text2('Score: 0', { size: 80, fill: 0x000000 }); bunnyRunScoreText.anchor.set(0, 0); bunnyRunScoreText.x = 120; bunnyRunScoreText.y = 120; game.addChild(bunnyRunScoreText); } game.down = function (x, y, obj) { if (gameState === 'bunnyrun' && bunnyRunPlayer) { bunnyRunPlayer.jump(); } }; game.update = function () { if (gameState === 'bunnyrun') { // Update player if (bunnyRunPlayer) { bunnyRunPlayer.update(); } // Handle lava transformation timer if (isLavaTransformed) { lavaTransformTimer--; if (lavaTransformTimer <= 0) { isLavaTransformed = false; bunnyRunPlayer.transformToNormal(); } } // Spawn obstacles if (LK.ticks % 120 === 0) { var obstacle = new Obstacle(); obstacle.x = 2200; obstacle.y = 2400; obstacles.push(obstacle); game.addChild(obstacle); } // Spawn power-ups occasionally if (LK.ticks % 300 === 0 && Math.random() < 0.3) { var powerUp = new PowerUp(); powerUp.x = 2200; powerUp.y = 2200; powerUps.push(powerUp); game.addChild(powerUp); } // Update obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; obstacle.update(); // Check collision with player (only if not lava transformed) if (bunnyRunPlayer && obstacle.intersects(bunnyRunPlayer) && !isLavaTransformed) { // Save high score for bunny run var highScore = storage.highScore || 0; if (bunnyRunScore > highScore) { storage.highScore = bunnyRunScore; } // Game over LK.setTimeout(function () { LK.showGameOver(); }, 100); return; } // Remove obstacles that are off screen if (obstacle.x < -100) { obstacle.destroy(); obstacles.splice(i, 1); bunnyRunScore += 10; } } // Update power-ups for (var j = powerUps.length - 1; j >= 0; j--) { var powerUp = powerUps[j]; powerUp.update(); // Check collision with player if (bunnyRunPlayer && powerUp.intersects(bunnyRunPlayer)) { // Activate lava transformation isLavaTransformed = true; lavaTransformTimer = 300; // 5 seconds at 60fps bunnyRunPlayer.transformToLava(); // Remove power-up powerUp.destroy(); powerUps.splice(j, 1); continue; } // Remove power-ups that are off screen if (powerUp.x < -100) { powerUp.destroy(); powerUps.splice(j, 1); } } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var BunnyRunPlayer = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('easterBunny', {
anchorX: 0.5,
anchorY: 1.0,
scaleX: 0.5,
scaleY: 0.5
});
var lavaGraphics = self.attachAsset('lavaBunny', {
anchorX: 0.5,
anchorY: 1.0,
scaleX: 0.5,
scaleY: 0.5
});
lavaGraphics.visible = false;
self.isJumping = false;
self.jumpSpeed = 0;
self.gravity = 1;
self.groundY = 2400;
self.transformToLava = function () {
playerGraphics.visible = false;
lavaGraphics.visible = true;
tween(self, {
tint: 0xff4444
}, {
duration: 300,
easing: tween.easeOut
});
};
self.transformToNormal = function () {
playerGraphics.visible = true;
lavaGraphics.visible = false;
tween(self, {
tint: 0xffffff
}, {
duration: 300,
easing: tween.easeOut
});
};
self.update = function () {
if (self.isJumping) {
self.y += self.jumpSpeed;
self.jumpSpeed += self.gravity;
if (self.y >= self.groundY) {
self.y = self.groundY;
self.isJumping = false;
self.jumpSpeed = 0;
}
}
};
self.jump = function () {
if (!self.isJumping) {
self.isJumping = true;
self.jumpSpeed = -35;
}
};
return self;
});
var Egg = Container.expand(function (eggType) {
var self = Container.call(this);
var eggGraphics = self.attachAsset(eggType, {
anchorX: 0.5,
anchorY: 0.5
});
self.down = function (x, y, obj) {
collectEgg(self);
};
return self;
});
var HighScoreButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('highScoreButton', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2('HIGH SCORES', {
size: 50,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.down = function (x, y, obj) {
showHighScores();
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 1.0
});
self.update = function () {
self.x -= obstacleSpeed;
};
return self;
});
var PlayButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('playButton', {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2('PLAY', {
size: 60,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.down = function (x, y, obj) {
startGame();
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUpSprite', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.x -= obstacleSpeed;
};
return self;
});
var XButton = Container.expand(function () {
var self = Container.call(this);
var buttonBackground = self.attachAsset('xButtonBackground', {
anchorX: 0.5,
anchorY: 0.5
});
var xText = new Text2('X', {
size: 80,
fill: 0xFFFFFF
});
xText.anchor.set(0.5, 0.5);
self.addChild(xText);
self.down = function (x, y, obj) {
closeShop();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x00ff00
});
/****
* Game Code
****/
var gameState = 'title'; // 'title', 'playing', 'shop', or 'bunnyrun'
var bunnyRunPlayer;
var obstacles = [];
var powerUps = [];
var bunnyRunSpeed = 5;
var obstacleSpeed = 8;
var bunnyRunScore = 0;
var isLavaTransformed = false;
var lavaTransformTimer = 0;
var eggs = [];
var totalEggs = 53;
var eggTypes = ['egg1', 'egg2', 'egg3', 'egg4', 'egg5'];
var playButton;
var titleText;
var titleBackground;
var easterBunny;
var lavaBunny;
var shop;
var scoreText;
var remainingText;
var shopBackground;
var shopTitleText;
var xButton;
var upgradeButton1;
var upgradeButton2;
var upgradeText1;
var upgradeText2;
var eggCoinSprite1;
var eggCoinSprite2;
var eggCoinText1;
var eggCoinText2;
var eggCoins;
var gameTimer;
var gameTimeRemaining;
var timerText;
var clockSprite;
// Title screen setup
var titleBackground = LK.getAsset('titleBackground', {
anchorX: 0.5,
anchorY: 0.5
});
titleBackground.x = 2048 / 2;
titleBackground.y = 600;
game.addChild(titleBackground);
titleText = new Text2('Easter Egg Hunt', {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 600;
game.addChild(titleText);
easterBunny = LK.getAsset('easterBunny', {
anchorX: 0.5,
anchorY: 0.5
});
easterBunny.x = 2048 / 2;
easterBunny.y = 1000;
game.addChild(easterBunny);
lavaBunny = LK.getAsset('lavaBunny', {
anchorX: 0.5,
anchorY: 0.5
});
lavaBunny.x = 2048 / 2;
lavaBunny.y = 1000;
lavaBunny.visible = false;
game.addChild(lavaBunny);
shop = LK.getAsset('shop', {
anchorX: 0.5,
anchorY: 0.5
});
shop.x = 2048 - 200;
shop.y = 300;
shop.down = function (x, y, obj) {
if (gameState === 'title') {
openShop();
}
};
game.addChild(shop);
playButton = game.addChild(new PlayButton());
playButton.x = 2048 / 2;
playButton.y = 1400;
// Blue box with "bunny run" text 2 steps under play button
var bunnyRunBox = LK.getAsset('titleBackground', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.0,
scaleY: 0.6
});
bunnyRunBox.x = 2048 / 2;
bunnyRunBox.y = playButton.y + 242; // 2 steps (240px) under play button
bunnyRunBox.tint = 0x0000ff; // Blue color
game.addChild(bunnyRunBox);
var bunnyRunText = new Text2('bunny run', {
size: 60,
fill: 0xFFFFFF
});
bunnyRunText.anchor.set(0.5, 0.5);
bunnyRunText.x = bunnyRunBox.x;
bunnyRunText.y = bunnyRunBox.y;
bunnyRunBox.down = function (x, y, obj) {
startBunnyRun();
};
game.addChild(bunnyRunText);
// High Score button - positioned below bunny run button
var highScoreButton = game.addChild(new HighScoreButton());
highScoreButton.x = 2048 / 2;
highScoreButton.y = bunnyRunBox.y + 180; // Below bunny run button
// Red UI box container
var uiBox = LK.getAsset('titleBackground', {
anchorX: 0.5,
anchorY: 0,
scaleX: 2.5,
scaleY: 0.8
});
uiBox.x = 2048 / 2;
uiBox.y = 100;
uiBox.visible = false;
game.addChild(uiBox);
// UI elements
scoreText = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
scoreText.x = 120;
scoreText.y = 120;
scoreText.visible = false;
game.addChild(scoreText);
remainingText = new Text2('Eggs Left: 0', {
size: 80,
fill: 0xFFFFFF
});
remainingText.anchor.set(1, 0);
remainingText.x = 2048 - 120;
remainingText.y = 120;
remainingText.visible = false;
game.addChild(remainingText);
timerText = new Text2('Time: 1:00', {
size: 80,
fill: 0xFFFFFF
});
timerText.anchor.set(0.5, 0);
timerText.x = 2048 / 2 + 162;
timerText.y = 120;
timerText.visible = false;
game.addChild(timerText);
clockSprite = LK.getAsset('clock', {
anchorX: 0.5,
anchorY: 0.5
});
clockSprite.x = 2048 / 2 - 160;
clockSprite.y = 160;
clockSprite.visible = false;
game.addChild(clockSprite);
// Shop screen setup
shopBackground = LK.getAsset('titleBackground', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.5,
scaleY: 4
});
shopBackground.x = 2048 / 2;
shopBackground.y = 2732 / 2;
shopBackground.visible = false;
game.addChild(shopBackground);
shopTitleText = new Text2('Bunny Upgrades', {
size: 100,
fill: 0xFFFFFF
});
shopTitleText.anchor.set(0.5, 0.5);
shopTitleText.x = 2048 / 2;
shopTitleText.y = 800;
shopTitleText.visible = false;
game.addChild(shopTitleText);
xButton = game.addChild(new XButton());
xButton.x = 2048 / 2 + 800;
xButton.y = 400;
xButton.visible = false;
upgradeButton1 = LK.getAsset('playButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2
});
upgradeButton1.x = 2048 / 2;
upgradeButton1.y = 1200;
upgradeButton1.visible = false;
upgradeButton1.down = function (x, y, obj) {
// Apply lava bunny skin
if (eggCoins >= 5) {
eggCoins -= 5;
storage.eggCoins = eggCoins;
storage.lavaBunnySkinApplied = true;
easterBunny.visible = false;
lavaBunny.visible = true;
updateShopUI();
}
};
game.addChild(upgradeButton1);
upgradeText1 = new Text2('Lava Bunny Skin - 5 Egg Coins', {
size: 50,
fill: 0xFFFFFF
});
upgradeText1.anchor.set(0.5, 0.5);
upgradeText1.x = 2048 / 2;
upgradeText1.y = 1200;
upgradeText1.visible = false;
game.addChild(upgradeText1);
upgradeButton2 = LK.getAsset('playButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2
});
upgradeButton2.x = 2048 / 2;
upgradeButton2.y = 1500;
upgradeButton2.visible = false;
upgradeButton2.down = function (x, y, obj) {
// Apply ninja bunny skin
if (eggCoins >= 8) {
eggCoins -= 8;
storage.eggCoins = eggCoins;
easterBunny.tint = 0x2c2c54; // Dark blue-gray ninja color
updateShopUI();
} else {
// Show insufficient funds message
var insufficientText = new Text2('You dont have egg coins for this', {
size: 40,
fill: 0xFFFFFF
});
insufficientText.anchor.set(0.5, 0.5);
insufficientText.x = 2048 / 2;
insufficientText.y = 1400;
game.addChild(insufficientText);
LK.setTimeout(function () {
insufficientText.destroy();
}, 2000);
}
};
game.addChild(upgradeButton2);
upgradeText2 = new Text2('Ninja Bunny Skin - 8 Egg Coins', {
size: 50,
fill: 0xFFFFFF
});
upgradeText2.anchor.set(0.5, 0.5);
upgradeText2.x = 2048 / 2;
upgradeText2.y = 1500;
upgradeText2.visible = false;
game.addChild(upgradeText2);
// Initialize egg coins from storage
eggCoins = storage.eggCoins || 0;
// Egg coin sprite and text for lava bunny upgrade
eggCoinSprite1 = LK.getAsset('eggCoin', {
anchorX: 0.5,
anchorY: 0.5
});
eggCoinSprite1.x = 2048 / 2 - 200;
eggCoinSprite1.y = 1200;
eggCoinSprite1.visible = false;
game.addChild(eggCoinSprite1);
eggCoinText1 = new Text2('0', {
size: 40,
fill: 0xFFFFFF
});
eggCoinText1.anchor.set(0.5, 0.5);
eggCoinText1.x = 2048 / 2 - 130;
eggCoinText1.y = 1200;
eggCoinText1.visible = false;
game.addChild(eggCoinText1);
// Egg coin sprite and text for ninja bunny upgrade
eggCoinSprite2 = LK.getAsset('eggCoin', {
anchorX: 0.5,
anchorY: 0.5
});
eggCoinSprite2.x = 2048 / 2 - 200;
eggCoinSprite2.y = 1500;
eggCoinSprite2.visible = false;
game.addChild(eggCoinSprite2);
eggCoinText2 = new Text2('0', {
size: 40,
fill: 0xFFFFFF
});
eggCoinText2.anchor.set(0.5, 0.5);
eggCoinText2.x = 2048 / 2 - 130;
eggCoinText2.y = 1500;
eggCoinText2.visible = false;
game.addChild(eggCoinText2);
function startGame() {
gameState = 'playing';
// Hide title screen
titleText.visible = false;
titleBackground.visible = false;
easterBunny.visible = false;
lavaBunny.visible = false;
playButton.visible = false;
shop.visible = false;
bunnyRunBox.visible = false;
bunnyRunText.visible = false;
highScoreButton.visible = false;
highScoreButton.visible = false;
// Show UI
uiBox.visible = true;
scoreText.visible = true;
remainingText.visible = true;
timerText.visible = true;
clockSprite.visible = true;
// Initialize 1 minute timer (60 seconds)
gameTimeRemaining = 60;
updateTimerDisplay();
gameTimer = LK.setInterval(function () {
gameTimeRemaining--;
updateTimerDisplay();
// Check if time is up
if (gameTimeRemaining <= 0) {
LK.clearInterval(gameTimer);
// Player loses - show game over
LK.setTimeout(function () {
LK.showGameOver();
}, 100);
}
}, 1000);
// Reset score
LK.setScore(0);
updateUI();
// Create eggs
createEggs();
}
function createEggs() {
eggs = [];
for (var i = 0; i < totalEggs; i++) {
var eggType = eggTypes[Math.floor(Math.random() * eggTypes.length)];
var egg = new Egg(eggType);
// Random position with margins to keep eggs fully visible
egg.x = 150 + Math.random() * (2048 - 300);
egg.y = 300 + Math.random() * (2732 - 600);
// Ensure eggs don't overlap too much
var attempts = 0;
var tooClose = true;
while (tooClose && attempts < 20) {
tooClose = false;
for (var j = 0; j < eggs.length; j++) {
var distance = Math.sqrt(Math.pow(egg.x - eggs[j].x, 2) + Math.pow(egg.y - eggs[j].y, 2));
if (distance < 120) {
tooClose = true;
egg.x = 150 + Math.random() * (2048 - 300);
egg.y = 300 + Math.random() * (2732 - 600);
break;
}
}
attempts++;
}
eggs.push(egg);
game.addChild(egg);
// Add a subtle spawn animation
egg.alpha = 0;
egg.scaleX = 0.5;
egg.scaleY = 0.5;
tween(egg, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeOut
});
}
}
function collectEgg(egg) {
if (gameState !== 'playing') return;
// Play collect sound
LK.getSound('collect').play();
// Remove egg from array
var index = eggs.indexOf(egg);
if (index > -1) {
eggs.splice(index, 1);
}
// Update score
LK.setScore(LK.getScore() + 10);
// Award egg coin
eggCoins++;
storage.eggCoins = eggCoins;
// Animate egg collection
tween(egg, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 200,
easing: tween.easeIn,
onFinish: function onFinish() {
egg.destroy();
}
});
updateUI();
// Check win condition
if (eggs.length === 0) {
LK.clearInterval(gameTimer);
// Save high score
var currentScore = LK.getScore();
var highScore = storage.highScore || 0;
if (currentScore > highScore) {
storage.highScore = currentScore;
}
LK.setTimeout(function () {
LK.showYouWin();
}, 500);
}
}
function updateUI() {
scoreText.setText('Score: ' + LK.getScore());
remainingText.setText('Eggs Left: ' + eggs.length);
}
function updateShopUI() {
eggCoinText1.setText(eggCoins.toString());
eggCoinText2.setText(eggCoins.toString());
}
function updateTimerDisplay() {
var minutes = Math.floor(gameTimeRemaining / 60);
var seconds = gameTimeRemaining % 60;
var timeString = minutes + ':' + (seconds < 10 ? '0' : '') + seconds;
timerText.setText('Time: ' + timeString);
}
function openShop() {
gameState = 'shop';
// Hide title screen
titleText.visible = false;
titleBackground.visible = false;
easterBunny.visible = false;
lavaBunny.visible = false;
playButton.visible = false;
shop.visible = false;
timerText.visible = false;
uiBox.visible = false;
clockSprite.visible = false;
// Show shop screen
shopBackground.visible = true;
shopTitleText.visible = true;
xButton.visible = true;
upgradeButton1.visible = true;
upgradeText1.visible = true;
upgradeButton2.visible = true;
upgradeText2.visible = true;
eggCoinSprite1.visible = false;
eggCoinText1.visible = false;
eggCoinSprite2.visible = false;
eggCoinText2.visible = false;
updateShopUI();
}
function showHighScores() {
// Get high score from storage
var highScore = storage.highScore || 0;
// Create black box for high score display
var highScoreBackground = LK.getAsset('titleBackground', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2.0,
scaleY: 2.0
});
highScoreBackground.x = 2048 / 2;
highScoreBackground.y = 2732 / 2;
highScoreBackground.tint = 0x000000; // Black background
game.addChild(highScoreBackground);
// Create black box for high score title
var highScoreTitleBackground = LK.getAsset('titleBackground', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 0.8
});
highScoreTitleBackground.x = 2048 / 2;
highScoreTitleBackground.y = 2732 / 2 - 200;
highScoreTitleBackground.tint = 0x000000; // Black background
game.addChild(highScoreTitleBackground);
// Create high score title
var highScoreTitleText = new Text2('HIGH SCORES', {
size: 100,
fill: 0xFFFFFF
});
highScoreTitleText.anchor.set(0.5, 0.5);
highScoreTitleText.x = 2048 / 2;
highScoreTitleText.y = 2732 / 2 - 200;
game.addChild(highScoreTitleText);
// Create high score value display
var highScoreValueText = new Text2('Best Score: ' + highScore, {
size: 80,
fill: 0xFFD700
});
highScoreValueText.anchor.set(0.5, 0.5);
highScoreValueText.x = 2048 / 2;
highScoreValueText.y = 2732 / 2;
game.addChild(highScoreValueText);
// Create close button
var closeButton = LK.getAsset('playButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8
});
closeButton.x = 2048 / 2;
closeButton.y = 2732 / 2 + 200;
game.addChild(closeButton);
var closeButtonText = new Text2('CLOSE', {
size: 60,
fill: 0xFFFFFF
});
closeButtonText.anchor.set(0.5, 0.5);
closeButtonText.x = closeButton.x;
closeButtonText.y = closeButton.y;
game.addChild(closeButtonText);
// Add close functionality
closeButton.down = function (x, y, obj) {
highScoreBackground.destroy();
highScoreTitleBackground.destroy();
highScoreTitleText.destroy();
highScoreValueText.destroy();
closeButton.destroy();
closeButtonText.destroy();
};
}
function closeShop() {
gameState = 'title';
// Hide shop screen
shopBackground.visible = false;
shopTitleText.visible = false;
xButton.visible = false;
upgradeButton1.visible = false;
upgradeText1.visible = false;
upgradeButton2.visible = false;
upgradeText2.visible = false;
eggCoinSprite1.visible = false;
eggCoinText1.visible = false;
eggCoinSprite2.visible = false;
eggCoinText2.visible = false;
// Show title screen
titleText.visible = true;
titleBackground.visible = true;
if (storage.lavaBunnySkinApplied) {
lavaBunny.visible = true;
easterBunny.visible = false;
} else {
easterBunny.visible = true;
lavaBunny.visible = false;
}
playButton.visible = true;
shop.visible = true;
highScoreButton.visible = true;
if (gameState === 'playing') {
timerText.visible = true;
uiBox.visible = true;
clockSprite.visible = true;
}
}
function startBunnyRun() {
gameState = 'bunnyrun';
bunnyRunScore = 0;
// Hide title screen
titleText.visible = false;
titleBackground.visible = false;
easterBunny.visible = false;
lavaBunny.visible = false;
playButton.visible = false;
shop.visible = false;
highScoreButton.visible = false;
bunnyRunBox.visible = false;
bunnyRunText.visible = false;
// Create ground
var ground = LK.getAsset('ground', {
anchorX: 0,
anchorY: 1.0
});
ground.x = 0;
ground.y = 2732;
game.addChild(ground);
// Create player
bunnyRunPlayer = new BunnyRunPlayer();
bunnyRunPlayer.x = 300;
bunnyRunPlayer.y = 2400;
game.addChild(bunnyRunPlayer);
// Clear obstacles array
obstacles = [];
// Clear power-ups array
powerUps = [];
// Reset transformation state
isLavaTransformed = false;
lavaTransformTimer = 0;
// Show bunny run UI
var bunnyRunScoreText = new Text2('Score: 0', {
size: 80,
fill: 0x000000
});
bunnyRunScoreText.anchor.set(0, 0);
bunnyRunScoreText.x = 120;
bunnyRunScoreText.y = 120;
game.addChild(bunnyRunScoreText);
}
game.down = function (x, y, obj) {
if (gameState === 'bunnyrun' && bunnyRunPlayer) {
bunnyRunPlayer.jump();
}
};
game.update = function () {
if (gameState === 'bunnyrun') {
// Update player
if (bunnyRunPlayer) {
bunnyRunPlayer.update();
}
// Handle lava transformation timer
if (isLavaTransformed) {
lavaTransformTimer--;
if (lavaTransformTimer <= 0) {
isLavaTransformed = false;
bunnyRunPlayer.transformToNormal();
}
}
// Spawn obstacles
if (LK.ticks % 120 === 0) {
var obstacle = new Obstacle();
obstacle.x = 2200;
obstacle.y = 2400;
obstacles.push(obstacle);
game.addChild(obstacle);
}
// Spawn power-ups occasionally
if (LK.ticks % 300 === 0 && Math.random() < 0.3) {
var powerUp = new PowerUp();
powerUp.x = 2200;
powerUp.y = 2200;
powerUps.push(powerUp);
game.addChild(powerUp);
}
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
obstacle.update();
// Check collision with player (only if not lava transformed)
if (bunnyRunPlayer && obstacle.intersects(bunnyRunPlayer) && !isLavaTransformed) {
// Save high score for bunny run
var highScore = storage.highScore || 0;
if (bunnyRunScore > highScore) {
storage.highScore = bunnyRunScore;
}
// Game over
LK.setTimeout(function () {
LK.showGameOver();
}, 100);
return;
}
// Remove obstacles that are off screen
if (obstacle.x < -100) {
obstacle.destroy();
obstacles.splice(i, 1);
bunnyRunScore += 10;
}
}
// Update power-ups
for (var j = powerUps.length - 1; j >= 0; j--) {
var powerUp = powerUps[j];
powerUp.update();
// Check collision with player
if (bunnyRunPlayer && powerUp.intersects(bunnyRunPlayer)) {
// Activate lava transformation
isLavaTransformed = true;
lavaTransformTimer = 300; // 5 seconds at 60fps
bunnyRunPlayer.transformToLava();
// Remove power-up
powerUp.destroy();
powerUps.splice(j, 1);
continue;
}
// Remove power-ups that are off screen
if (powerUp.x < -100) {
powerUp.destroy();
powerUps.splice(j, 1);
}
}
}
};
RED EGG. In-Game asset. 2d. High contrast. No shadows
BLUE EGG. In-Game asset. 2d. High contrast. No shadows
YELLOW EGG. In-Game asset. 2d. High contrast. No shadows
PINK EGG. In-Game asset. 2d. High contrast. No shadows
CYAN EGG. In-Game asset. 2d. High contrast. No shadows
EASTER BUNNY. In-Game asset. 2d. High contrast. No shadows
SHOP. In-Game asset. 2d. High contrast. No shadows
LAVA BUNNY. In-Game asset. 2d. High contrast. No shadows
CLOCK. In-Game asset. 2d. High contrast. No shadows
traffic cone. In-Game asset. 2d. High contrast. No shadows
power up. In-Game asset. 2d. High contrast. No shadows