/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0 }); /**** * Classes ****/ var Ground = Container.expand(function () { var self = Container.call(this); var groundGraphics = self.attachAsset('ground', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -8; self.update = function () { self.x += self.speed; // If ground piece moves off screen, move it to the right side if (self.x < -groundGraphics.width / 2) { self.x = 2048 + groundGraphics.width / 2; } }; return self; }); var Obstacle = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'spike'; self.speed = -8; // Default movement speed var assetId = self.type; var obstacleGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); if (self.type === 'spike') { // Rotate spikes to point upward obstacleGraphics.rotation = Math.PI * 0.75; } self.update = function () { self.x += self.speed; // Remove if off screen to the left if (self.x < -100) { self.destroy(); return true; // Signal that this obstacle should be removed } return false; }; return self; }); var Particle = Container.expand(function () { var self = Container.call(this); var particleGraphics = self.attachAsset('particle', { anchorX: 0.5, anchorY: 0.5 }); self.vx = (Math.random() - 0.5) * 10; self.vy = (Math.random() - 0.5) * 10 - 5; self.gravity = 0.3; self.life = 30 + Math.random() * 20; self.update = function () { self.x += self.vx; self.vy += self.gravity; self.y += self.vy; self.life--; particleGraphics.alpha = self.life / 50; if (self.life <= 0) { self.destroy(); return true; // Signal that this particle should be removed } return false; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.gravity = 0.8; self.velocity = 0; self.jumpForce = -18; self.isJumping = false; self.isDead = false; self.friction = 0.95; // Ice physics - less friction self.jump = function () { if (!self.isJumping && !self.isDead) { self.velocity = self.jumpForce; self.isJumping = true; LK.getSound('jump').play(); // Create jump particles for (var i = 0; i < 5; i++) { createParticle(self.x, self.y + 40); } } }; self.die = function () { if (!self.isDead) { self.isDead = true; LK.getSound('death').play(); LK.effects.flashObject(self, 0xff0000, 500); // Create death particles for (var i = 0; i < 15; i++) { createParticle(self.x, self.y); } LK.setTimeout(function () { LK.showGameOver(); }, 1000); } }; self.update = function () { if (self.isDead) { return; } // Apply gravity if (!self.isFlying) { self.velocity += self.gravity; } else { self.velocity = 0; // Neutralize gravity when flying } // Apply velocity with ice physics (less friction when moving horizontally) self.y += self.velocity; // Rotation based on velocity playerGraphics.rotation += 0.05; // Check if player is below the screen if (self.y > 2732) { self.die(); } }; self.activateFlyPowerUp = function () { if (!self.isDead) { self.isFlying = true; LK.setTimeout(function () { self.isFlying = false; }, 5000); // Fly for 5 seconds } }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerUpGraphics = self.attachAsset('particle', { anchorX: 0.5, anchorY: 0.5 }); self.type = 'fly'; self.speed = -8; self.update = function () { self.x += self.speed; if (self.x < -100) { self.destroy(); return true; } return false; }; return self; }); var ShieldPowerUp = Container.expand(function () { var self = Container.call(this); var shieldGraphics = self.attachAsset('particle', { anchorX: 0.5, anchorY: 0.5 }); self.type = 'shield'; self.speed = -8; self.update = function () { self.x += self.speed; if (self.x < -100) { self.destroy(); return true; } return false; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEFA }); /**** * Game Code ****/ // Game variables Player.prototype.activateShield = function () { if (!this.isDead) { this.hasShield = true; LK.effects.flashObject(this, 0x00ff00, 500); var self = this; LK.setTimeout(function () { self.hasShield = false; }, 10000); // Shield lasts for 10 seconds } }; var player; var obstacles = []; var grounds = []; var particles = []; var gameSpeed = 1; var score = 0; var highScore = storage.highScore || 0; var difficulty = 1; var isGameStarted = false; var obstacleTimer; var scoreInterval; var difficultyInterval; // UI elements var scoreTxt = new Text2('0', { size: 100, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var highScoreTxt = new Text2('Best: 0', { size: 60, fill: 0xFFFFFF }); highScoreTxt.anchor.set(0.5, 0); highScoreTxt.y = 110; LK.gui.top.addChild(highScoreTxt); var instructionsTxt = new Text2('Tap to Jump', { size: 80, fill: 0xFFFFFF }); instructionsTxt.anchor.set(0.5, 0.5); LK.gui.center.addChild(instructionsTxt); // Initialize the player function initPlayer() { player = new Player(); player.x = 500; player.y = 2732 / 2; game.addChild(player); } // Initialize the ground function initGround() { // Create multiple ground pieces to cover the width var groundWidth = LK.getAsset('ground', {}).width; var numGroundPieces = Math.ceil(2048 / groundWidth) + 2; for (var i = 0; i < numGroundPieces; i++) { var ground = new Ground(); ground.x = i * groundWidth; ground.y = 2732 - 100; game.addChild(ground); grounds.push(ground); } // Create ceiling var ceiling = game.addChild(LK.getAsset('ceiling', { anchorX: 0.5, anchorY: 0.5 })); ceiling.x = 2048 / 2; ceiling.y = 100; } // Create an obstacle function createObstacle() { var types = ['spike', 'platform']; var type = types[Math.floor(Math.random() * types.length)]; var obstacle = new Obstacle(type); obstacle.x = 2048 + 100; // Position based on type if (type === 'spike') { // Place spikes on the ground obstacle.y = 2732 - 130; } else if (type === 'platform') { // Random height for platforms obstacle.y = 1600 + Math.random() * 800; } game.addChild(obstacle); obstacles.push(obstacle); // Adjust timer for next obstacle based on difficulty var nextTime = 1500 - difficulty * 100; if (nextTime < 800) { nextTime = 800; } obstacleTimer = LK.setTimeout(createObstacle, nextTime); } // Create a particle function createParticle(x, y) { var particle = new Particle(); particle.x = x; particle.y = y; game.addChild(particle); particles.push(particle); } // Start the game function startGame() { if (isGameStarted) { return; } isGameStarted = true; instructionsTxt.visible = false; // Reset score score = 0; difficulty = 1; updateScore(); // Start creating obstacles createObstacle(); // Update score every second scoreInterval = LK.setInterval(function () { score += 1; updateScore(); }, 1000); // Increase difficulty every 10 seconds difficultyInterval = LK.setInterval(function () { difficulty += 0.5; gameSpeed += 0.1; // Update obstacle and ground speed obstacles.forEach(function (obstacle) { obstacle.speed = -8 * gameSpeed; }); grounds.forEach(function (ground) { ground.speed = -8 * gameSpeed; }); }, 10000); // Play the music LK.playMusic('iceTheme'); } // Update the score display function updateScore() { scoreTxt.setText(Math.floor(score)); if (score > highScore) { highScore = score; storage.highScore = highScore; highScoreTxt.setText('Best: ' + Math.floor(highScore)); } } // Initialize the game function initGame() { initPlayer(); initGround(); // Set high score highScore = storage.highScore || 0; highScoreTxt.setText('Best: ' + Math.floor(highScore)); } // Check collisions function checkCollisions() { if (!player || player.isDead) { return; } // Check ground collision var isOnGround = false; grounds.forEach(function (ground) { if (player.y + 40 >= ground.y - 15 && player.y - 40 < ground.y + 15 && Math.abs(player.x - ground.x) < 200) { isOnGround = true; player.y = ground.y - 40; player.velocity = 0; player.isJumping = false; } }); // Check ceiling collision if (player.y - 40 <= 100 + 15) { player.y = 100 + 15 + 40; player.velocity = 0; } // Check obstacle collisions obstacles.forEach(function (obstacle) { if (player.intersects(obstacle)) { if (player.hasShield) { player.hasShield = false; // Remove shield on collision obstacle.destroy(); } else { player.die(); } } }); } // Input event handlers game.down = function (x, y) { if (!isGameStarted) { startGame(); } if (player && !player.isDead) { player.jump(); } }; // Main update function game.update = function () { if (!isGameStarted) { return; } // Update player if (player) { player.update(); } // Update grounds for (var i = 0; i < grounds.length; i++) { grounds[i].update(); } // Update obstacles for (var i = obstacles.length - 1; i >= 0; i--) { if (obstacles[i].update()) { obstacles.splice(i, 1); } } // Create power-up if (LK.ticks % 300 === 0) { // Every 5 seconds var powerUp = new PowerUp(); powerUp.x = 2048 + 100; powerUp.y = Math.random() * 2000 + 300; // Random y position game.addChild(powerUp); obstacles.push(powerUp); } if (LK.ticks % 600 === 0) { // Every 10 seconds var shieldPowerUp = new ShieldPowerUp(); shieldPowerUp.x = 2048 + 100; shieldPowerUp.y = Math.random() * 2000 + 300; // Random y position game.addChild(shieldPowerUp); obstacles.push(shieldPowerUp); } // Check power-up collisions for (var i = obstacles.length - 1; i >= 0; i--) { if (obstacles[i] instanceof PowerUp && player.intersects(obstacles[i])) { player.activateFlyPowerUp(); obstacles[i].destroy(); obstacles.splice(i, 1); } else if (obstacles[i] instanceof ShieldPowerUp && player.intersects(obstacles[i])) { player.activateShield(); obstacles[i].destroy(); obstacles.splice(i, 1); } } // Update particles for (var i = particles.length - 1; i >= 0; i--) { if (particles[i].update()) { particles.splice(i, 1); } } // Check collisions checkCollisions(); }; // Initialize the game initGame();
===================================================================
--- original.js
+++ change.js
@@ -156,8 +156,26 @@
return false;
};
return self;
});
+var ShieldPowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var shieldGraphics = self.attachAsset('particle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'shield';
+ self.speed = -8;
+ self.update = function () {
+ self.x += self.speed;
+ if (self.x < -100) {
+ self.destroy();
+ return true;
+ }
+ return false;
+ };
+ return self;
+});
/****
* Initialize Game
****/
@@ -168,8 +186,18 @@
/****
* Game Code
****/
// Game variables
+Player.prototype.activateShield = function () {
+ if (!this.isDead) {
+ this.hasShield = true;
+ LK.effects.flashObject(this, 0x00ff00, 500);
+ var self = this;
+ LK.setTimeout(function () {
+ self.hasShield = false;
+ }, 10000); // Shield lasts for 10 seconds
+ }
+};
var player;
var obstacles = [];
var grounds = [];
var particles = [];
@@ -331,9 +359,14 @@
}
// Check obstacle collisions
obstacles.forEach(function (obstacle) {
if (player.intersects(obstacle)) {
- player.die();
+ if (player.hasShield) {
+ player.hasShield = false; // Remove shield on collision
+ obstacle.destroy();
+ } else {
+ player.die();
+ }
}
});
}
// Input event handlers
@@ -372,14 +405,26 @@
powerUp.y = Math.random() * 2000 + 300; // Random y position
game.addChild(powerUp);
obstacles.push(powerUp);
}
+ if (LK.ticks % 600 === 0) {
+ // Every 10 seconds
+ var shieldPowerUp = new ShieldPowerUp();
+ shieldPowerUp.x = 2048 + 100;
+ shieldPowerUp.y = Math.random() * 2000 + 300; // Random y position
+ game.addChild(shieldPowerUp);
+ obstacles.push(shieldPowerUp);
+ }
// Check power-up collisions
for (var i = obstacles.length - 1; i >= 0; i--) {
if (obstacles[i] instanceof PowerUp && player.intersects(obstacles[i])) {
player.activateFlyPowerUp();
obstacles[i].destroy();
obstacles.splice(i, 1);
+ } else if (obstacles[i] instanceof ShieldPowerUp && player.intersects(obstacles[i])) {
+ player.activateShield();
+ obstacles[i].destroy();
+ obstacles.splice(i, 1);
}
}
// Update particles
for (var i = particles.length - 1; i >= 0; i--) {