/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0 }); /**** * Classes ****/ var Asteroid = Container.expand(function (size, speed) { var self = Container.call(this); self.size = size || 'large'; self.speed = speed || 5; var assetId = self.size === 'small' ? 'smallAsteroid' : 'asteroid'; var asteroidGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); // Random rotation self.rotationSpeed = (Math.random() - 0.5) * 0.1; self.update = function () { self.y += self.speed; asteroidGraphics.rotation += self.rotationSpeed; }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.update = function () { self.y -= self.speed; }; return self; }); var PlayerShip = Container.expand(function () { var self = Container.call(this); var shipGraphics = self.attachAsset('playerShip', { anchorX: 0.5, anchorY: 0.5 }); self.shield = false; self.speedBoost = false; self.weaponPowerup = false; self.shieldGraphic = self.attachAsset('shield', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.width = shipGraphics.width; self.height = shipGraphics.height; self.shootCooldown = 0; self.activateShield = function (duration) { self.shield = true; self.shieldGraphic.alpha = 0.5; LK.clearTimeout(self.shieldTimeout); self.shieldTimeout = LK.setTimeout(function () { self.shield = false; tween(self.shieldGraphic, { alpha: 0 }, { duration: 300 }); }, duration); }; self.activateSpeedBoost = function (duration) { self.speedBoost = true; LK.clearTimeout(self.speedBoostTimeout); self.speedBoostTimeout = LK.setTimeout(function () { self.speedBoost = false; }, duration); }; self.activateWeaponPowerup = function (duration) { self.weaponPowerup = true; LK.clearTimeout(self.weaponPowerupTimeout); self.weaponPowerupTimeout = LK.setTimeout(function () { self.weaponPowerup = false; }, duration); }; self.update = function () { if (self.shootCooldown > 0) { self.shootCooldown--; } }; self.shoot = function () { if (self.shootCooldown <= 0) { self.shootCooldown = self.weaponPowerup ? 10 : 20; return true; } return false; }; return self; }); var PowerUp = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'shield'; var assetId; switch (self.type) { case 'shield': assetId = 'shield'; break; case 'speed': assetId = 'speedBoost'; break; case 'weapon': assetId = 'weaponPowerup'; break; default: assetId = 'shield'; } var powerupGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3; self.update = function () { self.y += self.speed; powerupGraphics.rotation += 0.02; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000033 }); /**** * Game Code ****/ // Game variables var player; var asteroids = []; var powerups = []; var bullets = []; var score = 0; var gameActive = true; var lastAsteroidTime = 0; var lastPowerupTime = 0; var difficultyLevel = 1; var difficultyTimer = 0; var highScore = storage.highScore || 0; // Game dimension constants var GAME_WIDTH = 2048; var GAME_HEIGHT = 2732; // Create score display var scoreTxt = new Text2('SCORE: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); scoreTxt.y = 50; // Create high score display var highScoreTxt = new Text2('HIGH SCORE: ' + highScore, { size: 60, fill: 0xFFCC00 }); highScoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(highScoreTxt); highScoreTxt.y = 140; // Initialize the player ship function initPlayer() { player = new PlayerShip(); player.x = GAME_WIDTH / 2; player.y = GAME_HEIGHT - 200; game.addChild(player); } // Initialize game elements function initGame() { initPlayer(); asteroids = []; powerups = []; bullets = []; score = 0; gameActive = true; lastAsteroidTime = 0; lastPowerupTime = 0; difficultyLevel = 1; difficultyTimer = 0; updateScore(0); // Play background music LK.playMusic('bgmusic'); } // Clean up game elements function cleanupGame() { if (player) { player.destroy(); player = null; } for (var i = 0; i < asteroids.length; i++) { asteroids[i].destroy(); } asteroids = []; for (var i = 0; i < powerups.length; i++) { powerups[i].destroy(); } powerups = []; for (var i = 0; i < bullets.length; i++) { bullets[i].destroy(); } bullets = []; LK.stopMusic(); } // Update score display function updateScore(newScore) { score = newScore; scoreTxt.setText('SCORE: ' + score); if (score > highScore) { highScore = score; storage.highScore = highScore; highScoreTxt.setText('HIGH SCORE: ' + highScore); } } // Spawn a new asteroid function spawnAsteroid() { var size = Math.random() < 0.3 ? 'small' : 'large'; var speed = Math.random() * 2 + 3 + difficultyLevel * 0.5; if (size === 'small') speed += 1; var asteroid = new Asteroid(size, speed); asteroid.x = Math.random() * (GAME_WIDTH - 200) + 100; asteroid.y = -100; asteroids.push(asteroid); game.addChild(asteroid); } // Spawn a new power-up function spawnPowerup() { var types = ['shield', 'speed', 'weapon']; var type = types[Math.floor(Math.random() * types.length)]; var powerup = new PowerUp(type); powerup.x = Math.random() * (GAME_WIDTH - 200) + 100; powerup.y = -100; powerups.push(powerup); game.addChild(powerup); } // Create a new bullet function fireBullet() { if (player && player.shoot()) { var bullet = new Bullet(); bullet.x = player.x; bullet.y = player.y - player.height / 2; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); // If player has weapon powerup, fire additional bullets if (player.weaponPowerup) { var bulletLeft = new Bullet(); bulletLeft.x = player.x - 30; bulletLeft.y = player.y - player.height / 2; bullets.push(bulletLeft); game.addChild(bulletLeft); var bulletRight = new Bullet(); bulletRight.x = player.x + 30; bulletRight.y = player.y - player.height / 2; bullets.push(bulletRight); game.addChild(bulletRight); } } } // Check collisions between game objects function checkCollisions() { if (!player || !gameActive) return; // Check asteroid collisions with player for (var i = asteroids.length - 1; i >= 0; i--) { var asteroid = asteroids[i]; // Check if asteroid is off screen if (asteroid.y > GAME_HEIGHT + 100) { asteroid.destroy(); asteroids.splice(i, 1); continue; } // Check collision with player if (player.intersects(asteroid)) { if (player.shield) { // Destroy asteroid but player is protected asteroid.destroy(); asteroids.splice(i, 1); updateScore(score + 5); } else { // Game over LK.effects.flashScreen(0xff0000, 1000); LK.getSound('collision').play(); gameActive = false; LK.showGameOver(); return; } } // Check collision with bullets for (var j = bullets.length - 1; j >= 0; j--) { var bullet = bullets[j]; if (asteroid.intersects(bullet)) { // Destroy both asteroid and bullet asteroid.destroy(); asteroids.splice(i, 1); bullet.destroy(); bullets.splice(j, 1); // Add score based on asteroid size updateScore(score + (asteroid.size === 'small' ? 15 : 10)); break; } } } // Check powerup collisions with player for (var i = powerups.length - 1; i >= 0; i--) { var powerup = powerups[i]; // Check if powerup is off screen if (powerup.y > GAME_HEIGHT + 100) { powerup.destroy(); powerups.splice(i, 1); continue; } // Check collision with player if (player.intersects(powerup)) { // Apply power-up effect switch (powerup.type) { case 'shield': player.activateShield(8000); break; case 'speed': player.activateSpeedBoost(10000); break; case 'weapon': player.activateWeaponPowerup(12000); break; } LK.getSound('powerup').play(); powerup.destroy(); powerups.splice(i, 1); updateScore(score + 5); } } // Check if bullets are off screen for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; if (bullet.y < -100) { bullet.destroy(); bullets.splice(i, 1); } } } // Handle moving the player ship var dragging = false; var touchOffset = { x: 0, y: 0 }; function handleMove(x, y, obj) { if (dragging && player) { player.x = Math.max(player.width / 2, Math.min(GAME_WIDTH - player.width / 2, x - touchOffset.x)); player.y = Math.max(player.height / 2, Math.min(GAME_HEIGHT - player.height / 2, y - touchOffset.y)); } } game.down = function (x, y, obj) { if (!gameActive) return; if (player && !dragging) { // Calculate offset for smooth dragging var playerPos = game.toLocal(player.parent.toGlobal(player.position)); touchOffset.x = x - playerPos.x; touchOffset.y = y - playerPos.y; dragging = true; // Fire bullet on tap fireBullet(); } handleMove(x, y, obj); }; game.up = function (x, y, obj) { dragging = false; }; game.move = handleMove; // Main game update loop game.update = function () { if (!gameActive) return; // Update player if (player) { player.update(); } // Update difficulty difficultyTimer++; if (difficultyTimer >= 1800) { // Every 30 seconds difficultyLevel = Math.min(difficultyLevel + 1, 10); difficultyTimer = 0; } // Spawn asteroids var asteroidSpawnRate = Math.max(60 - difficultyLevel * 5, 20); if (LK.ticks - lastAsteroidTime >= asteroidSpawnRate) { spawnAsteroid(); lastAsteroidTime = LK.ticks; } // Spawn power-ups (less frequently) var powerupSpawnRate = 300 - difficultyLevel * 10; if (LK.ticks - lastPowerupTime >= powerupSpawnRate) { if (Math.random() < 0.7) { // 70% chance to spawn a powerup when the timer hits spawnPowerup(); } lastPowerupTime = LK.ticks; } // Update asteroids for (var i = 0; i < asteroids.length; i++) { asteroids[i].update(); } // Update power-ups for (var i = 0; i < powerups.length; i++) { powerups[i].update(); } // Update bullets for (var i = 0; i < bullets.length; i++) { bullets[i].update(); } // Check for collisions checkCollisions(); // Increment score based on survival time if (LK.ticks % 60 === 0) { // Once per second updateScore(score + 1); } }; // Initialize the game initGame();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,427 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ highScore: 0
+});
+
+/****
+* Classes
+****/
+var Asteroid = Container.expand(function (size, speed) {
+ var self = Container.call(this);
+ self.size = size || 'large';
+ self.speed = speed || 5;
+ var assetId = self.size === 'small' ? 'smallAsteroid' : 'asteroid';
+ var asteroidGraphics = self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Random rotation
+ self.rotationSpeed = (Math.random() - 0.5) * 0.1;
+ self.update = function () {
+ self.y += self.speed;
+ asteroidGraphics.rotation += self.rotationSpeed;
+ };
+ return self;
+});
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 10;
+ self.update = function () {
+ self.y -= self.speed;
+ };
+ return self;
+});
+var PlayerShip = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGraphics = self.attachAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.shield = false;
+ self.speedBoost = false;
+ self.weaponPowerup = false;
+ self.shieldGraphic = self.attachAsset('shield', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0
+ });
+ self.width = shipGraphics.width;
+ self.height = shipGraphics.height;
+ self.shootCooldown = 0;
+ self.activateShield = function (duration) {
+ self.shield = true;
+ self.shieldGraphic.alpha = 0.5;
+ LK.clearTimeout(self.shieldTimeout);
+ self.shieldTimeout = LK.setTimeout(function () {
+ self.shield = false;
+ tween(self.shieldGraphic, {
+ alpha: 0
+ }, {
+ duration: 300
+ });
+ }, duration);
+ };
+ self.activateSpeedBoost = function (duration) {
+ self.speedBoost = true;
+ LK.clearTimeout(self.speedBoostTimeout);
+ self.speedBoostTimeout = LK.setTimeout(function () {
+ self.speedBoost = false;
+ }, duration);
+ };
+ self.activateWeaponPowerup = function (duration) {
+ self.weaponPowerup = true;
+ LK.clearTimeout(self.weaponPowerupTimeout);
+ self.weaponPowerupTimeout = LK.setTimeout(function () {
+ self.weaponPowerup = false;
+ }, duration);
+ };
+ self.update = function () {
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ };
+ self.shoot = function () {
+ if (self.shootCooldown <= 0) {
+ self.shootCooldown = self.weaponPowerup ? 10 : 20;
+ return true;
+ }
+ return false;
+ };
+ return self;
+});
+var PowerUp = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'shield';
+ var assetId;
+ switch (self.type) {
+ case 'shield':
+ assetId = 'shield';
+ break;
+ case 'speed':
+ assetId = 'speedBoost';
+ break;
+ case 'weapon':
+ assetId = 'weaponPowerup';
+ break;
+ default:
+ assetId = 'shield';
+ }
+ var powerupGraphics = self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 3;
+ self.update = function () {
+ self.y += self.speed;
+ powerupGraphics.rotation += 0.02;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000033
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var asteroids = [];
+var powerups = [];
+var bullets = [];
+var score = 0;
+var gameActive = true;
+var lastAsteroidTime = 0;
+var lastPowerupTime = 0;
+var difficultyLevel = 1;
+var difficultyTimer = 0;
+var highScore = storage.highScore || 0;
+// Game dimension constants
+var GAME_WIDTH = 2048;
+var GAME_HEIGHT = 2732;
+// Create score display
+var scoreTxt = new Text2('SCORE: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+scoreTxt.y = 50;
+// Create high score display
+var highScoreTxt = new Text2('HIGH SCORE: ' + highScore, {
+ size: 60,
+ fill: 0xFFCC00
+});
+highScoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(highScoreTxt);
+highScoreTxt.y = 140;
+// Initialize the player ship
+function initPlayer() {
+ player = new PlayerShip();
+ player.x = GAME_WIDTH / 2;
+ player.y = GAME_HEIGHT - 200;
+ game.addChild(player);
+}
+// Initialize game elements
+function initGame() {
+ initPlayer();
+ asteroids = [];
+ powerups = [];
+ bullets = [];
+ score = 0;
+ gameActive = true;
+ lastAsteroidTime = 0;
+ lastPowerupTime = 0;
+ difficultyLevel = 1;
+ difficultyTimer = 0;
+ updateScore(0);
+ // Play background music
+ LK.playMusic('bgmusic');
+}
+// Clean up game elements
+function cleanupGame() {
+ if (player) {
+ player.destroy();
+ player = null;
+ }
+ for (var i = 0; i < asteroids.length; i++) {
+ asteroids[i].destroy();
+ }
+ asteroids = [];
+ for (var i = 0; i < powerups.length; i++) {
+ powerups[i].destroy();
+ }
+ powerups = [];
+ for (var i = 0; i < bullets.length; i++) {
+ bullets[i].destroy();
+ }
+ bullets = [];
+ LK.stopMusic();
+}
+// Update score display
+function updateScore(newScore) {
+ score = newScore;
+ scoreTxt.setText('SCORE: ' + score);
+ if (score > highScore) {
+ highScore = score;
+ storage.highScore = highScore;
+ highScoreTxt.setText('HIGH SCORE: ' + highScore);
+ }
+}
+// Spawn a new asteroid
+function spawnAsteroid() {
+ var size = Math.random() < 0.3 ? 'small' : 'large';
+ var speed = Math.random() * 2 + 3 + difficultyLevel * 0.5;
+ if (size === 'small') speed += 1;
+ var asteroid = new Asteroid(size, speed);
+ asteroid.x = Math.random() * (GAME_WIDTH - 200) + 100;
+ asteroid.y = -100;
+ asteroids.push(asteroid);
+ game.addChild(asteroid);
+}
+// Spawn a new power-up
+function spawnPowerup() {
+ var types = ['shield', 'speed', 'weapon'];
+ var type = types[Math.floor(Math.random() * types.length)];
+ var powerup = new PowerUp(type);
+ powerup.x = Math.random() * (GAME_WIDTH - 200) + 100;
+ powerup.y = -100;
+ powerups.push(powerup);
+ game.addChild(powerup);
+}
+// Create a new bullet
+function fireBullet() {
+ if (player && player.shoot()) {
+ var bullet = new Bullet();
+ bullet.x = player.x;
+ bullet.y = player.y - player.height / 2;
+ bullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ // If player has weapon powerup, fire additional bullets
+ if (player.weaponPowerup) {
+ var bulletLeft = new Bullet();
+ bulletLeft.x = player.x - 30;
+ bulletLeft.y = player.y - player.height / 2;
+ bullets.push(bulletLeft);
+ game.addChild(bulletLeft);
+ var bulletRight = new Bullet();
+ bulletRight.x = player.x + 30;
+ bulletRight.y = player.y - player.height / 2;
+ bullets.push(bulletRight);
+ game.addChild(bulletRight);
+ }
+ }
+}
+// Check collisions between game objects
+function checkCollisions() {
+ if (!player || !gameActive) return;
+ // Check asteroid collisions with player
+ for (var i = asteroids.length - 1; i >= 0; i--) {
+ var asteroid = asteroids[i];
+ // Check if asteroid is off screen
+ if (asteroid.y > GAME_HEIGHT + 100) {
+ asteroid.destroy();
+ asteroids.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (player.intersects(asteroid)) {
+ if (player.shield) {
+ // Destroy asteroid but player is protected
+ asteroid.destroy();
+ asteroids.splice(i, 1);
+ updateScore(score + 5);
+ } else {
+ // Game over
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.getSound('collision').play();
+ gameActive = false;
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Check collision with bullets
+ for (var j = bullets.length - 1; j >= 0; j--) {
+ var bullet = bullets[j];
+ if (asteroid.intersects(bullet)) {
+ // Destroy both asteroid and bullet
+ asteroid.destroy();
+ asteroids.splice(i, 1);
+ bullet.destroy();
+ bullets.splice(j, 1);
+ // Add score based on asteroid size
+ updateScore(score + (asteroid.size === 'small' ? 15 : 10));
+ break;
+ }
+ }
+ }
+ // Check powerup collisions with player
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ var powerup = powerups[i];
+ // Check if powerup is off screen
+ if (powerup.y > GAME_HEIGHT + 100) {
+ powerup.destroy();
+ powerups.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (player.intersects(powerup)) {
+ // Apply power-up effect
+ switch (powerup.type) {
+ case 'shield':
+ player.activateShield(8000);
+ break;
+ case 'speed':
+ player.activateSpeedBoost(10000);
+ break;
+ case 'weapon':
+ player.activateWeaponPowerup(12000);
+ break;
+ }
+ LK.getSound('powerup').play();
+ powerup.destroy();
+ powerups.splice(i, 1);
+ updateScore(score + 5);
+ }
+ }
+ // Check if bullets are off screen
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ if (bullet.y < -100) {
+ bullet.destroy();
+ bullets.splice(i, 1);
+ }
+ }
+}
+// Handle moving the player ship
+var dragging = false;
+var touchOffset = {
+ x: 0,
+ y: 0
+};
+function handleMove(x, y, obj) {
+ if (dragging && player) {
+ player.x = Math.max(player.width / 2, Math.min(GAME_WIDTH - player.width / 2, x - touchOffset.x));
+ player.y = Math.max(player.height / 2, Math.min(GAME_HEIGHT - player.height / 2, y - touchOffset.y));
+ }
+}
+game.down = function (x, y, obj) {
+ if (!gameActive) return;
+ if (player && !dragging) {
+ // Calculate offset for smooth dragging
+ var playerPos = game.toLocal(player.parent.toGlobal(player.position));
+ touchOffset.x = x - playerPos.x;
+ touchOffset.y = y - playerPos.y;
+ dragging = true;
+ // Fire bullet on tap
+ fireBullet();
+ }
+ handleMove(x, y, obj);
+};
+game.up = function (x, y, obj) {
+ dragging = false;
+};
+game.move = handleMove;
+// Main game update loop
+game.update = function () {
+ if (!gameActive) return;
+ // Update player
+ if (player) {
+ player.update();
+ }
+ // Update difficulty
+ difficultyTimer++;
+ if (difficultyTimer >= 1800) {
+ // Every 30 seconds
+ difficultyLevel = Math.min(difficultyLevel + 1, 10);
+ difficultyTimer = 0;
+ }
+ // Spawn asteroids
+ var asteroidSpawnRate = Math.max(60 - difficultyLevel * 5, 20);
+ if (LK.ticks - lastAsteroidTime >= asteroidSpawnRate) {
+ spawnAsteroid();
+ lastAsteroidTime = LK.ticks;
+ }
+ // Spawn power-ups (less frequently)
+ var powerupSpawnRate = 300 - difficultyLevel * 10;
+ if (LK.ticks - lastPowerupTime >= powerupSpawnRate) {
+ if (Math.random() < 0.7) {
+ // 70% chance to spawn a powerup when the timer hits
+ spawnPowerup();
+ }
+ lastPowerupTime = LK.ticks;
+ }
+ // Update asteroids
+ for (var i = 0; i < asteroids.length; i++) {
+ asteroids[i].update();
+ }
+ // Update power-ups
+ for (var i = 0; i < powerups.length; i++) {
+ powerups[i].update();
+ }
+ // Update bullets
+ for (var i = 0; i < bullets.length; i++) {
+ bullets[i].update();
+ }
+ // Check for collisions
+ checkCollisions();
+ // Increment score based on survival time
+ if (LK.ticks % 60 === 0) {
+ // Once per second
+ updateScore(score + 1);
+ }
+};
+// Initialize the game
+initGame();
\ No newline at end of file