/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Asteroid var Asteroid = Container.expand(function () { var self = Container.call(this); var rock = self.attachAsset('asteroid', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10 + Math.random() * 6; self.rotationSpeed = (Math.random() - 0.5) * 0.1; self.update = function () { self.y += self.speed; rock.rotation += self.rotationSpeed; }; return self; }); // Enemy bullet var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bullet = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 18; self.update = function () { self.y += self.speed; }; return self; }); // Enemy ship var EnemyShip = Container.expand(function () { var self = Container.call(this); var enemy = self.attachAsset('enemyShip', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3 + Math.random() * 2; self.shootCooldown = 60 + Math.floor(Math.random() * 60); self.radius = enemy.width * 0.5; self.update = function () { self.y += self.speed; self.shootCooldown--; }; return self; }); // Player bullet var PlayerBullet = Container.expand(function () { var self = Container.call(this); var bullet = self.attachAsset('playerBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -32; self.update = function () { self.y += self.speed; }; return self; }); // Powerup var Powerup = Container.expand(function () { var self = Container.call(this); var p = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.type = 'invincible'; self.update = function () { self.y += self.speed; }; return self; }); // Player spaceship var Spaceship = Container.expand(function () { var self = Container.call(this); var ship = self.attachAsset('spaceship', { anchorX: 0.5, anchorY: 0.5 }); self.radius = ship.width * 0.5; self.invincible = false; self.invincibleTimer = 0; self.update = function () { if (self.invincible) { self.invincibleTimer--; if (self.invincibleTimer <= 0) { self.invincible = false; ship.alpha = 1; } else { ship.alpha = LK.ticks % 10 < 5 ? 0.5 : 1; } } }; self.makeInvincible = function (duration) { self.invincible = true; self.invincibleTimer = duration; ship.alpha = 0.5; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000010 }); /**** * Game Code ****/ // Powerup // Asteroid // Enemy bullet // Enemy ship // Player bullet // Spaceship (player) // Game variables var player; var playerBullets = []; var enemies = []; var enemyBullets = []; var asteroids = []; var powerups = []; var dragNode = null; var lastPlayerX = 0, lastPlayerY = 0; var canShoot = true; var shootCooldown = 0; var score = 0; var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); function spawnPlayer() { player = new Spaceship(); player.x = 2048 / 2; player.y = 2732 - 350; game.addChild(player); } function spawnEnemy() { var enemy = new EnemyShip(); enemy.x = 200 + Math.random() * (2048 - 400); enemy.y = -100; enemies.push(enemy); game.addChild(enemy); } function spawnAsteroid() { var asteroid = new Asteroid(); asteroid.x = 150 + Math.random() * (2048 - 300); asteroid.y = -100; asteroids.push(asteroid); game.addChild(asteroid); } function spawnPowerup() { var powerup = new Powerup(); powerup.x = 200 + Math.random() * (2048 - 400); powerup.y = -80; powerups.push(powerup); game.addChild(powerup); } function firePlayerBullet() { if (!player || player.invincible) return; var bullet = new PlayerBullet(); bullet.x = player.x; bullet.y = player.y - player.radius; playerBullets.push(bullet); game.addChild(bullet); } function fireEnemyBullet(enemy) { var bullet = new EnemyBullet(); bullet.x = enemy.x; bullet.y = enemy.y + enemy.radius; enemyBullets.push(bullet); game.addChild(bullet); } function resetGame() { // Not needed, handled by LK.showGameOver } // Dragging and shooting game.down = function (x, y, obj) { if (!player) return; dragNode = player; lastPlayerX = x; lastPlayerY = y; }; game.up = function (x, y, obj) { dragNode = null; }; function handleMove(x, y, obj) { if (dragNode === player) { // Clamp to game area, avoid top 100px (menu) var minX = player.radius + 20; var maxX = 2048 - player.radius - 20; var minY = 120 + player.radius; var maxY = 2732 - player.radius - 20; player.x = Math.max(minX, Math.min(maxX, x)); player.y = Math.max(minY, Math.min(maxY, y)); } } game.move = handleMove; // Tap to shoot (on any area) game.tap = function (x, y, obj) { if (canShoot && !player.invincible) { firePlayerBullet(); canShoot = false; shootCooldown = 10; } }; // Main update loop game.update = function () { // Player shooting cooldown if (!canShoot) { shootCooldown--; if (shootCooldown <= 0) { canShoot = true; } } // Update player if (player) player.update(); // Update and remove player bullets for (var i = playerBullets.length - 1; i >= 0; i--) { var b = playerBullets[i]; b.update(); if (b.y < -80) { b.destroy(); playerBullets.splice(i, 1); continue; } // Check collision with enemies for (var j = enemies.length - 1; j >= 0; j--) { var e = enemies[j]; if (b.intersects(e)) { // Destroy both b.destroy(); playerBullets.splice(i, 1); e.destroy(); enemies.splice(j, 1); score += 100; scoreTxt.setText(score); break; } } } // Update and remove enemies for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; e.update(); if (e.y > 2732 + 100) { e.destroy(); enemies.splice(i, 1); continue; } // Enemy shooting if (e.shootCooldown <= 0) { fireEnemyBullet(e); e.shootCooldown = 90 + Math.floor(Math.random() * 60); } // Collision with player if (player && !player.invincible && e.intersects(player)) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } } // Update and remove enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var b = enemyBullets[i]; b.update(); if (b.y > 2732 + 80) { b.destroy(); enemyBullets.splice(i, 1); continue; } // Collision with player if (player && !player.invincible && b.intersects(player)) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } } // Update and remove asteroids for (var i = asteroids.length - 1; i >= 0; i--) { var a = asteroids[i]; a.update(); if (a.y > 2732 + 100) { a.destroy(); asteroids.splice(i, 1); continue; } // Collision with player if (player && !player.invincible && a.intersects(player)) { LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } } // Update and remove powerups for (var i = powerups.length - 1; i >= 0; i--) { var p = powerups[i]; p.update(); if (p.y > 2732 + 80) { p.destroy(); powerups.splice(i, 1); continue; } // Collision with player if (player && p.intersects(player)) { player.makeInvincible(120); p.destroy(); powerups.splice(i, 1); score += 250; scoreTxt.setText(score); continue; } } // Spawning logic if (LK.ticks % 60 === 0) { spawnEnemy(); } if (LK.ticks % 120 === 0) { spawnAsteroid(); } if (LK.ticks % 600 === 0) { spawnPowerup(); } }; // Start game spawnPlayer();
===================================================================
--- original.js
+++ change.js
@@ -40,9 +40,9 @@
var enemy = self.attachAsset('enemyShip', {
anchorX: 0.5,
anchorY: 0.5
});
- self.speed = 6 + Math.random() * 4;
+ self.speed = 3 + Math.random() * 2;
self.shootCooldown = 60 + Math.floor(Math.random() * 60);
self.radius = enemy.width * 0.5;
self.update = function () {
self.y += self.speed;