/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Obstacle = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'spike'; var graphics = self.attachAsset(self.type, { anchorX: 0.5, anchorY: 0.5 }); if (self.type === 'spike') { // Rotate spike to make it point upward graphics.rotation = Math.PI / 4; } self.speed = 10; self.active = true; self.update = function () { if (!self.active) { return; } self.x -= self.speed; // Remove when offscreen if (self.x < -graphics.width) { self.active = false; self.destroy(); } }; return self; }); var Platform = Obstacle.expand(function () { var self = Obstacle.call(this, 'platform'); self.yOffset = 0; self.moving = Math.random() > 0.7; self.moveDirection = 1; self.moveSpeed = 2; self.moveRange = 100; self.initialY = 0; var superUpdate = self.update; self.update = function () { superUpdate.call(self); if (self.moving && self.active) { self.yOffset += self.moveDirection * self.moveSpeed; if (Math.abs(self.yOffset) > self.moveRange) { self.moveDirection *= -1; } self.y = self.initialY + self.yOffset; } }; 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 = 0.8; self.jumpForce = -18; self.onGround = false; self.isDead = false; self.rotation = 0; self.jump = function () { if (self.onGround && !self.isDead) { self.velocity = self.jumpForce; self.onGround = false; LK.getSound('jump').play(); // Rotate the player tween.stop(self, { rotation: true }); tween(self, { rotation: self.rotation - Math.PI * 2 }, { duration: 500, easing: tween.linear }); } }; self.die = function () { if (!self.isDead) { self.isDead = true; LK.getSound('death').play(); LK.effects.flashObject(self, 0xff0000, 500); // Show death animation tween(self, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 800, easing: tween.easeOut, onFinish: function onFinish() { LK.showGameOver(); } }); } }; self.update = function () { if (self.isDead) { return; } // Apply gravity self.velocity += self.gravity; self.y += self.velocity; // Check ground collision if (self.y > groundLevel - playerGraphics.height / 2) { self.y = groundLevel - playerGraphics.height / 2; self.velocity = 0; self.onGround = true; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x121212 }); /**** * Game Code ****/ // Game variables var gameSpeed = 10; var groundLevel = 2500; var obstacleSpawnRate = 90; var score = 0; var highScore = storage.highScore || 0; var obstacles = []; var backgroundTiles = []; var groundTiles = []; var platformHeight = 350; var lastObstacleType = ''; var player; var groundTileWidth = 300; var dragNode = null; // Set up background var background = LK.getAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(background); // Create ground function createGround() { var numTiles = Math.ceil(2048 / groundTileWidth) + 2; for (var i = 0; i < numTiles; i++) { var groundTile = LK.getAsset('ground', { anchorX: 0, anchorY: 0, x: i * groundTileWidth, y: groundLevel }); game.addChild(groundTile); groundTiles.push(groundTile); } } // Create the player function createPlayer() { player = new Player(); player.x = 300; player.y = groundLevel - 200; game.addChild(player); player.down = function () { player.jump(); }; } // Create scoring UI var scoreText = new Text2('Score: 0', { size: 70, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); var highScoreText = new Text2('Best: ' + highScore, { size: 50, fill: 0xCCCCCC }); highScoreText.anchor.set(0.5, 0); highScoreText.y = 80; LK.gui.top.addChild(highScoreText); // Update score function updateScore() { score++; scoreText.setText('Score: ' + score); if (score > highScore) { highScore = score; storage.highScore = highScore; highScoreText.setText('Best: ' + highScore); } } // Create obstacles function createObstacle() { var type; // Avoid consecutive same obstacles do { var rand = Math.random(); type = rand < 0.6 ? 'spike' : 'platform'; } while (type === lastObstacleType); lastObstacleType = type; if (type === 'spike') { var obstacle = new Obstacle('spike'); obstacle.x = 2048 + 50; obstacle.y = groundLevel - obstacle.height / 2; game.addChild(obstacle); obstacles.push(obstacle); } else { var platform = new Platform(); platform.x = 2048 + 50; // Random height for platforms var platformY = groundLevel - platformHeight - Math.random() * 250; platform.y = platformY; platform.initialY = platformY; game.addChild(platform); obstacles.push(platform); } } // Check for collisions function checkCollisions() { if (player.isDead) { return; } for (var i = 0; i < obstacles.length; i++) { var obstacle = obstacles[i]; if (player.intersects(obstacle)) { if (obstacle.type === 'spike') { player.die(); return; } else if (obstacle.type === 'platform') { // Only consider standing on top of platforms var playerBottom = player.y + player.height / 2; var platformTop = obstacle.y - obstacle.height / 2; // Check if player is above platform and falling down if (player.velocity > 0 && playerBottom >= platformTop && playerBottom <= platformTop + Math.abs(player.velocity) + 5) { player.y = platformTop - player.height / 2; player.velocity = 0; player.onGround = true; } else { // Side collision with platform player.die(); return; } } } } } // Move ground tiles function moveGround() { for (var i = 0; i < groundTiles.length; i++) { var tile = groundTiles[i]; tile.x -= gameSpeed; // If the tile is completely off-screen, move it to the right if (tile.x <= -groundTileWidth) { var lastTileX = -Infinity; // Find the rightmost tile for (var j = 0; j < groundTiles.length; j++) { if (groundTiles[j].x > lastTileX) { lastTileX = groundTiles[j].x; } } // Place this tile after the rightmost one tile.x = lastTileX + groundTileWidth; } } } // Clear game state function resetGame() { // Clear obstacles for (var i = 0; i < obstacles.length; i++) { obstacles[i].destroy(); } obstacles = []; // Reset score score = 0; scoreText.setText('Score: 0'); // Reset player if (player) { player.destroy(); } createPlayer(); } // Start the game function startGame() { createGround(); createPlayer(); // Start game music LK.playMusic('gameMusic', { fade: { start: 0, end: 0.5, duration: 1000 } }); } // Main update loop game.update = function () { // Move ground moveGround(); // Spawn obstacles if (LK.ticks % obstacleSpawnRate === 0) { createObstacle(); } // Update obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; if (!obstacle.active) { obstacles.splice(i, 1); } } // Check collisions checkCollisions(); // Update score periodically if (LK.ticks % 30 === 0 && !player.isDead) { updateScore(); } // Gradually increase game difficulty if (LK.ticks % 600 === 0 && gameSpeed < 18) { gameSpeed += 0.5; // Update obstacle speed for (var i = 0; i < obstacles.length; i++) { obstacles[i].speed = gameSpeed; } // Reduce spawn rate to increase difficulty if (obstacleSpawnRate > 45) { obstacleSpawnRate -= 5; } } }; // Handle input game.down = function (x, y, obj) { player.jump(); }; // Initialize the game startGame();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,344 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Obstacle = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'spike';
+ var graphics = self.attachAsset(self.type, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ if (self.type === 'spike') {
+ // Rotate spike to make it point upward
+ graphics.rotation = Math.PI / 4;
+ }
+ self.speed = 10;
+ self.active = true;
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ self.x -= self.speed;
+ // Remove when offscreen
+ if (self.x < -graphics.width) {
+ self.active = false;
+ self.destroy();
+ }
+ };
+ return self;
+});
+var Platform = Obstacle.expand(function () {
+ var self = Obstacle.call(this, 'platform');
+ self.yOffset = 0;
+ self.moving = Math.random() > 0.7;
+ self.moveDirection = 1;
+ self.moveSpeed = 2;
+ self.moveRange = 100;
+ self.initialY = 0;
+ var superUpdate = self.update;
+ self.update = function () {
+ superUpdate.call(self);
+ if (self.moving && self.active) {
+ self.yOffset += self.moveDirection * self.moveSpeed;
+ if (Math.abs(self.yOffset) > self.moveRange) {
+ self.moveDirection *= -1;
+ }
+ self.y = self.initialY + self.yOffset;
+ }
+ };
+ 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 = 0.8;
+ self.jumpForce = -18;
+ self.onGround = false;
+ self.isDead = false;
+ self.rotation = 0;
+ self.jump = function () {
+ if (self.onGround && !self.isDead) {
+ self.velocity = self.jumpForce;
+ self.onGround = false;
+ LK.getSound('jump').play();
+ // Rotate the player
+ tween.stop(self, {
+ rotation: true
+ });
+ tween(self, {
+ rotation: self.rotation - Math.PI * 2
+ }, {
+ duration: 500,
+ easing: tween.linear
+ });
+ }
+ };
+ self.die = function () {
+ if (!self.isDead) {
+ self.isDead = true;
+ LK.getSound('death').play();
+ LK.effects.flashObject(self, 0xff0000, 500);
+ // Show death animation
+ tween(self, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 800,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ LK.showGameOver();
+ }
+ });
+ }
+ };
+ self.update = function () {
+ if (self.isDead) {
+ return;
+ }
+ // Apply gravity
+ self.velocity += self.gravity;
+ self.y += self.velocity;
+ // Check ground collision
+ if (self.y > groundLevel - playerGraphics.height / 2) {
+ self.y = groundLevel - playerGraphics.height / 2;
+ self.velocity = 0;
+ self.onGround = true;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x121212
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var gameSpeed = 10;
+var groundLevel = 2500;
+var obstacleSpawnRate = 90;
+var score = 0;
+var highScore = storage.highScore || 0;
+var obstacles = [];
+var backgroundTiles = [];
+var groundTiles = [];
+var platformHeight = 350;
+var lastObstacleType = '';
+var player;
+var groundTileWidth = 300;
+var dragNode = null;
+// Set up background
+var background = LK.getAsset('background', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 0,
+ y: 0
+});
+game.addChild(background);
+// Create ground
+function createGround() {
+ var numTiles = Math.ceil(2048 / groundTileWidth) + 2;
+ for (var i = 0; i < numTiles; i++) {
+ var groundTile = LK.getAsset('ground', {
+ anchorX: 0,
+ anchorY: 0,
+ x: i * groundTileWidth,
+ y: groundLevel
+ });
+ game.addChild(groundTile);
+ groundTiles.push(groundTile);
+ }
+}
+// Create the player
+function createPlayer() {
+ player = new Player();
+ player.x = 300;
+ player.y = groundLevel - 200;
+ game.addChild(player);
+ player.down = function () {
+ player.jump();
+ };
+}
+// Create scoring UI
+var scoreText = new Text2('Score: 0', {
+ size: 70,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreText);
+var highScoreText = new Text2('Best: ' + highScore, {
+ size: 50,
+ fill: 0xCCCCCC
+});
+highScoreText.anchor.set(0.5, 0);
+highScoreText.y = 80;
+LK.gui.top.addChild(highScoreText);
+// Update score
+function updateScore() {
+ score++;
+ scoreText.setText('Score: ' + score);
+ if (score > highScore) {
+ highScore = score;
+ storage.highScore = highScore;
+ highScoreText.setText('Best: ' + highScore);
+ }
+}
+// Create obstacles
+function createObstacle() {
+ var type;
+ // Avoid consecutive same obstacles
+ do {
+ var rand = Math.random();
+ type = rand < 0.6 ? 'spike' : 'platform';
+ } while (type === lastObstacleType);
+ lastObstacleType = type;
+ if (type === 'spike') {
+ var obstacle = new Obstacle('spike');
+ obstacle.x = 2048 + 50;
+ obstacle.y = groundLevel - obstacle.height / 2;
+ game.addChild(obstacle);
+ obstacles.push(obstacle);
+ } else {
+ var platform = new Platform();
+ platform.x = 2048 + 50;
+ // Random height for platforms
+ var platformY = groundLevel - platformHeight - Math.random() * 250;
+ platform.y = platformY;
+ platform.initialY = platformY;
+ game.addChild(platform);
+ obstacles.push(platform);
+ }
+}
+// Check for collisions
+function checkCollisions() {
+ if (player.isDead) {
+ return;
+ }
+ for (var i = 0; i < obstacles.length; i++) {
+ var obstacle = obstacles[i];
+ if (player.intersects(obstacle)) {
+ if (obstacle.type === 'spike') {
+ player.die();
+ return;
+ } else if (obstacle.type === 'platform') {
+ // Only consider standing on top of platforms
+ var playerBottom = player.y + player.height / 2;
+ var platformTop = obstacle.y - obstacle.height / 2;
+ // Check if player is above platform and falling down
+ if (player.velocity > 0 && playerBottom >= platformTop && playerBottom <= platformTop + Math.abs(player.velocity) + 5) {
+ player.y = platformTop - player.height / 2;
+ player.velocity = 0;
+ player.onGround = true;
+ } else {
+ // Side collision with platform
+ player.die();
+ return;
+ }
+ }
+ }
+ }
+}
+// Move ground tiles
+function moveGround() {
+ for (var i = 0; i < groundTiles.length; i++) {
+ var tile = groundTiles[i];
+ tile.x -= gameSpeed;
+ // If the tile is completely off-screen, move it to the right
+ if (tile.x <= -groundTileWidth) {
+ var lastTileX = -Infinity;
+ // Find the rightmost tile
+ for (var j = 0; j < groundTiles.length; j++) {
+ if (groundTiles[j].x > lastTileX) {
+ lastTileX = groundTiles[j].x;
+ }
+ }
+ // Place this tile after the rightmost one
+ tile.x = lastTileX + groundTileWidth;
+ }
+ }
+}
+// Clear game state
+function resetGame() {
+ // Clear obstacles
+ for (var i = 0; i < obstacles.length; i++) {
+ obstacles[i].destroy();
+ }
+ obstacles = [];
+ // Reset score
+ score = 0;
+ scoreText.setText('Score: 0');
+ // Reset player
+ if (player) {
+ player.destroy();
+ }
+ createPlayer();
+}
+// Start the game
+function startGame() {
+ createGround();
+ createPlayer();
+ // Start game music
+ LK.playMusic('gameMusic', {
+ fade: {
+ start: 0,
+ end: 0.5,
+ duration: 1000
+ }
+ });
+}
+// Main update loop
+game.update = function () {
+ // Move ground
+ moveGround();
+ // Spawn obstacles
+ if (LK.ticks % obstacleSpawnRate === 0) {
+ createObstacle();
+ }
+ // Update obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ if (!obstacle.active) {
+ obstacles.splice(i, 1);
+ }
+ }
+ // Check collisions
+ checkCollisions();
+ // Update score periodically
+ if (LK.ticks % 30 === 0 && !player.isDead) {
+ updateScore();
+ }
+ // Gradually increase game difficulty
+ if (LK.ticks % 600 === 0 && gameSpeed < 18) {
+ gameSpeed += 0.5;
+ // Update obstacle speed
+ for (var i = 0; i < obstacles.length; i++) {
+ obstacles[i].speed = gameSpeed;
+ }
+ // Reduce spawn rate to increase difficulty
+ if (obstacleSpawnRate > 45) {
+ obstacleSpawnRate -= 5;
+ }
+ }
+};
+// Handle input
+game.down = function (x, y, obj) {
+ player.jump();
+};
+// Initialize the game
+startGame();
\ No newline at end of file