/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highscore: 0, coins: 0 }); /**** * Classes ****/ var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12; self.active = true; self.collected = false; // Coin animation function animateCoin() { tween(coinGraphics, { scaleX: 0.8, scaleY: 0.8 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { tween(coinGraphics, { scaleX: 1.0, scaleY: 1.0 }, { duration: 500, easing: tween.easeInOut, onFinish: animateCoin }); } }); } animateCoin(); self.collect = function () { if (!self.collected) { self.collected = true; LK.getSound('coin_collect').play(); tween(self, { alpha: 0, scaleX: 1.5, scaleY: 1.5 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { self.active = false; self.destroy(); } }); // Update coins coins++; coinsText.setText("Coins: " + coins); // Save coins storage.coins = coins; } }; self.update = function () { if (!self.active) { return; } self.x -= self.speed; // Remove if off screen if (self.x < -coinGraphics.width) { self.active = false; self.destroy(); } }; return self; }); var Ground = Container.expand(function () { var self = Container.call(this); var groundGraphics = self.attachAsset('ground', { anchorX: 0, anchorY: 0 }); self.speed = 12; self.update = function () { self.x -= self.speed; // Loop ground if (self.x <= -groundGraphics.width) { self.x = 0; } }; return self; }); var GroundDecoration = Container.expand(function () { var self = Container.call(this); var decorationGraphics = self.attachAsset('ground_decoration', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12; self.active = true; // Random height decorationGraphics.height = 10 + Math.random() * 20; // Random color tint var colors = [0x7f8c8d, 0x95a5a6, 0xbdc3c7]; decorationGraphics.tint = colors[Math.floor(Math.random() * colors.length)]; self.update = function () { if (!self.active) { return; } self.x -= self.speed; // Remove if off screen if (self.x < -decorationGraphics.width) { self.active = false; self.destroy(); } }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 1.0 }); self.speed = 12; self.active = true; self.update = function () { if (!self.active) { return; } self.x -= self.speed; // Remove if off screen if (self.x < -obstacleGraphics.width) { self.active = false; self.destroy(); } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.velocity = 0; self.gravity = 1.5; self.jumpPower = -25; self.grounded = false; self.dead = false; self.jump = function () { if (self.grounded && !self.dead) { self.velocity = self.jumpPower; self.grounded = false; LK.getSound('jump').play(); // Jump animation tween(self, { rotation: -Math.PI * 2 }, { duration: 500, easing: tween.linear, onFinish: function onFinish() { self.rotation = 0; } }); } }; self.die = function () { if (!self.dead) { self.dead = true; LK.getSound('death').play(); LK.effects.flashObject(self, 0xff0000, 500); // Death animation tween(self, { alpha: 0 }, { duration: 1000, easing: tween.easeOut, onFinish: function onFinish() { LK.showGameOver(); } }); } }; self.update = function () { if (self.dead) { return; } // Apply gravity self.velocity += self.gravity; self.y += self.velocity; // Check if on ground if (self.y >= groundY - playerGraphics.height / 2) { self.y = groundY - playerGraphics.height / 2; self.velocity = 0; self.grounded = true; } // Die if player falls below ground (into a pit) if (self.y > groundY + 300) { self.die(); } }; return self; }); var Spike = Container.expand(function () { var self = Container.call(this); var spikeGraphics = self.attachAsset('spike', { anchorX: 0.5, anchorY: 1.0 }); self.speed = 12; self.active = true; // Rotate to make it look like a spike spikeGraphics.rotation = Math.PI / 4; self.update = function () { if (!self.active) { return; } self.x -= self.speed; // Remove if off screen if (self.x < -spikeGraphics.width) { self.active = false; self.destroy(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x34495e }); /**** * Game Code ****/ // Game variables var player; var obstacles = []; var spikes = []; var coins = []; var decorations = []; var grounds = []; var groundY = 2300; var score = 0; var distance = 0; var gameStarted = false; var gamePaused = false; var lastObstacleTime = 0; var obstacleSpawnRate = 120; // frames between obstacle spawns var coinCollected = storage.coins || 0; var coins = storage.coins || 0; var highscore = storage.highscore || 0; // Background var background = game.addChild(LK.getAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); // Create UI elements var scoreText = new Text2("Score: 0", { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); scoreText.y = 100; var coinsText = new Text2("Coins: " + coins, { size: 80, fill: 0xF1C40F }); coinsText.anchor.set(0.5, 0); LK.gui.top.addChild(coinsText); coinsText.y = 200; var highscoreText = new Text2("Best: " + highscore, { size: 80, fill: 0x2ECC71 }); highscoreText.anchor.set(0.5, 0); LK.gui.top.addChild(highscoreText); highscoreText.y = 300; var startText = new Text2("Tap to Start", { size: 120, fill: 0xFFFFFF }); startText.anchor.set(0.5, 0.5); LK.gui.center.addChild(startText); // Initialize grounds (double to create seamless loop) for (var i = 0; i < 2; i++) { var ground = new Ground(); ground.x = i * 2048; ground.y = groundY; grounds.push(ground); game.addChild(ground); } // Initialize player player = new Player(); player.x = 400; player.y = groundY - 50; game.addChild(player); // Start game function startGame() { if (!gameStarted) { gameStarted = true; LK.gui.center.removeChild(startText); LK.playMusic('bgmusic'); // Start with some decorations for (var i = 0; i < 15; i++) { spawnDecoration(200 + i * 200); } } } // Spawn obstacle function spawnObstacle() { var obstacleType = Math.random(); if (obstacleType < 0.6) { // Regular obstacle var obstacle = new Obstacle(); obstacle.x = 2148; // Just off screen to the right obstacle.y = groundY; obstacles.push(obstacle); game.addChild(obstacle); } else { // Spike var spike = new Spike(); spike.x = 2148; // Just off screen to the right spike.y = groundY; spikes.push(spike); game.addChild(spike); } // Maybe spawn a coin if (Math.random() < 0.3) { spawnCoin(); } } // Spawn coin function spawnCoin() { var coin = new Coin(); coin.x = 2148 + Math.random() * 200; // Slightly offset from obstacles coin.y = groundY - 150 - Math.random() * 200; // Above ground at varying heights coins.push(coin); game.addChild(coin); } // Spawn decorations function spawnDecoration(xPos) { var decoration = new GroundDecoration(); decoration.x = xPos || 2148 + Math.random() * 100; decoration.y = groundY - Math.random() * 10; decorations.push(decoration); game.addChild(decoration); } // Input handling game.down = function (x, y, obj) { if (!gameStarted) { startGame(); } else { player.jump(); } }; // Main game update loop game.update = function () { if (!gameStarted) { return; } // Update score if (!player.dead) { distance += 1; score = Math.floor(distance / 5); scoreText.setText("Score: " + score); // Update high score if needed if (score > highscore) { highscore = score; highscoreText.setText("Best: " + highscore); storage.highscore = highscore; } // Increase difficulty obstacleSpawnRate = Math.max(60, 120 - Math.floor(score / 100) * 10); } // Spawn obstacles if (LK.ticks - lastObstacleTime > obstacleSpawnRate) { spawnObstacle(); lastObstacleTime = LK.ticks; } // Spawn decorations randomly if (Math.random() < 0.05) { spawnDecoration(); } // Update obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; // Check collision with player if (!player.dead && player.intersects(obstacle)) { player.die(); } // Remove if not active anymore if (!obstacle.active) { obstacles.splice(i, 1); } } // Update spikes for (var i = spikes.length - 1; i >= 0; i--) { var spike = spikes[i]; // Check collision with player if (!player.dead && player.intersects(spike)) { player.die(); } // Remove if not active anymore if (!spike.active) { spikes.splice(i, 1); } } // Update coins for (var i = coins.length - 1; i >= 0; i--) { var coin = coins[i]; // Check collision with player if (!player.dead && !coin.collected && player.intersects(coin)) { coin.collect(); } // Remove if not active anymore if (!coin.active) { coins.splice(i, 1); } } // Update decorations for (var i = decorations.length - 1; i >= 0; i--) { if (!decorations[i].active) { decorations.splice(i, 1); } } // Increase game speed based on score var baseSpeed = 12; var speedMultiplier = 1 + Math.min(1, score / 1000); var gameSpeed = baseSpeed * speedMultiplier; // Update game speed for all moving objects for (var i = 0; i < obstacles.length; i++) { obstacles[i].speed = gameSpeed; } for (var i = 0; i < spikes.length; i++) { spikes[i].speed = gameSpeed; } for (var i = 0; i < coins.length; i++) { coins[i].speed = gameSpeed; } for (var i = 0; i < decorations.length; i++) { decorations[i].speed = gameSpeed; } for (var i = 0; i < grounds.length; i++) { grounds[i].speed = gameSpeed; } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,455 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ highscore: 0,
+ coins: 0
+});
+
+/****
+* Classes
+****/
+var Coin = Container.expand(function () {
+ var self = Container.call(this);
+ var coinGraphics = self.attachAsset('coin', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 12;
+ self.active = true;
+ self.collected = false;
+ // Coin animation
+ function animateCoin() {
+ tween(coinGraphics, {
+ scaleX: 0.8,
+ scaleY: 0.8
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(coinGraphics, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: animateCoin
+ });
+ }
+ });
+ }
+ animateCoin();
+ self.collect = function () {
+ if (!self.collected) {
+ self.collected = true;
+ LK.getSound('coin_collect').play();
+ tween(self, {
+ alpha: 0,
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.active = false;
+ self.destroy();
+ }
+ });
+ // Update coins
+ coins++;
+ coinsText.setText("Coins: " + coins);
+ // Save coins
+ storage.coins = coins;
+ }
+ };
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.x -= self.speed;
+ // Remove if off screen
+ if (self.x < -coinGraphics.width) {
+ self.active = false;
+ self.destroy();
+ }
+ };
+ return self;
+});
+var Ground = Container.expand(function () {
+ var self = Container.call(this);
+ var groundGraphics = self.attachAsset('ground', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ self.speed = 12;
+ self.update = function () {
+ self.x -= self.speed;
+ // Loop ground
+ if (self.x <= -groundGraphics.width) {
+ self.x = 0;
+ }
+ };
+ return self;
+});
+var GroundDecoration = Container.expand(function () {
+ var self = Container.call(this);
+ var decorationGraphics = self.attachAsset('ground_decoration', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 12;
+ self.active = true;
+ // Random height
+ decorationGraphics.height = 10 + Math.random() * 20;
+ // Random color tint
+ var colors = [0x7f8c8d, 0x95a5a6, 0xbdc3c7];
+ decorationGraphics.tint = colors[Math.floor(Math.random() * colors.length)];
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.x -= self.speed;
+ // Remove if off screen
+ if (self.x < -decorationGraphics.width) {
+ self.active = false;
+ self.destroy();
+ }
+ };
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.speed = 12;
+ self.active = true;
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.x -= self.speed;
+ // Remove if off screen
+ if (self.x < -obstacleGraphics.width) {
+ self.active = false;
+ self.destroy();
+ }
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.velocity = 0;
+ self.gravity = 1.5;
+ self.jumpPower = -25;
+ self.grounded = false;
+ self.dead = false;
+ self.jump = function () {
+ if (self.grounded && !self.dead) {
+ self.velocity = self.jumpPower;
+ self.grounded = false;
+ LK.getSound('jump').play();
+ // Jump animation
+ tween(self, {
+ rotation: -Math.PI * 2
+ }, {
+ duration: 500,
+ easing: tween.linear,
+ onFinish: function onFinish() {
+ self.rotation = 0;
+ }
+ });
+ }
+ };
+ self.die = function () {
+ if (!self.dead) {
+ self.dead = true;
+ LK.getSound('death').play();
+ LK.effects.flashObject(self, 0xff0000, 500);
+ // Death animation
+ tween(self, {
+ alpha: 0
+ }, {
+ duration: 1000,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ LK.showGameOver();
+ }
+ });
+ }
+ };
+ self.update = function () {
+ if (self.dead) {
+ return;
+ }
+ // Apply gravity
+ self.velocity += self.gravity;
+ self.y += self.velocity;
+ // Check if on ground
+ if (self.y >= groundY - playerGraphics.height / 2) {
+ self.y = groundY - playerGraphics.height / 2;
+ self.velocity = 0;
+ self.grounded = true;
+ }
+ // Die if player falls below ground (into a pit)
+ if (self.y > groundY + 300) {
+ self.die();
+ }
+ };
+ return self;
+});
+var Spike = Container.expand(function () {
+ var self = Container.call(this);
+ var spikeGraphics = self.attachAsset('spike', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.speed = 12;
+ self.active = true;
+ // Rotate to make it look like a spike
+ spikeGraphics.rotation = Math.PI / 4;
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.x -= self.speed;
+ // Remove if off screen
+ if (self.x < -spikeGraphics.width) {
+ self.active = false;
+ self.destroy();
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x34495e
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var obstacles = [];
+var spikes = [];
+var coins = [];
+var decorations = [];
+var grounds = [];
+var groundY = 2300;
+var score = 0;
+var distance = 0;
+var gameStarted = false;
+var gamePaused = false;
+var lastObstacleTime = 0;
+var obstacleSpawnRate = 120; // frames between obstacle spawns
+var coinCollected = storage.coins || 0;
+var coins = storage.coins || 0;
+var highscore = storage.highscore || 0;
+// Background
+var background = game.addChild(LK.getAsset('background', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 0,
+ y: 0
+}));
+// Create UI elements
+var scoreText = new Text2("Score: 0", {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreText);
+scoreText.y = 100;
+var coinsText = new Text2("Coins: " + coins, {
+ size: 80,
+ fill: 0xF1C40F
+});
+coinsText.anchor.set(0.5, 0);
+LK.gui.top.addChild(coinsText);
+coinsText.y = 200;
+var highscoreText = new Text2("Best: " + highscore, {
+ size: 80,
+ fill: 0x2ECC71
+});
+highscoreText.anchor.set(0.5, 0);
+LK.gui.top.addChild(highscoreText);
+highscoreText.y = 300;
+var startText = new Text2("Tap to Start", {
+ size: 120,
+ fill: 0xFFFFFF
+});
+startText.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(startText);
+// Initialize grounds (double to create seamless loop)
+for (var i = 0; i < 2; i++) {
+ var ground = new Ground();
+ ground.x = i * 2048;
+ ground.y = groundY;
+ grounds.push(ground);
+ game.addChild(ground);
+}
+// Initialize player
+player = new Player();
+player.x = 400;
+player.y = groundY - 50;
+game.addChild(player);
+// Start game
+function startGame() {
+ if (!gameStarted) {
+ gameStarted = true;
+ LK.gui.center.removeChild(startText);
+ LK.playMusic('bgmusic');
+ // Start with some decorations
+ for (var i = 0; i < 15; i++) {
+ spawnDecoration(200 + i * 200);
+ }
+ }
+}
+// Spawn obstacle
+function spawnObstacle() {
+ var obstacleType = Math.random();
+ if (obstacleType < 0.6) {
+ // Regular obstacle
+ var obstacle = new Obstacle();
+ obstacle.x = 2148; // Just off screen to the right
+ obstacle.y = groundY;
+ obstacles.push(obstacle);
+ game.addChild(obstacle);
+ } else {
+ // Spike
+ var spike = new Spike();
+ spike.x = 2148; // Just off screen to the right
+ spike.y = groundY;
+ spikes.push(spike);
+ game.addChild(spike);
+ }
+ // Maybe spawn a coin
+ if (Math.random() < 0.3) {
+ spawnCoin();
+ }
+}
+// Spawn coin
+function spawnCoin() {
+ var coin = new Coin();
+ coin.x = 2148 + Math.random() * 200; // Slightly offset from obstacles
+ coin.y = groundY - 150 - Math.random() * 200; // Above ground at varying heights
+ coins.push(coin);
+ game.addChild(coin);
+}
+// Spawn decorations
+function spawnDecoration(xPos) {
+ var decoration = new GroundDecoration();
+ decoration.x = xPos || 2148 + Math.random() * 100;
+ decoration.y = groundY - Math.random() * 10;
+ decorations.push(decoration);
+ game.addChild(decoration);
+}
+// Input handling
+game.down = function (x, y, obj) {
+ if (!gameStarted) {
+ startGame();
+ } else {
+ player.jump();
+ }
+};
+// Main game update loop
+game.update = function () {
+ if (!gameStarted) {
+ return;
+ }
+ // Update score
+ if (!player.dead) {
+ distance += 1;
+ score = Math.floor(distance / 5);
+ scoreText.setText("Score: " + score);
+ // Update high score if needed
+ if (score > highscore) {
+ highscore = score;
+ highscoreText.setText("Best: " + highscore);
+ storage.highscore = highscore;
+ }
+ // Increase difficulty
+ obstacleSpawnRate = Math.max(60, 120 - Math.floor(score / 100) * 10);
+ }
+ // Spawn obstacles
+ if (LK.ticks - lastObstacleTime > obstacleSpawnRate) {
+ spawnObstacle();
+ lastObstacleTime = LK.ticks;
+ }
+ // Spawn decorations randomly
+ if (Math.random() < 0.05) {
+ spawnDecoration();
+ }
+ // Update obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ // Check collision with player
+ if (!player.dead && player.intersects(obstacle)) {
+ player.die();
+ }
+ // Remove if not active anymore
+ if (!obstacle.active) {
+ obstacles.splice(i, 1);
+ }
+ }
+ // Update spikes
+ for (var i = spikes.length - 1; i >= 0; i--) {
+ var spike = spikes[i];
+ // Check collision with player
+ if (!player.dead && player.intersects(spike)) {
+ player.die();
+ }
+ // Remove if not active anymore
+ if (!spike.active) {
+ spikes.splice(i, 1);
+ }
+ }
+ // Update coins
+ for (var i = coins.length - 1; i >= 0; i--) {
+ var coin = coins[i];
+ // Check collision with player
+ if (!player.dead && !coin.collected && player.intersects(coin)) {
+ coin.collect();
+ }
+ // Remove if not active anymore
+ if (!coin.active) {
+ coins.splice(i, 1);
+ }
+ }
+ // Update decorations
+ for (var i = decorations.length - 1; i >= 0; i--) {
+ if (!decorations[i].active) {
+ decorations.splice(i, 1);
+ }
+ }
+ // Increase game speed based on score
+ var baseSpeed = 12;
+ var speedMultiplier = 1 + Math.min(1, score / 1000);
+ var gameSpeed = baseSpeed * speedMultiplier;
+ // Update game speed for all moving objects
+ for (var i = 0; i < obstacles.length; i++) {
+ obstacles[i].speed = gameSpeed;
+ }
+ for (var i = 0; i < spikes.length; i++) {
+ spikes[i].speed = gameSpeed;
+ }
+ for (var i = 0; i < coins.length; i++) {
+ coins[i].speed = gameSpeed;
+ }
+ for (var i = 0; i < decorations.length; i++) {
+ decorations[i].speed = gameSpeed;
+ }
+ for (var i = 0; i < grounds.length; i++) {
+ grounds[i].speed = gameSpeed;
+ }
+};
\ No newline at end of file