/****
* 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 = 6 + Math.random() * 4;
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
@@ -1,6 +1,338 @@
-/****
+/****
+* 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 = 6 + Math.random() * 4;
+ 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: 0x000000
-});
\ No newline at end of file
+ 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();
\ No newline at end of file