/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Enemy var Enemy = Container.expand(function () { var self = Container.call(this); self.type = 1; // 1,2,3 self.hp = 1; self.shootTimer = 0; self.pattern = 0; // 0: straight, 1: sine, 2: zigzag self.baseX = 0; self.baseY = 0; self.t = 0; self.speed = 4; self.scoreValue = 10; self.asset = null; self.init = function (type, pattern) { self.type = type; self.pattern = pattern; if (type === 1) { self.asset = self.attachAsset('enemy1', { anchorX: 0.5, anchorY: 0.5 }); self.hp = 1; self.scoreValue = 10; } else if (type === 2) { self.asset = self.attachAsset('enemy2', { anchorX: 0.5, anchorY: 0.5 }); self.hp = 2; self.scoreValue = 20; } else if (type === 3) { self.asset = self.attachAsset('enemy3', { anchorX: 0.5, anchorY: 0.5 }); self.hp = 3; self.scoreValue = 40; } self.width = self.asset.width; self.height = self.asset.height; self.baseX = self.x; self.baseY = self.y; self.t = 0; self.shootTimer = 0; self.speed = 4 + type; }; self.update = function () { self.t += 1; // Movement patterns if (self.pattern === 0) { // Straight down self.y += self.speed; } else if (self.pattern === 1) { // Sine wave self.y += self.speed; self.x = self.baseX + Math.sin(self.t / 20) * 180; } else if (self.pattern === 2) { // Zigzag self.y += self.speed; self.x = self.baseX + (self.t % 60 < 30 ? -80 : 80); } }; // Flash when hit self.flash = function () { tween(self.asset, { tint: 0xffffff }, { duration: 80, onFinish: function onFinish() { tween(self.asset, { tint: self.type === 1 ? 0xff3b3b : self.type === 2 ? 0xffe14d : 0x7bff7b }, { duration: 120 }); } }); }; 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.dx = 0; self.dy = 1; self.update = function () { self.x += self.dx * self.speed; self.y += self.dy * self.speed; }; 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; }); // Player Ship var PlayerShip = Container.expand(function () { var self = Container.call(this); var ship = self.attachAsset('playerShip', { anchorX: 0.5, anchorY: 0.5 }); self.width = ship.width; self.height = ship.height; self.speed = 22; self.shootCooldown = 0; self.powerLevel = 1; // 1: single, 2: double, 3: triple self.invincible = 0; // frames left of invincibility // Flash when hit self.flash = function () { tween(ship, { tint: 0xffff00 }, { duration: 100, onFinish: function onFinish() { tween(ship, { tint: 0x33c1ff }, { duration: 200 }); } }); }; return self; }); // Powerup var Powerup = Container.expand(function () { var self = Container.call(this); // 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi self.type = 1; self.asset = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); // Color tint for each powerup type for visual feedback var tints = [0xffffff, // fallback 0x33c1ff, // 1: power (blue) 0xffe14d, // 2: shield (yellow) 0x7bff7b, // 3: rapid (green) 0xff3b3b, // 4: slowmo (red) 0xff7bf7, // 5: bomb (pink) 0x7b7bff, // 6: score (purple) 0x00ffff, // 7: shrink (cyan) 0xffa500, // 8: expand (orange) 0x00ff00, // 9: reflect (lime) 0xffffff // 10: multi (white) ]; self.setType = function (type) { self.type = type; if (type >= 1 && type <= 10) { self.asset.tint = tints[type]; } else { self.asset.tint = 0xffffff; } }; self.update = function () { self.y += 10; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Game state variables // Ship (player) // Enemy types // Bullets // Powerup // Sounds // Music var player = null; var playerBullets = []; var enemies = []; var enemyBullets = []; var powerups = []; var dragNode = null; var lastMoveX = 0; var lastMoveY = 0; var scoreTxt = null; var level = 1; var waveTimer = 0; var nextPowerupScore = 30; var gameOver = false; var lastIntersecting = false; var invincibleTimer = 0; // Powerup effect timers // On player // rapidFire: frames left of rapid fire // shrink: frames left of shrink // expand: frames left of expand // reflect: frames left of reflect PlayerShip.prototype.rapidFire = 0; PlayerShip.prototype.shrink = 0; PlayerShip.prototype.expand = 0; PlayerShip.prototype.reflect = 0; // On game game.slowmo = 0; // Set background color game.setBackgroundColor(0x0a0a1a); // Score display scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Initialize player player = new PlayerShip(); player.x = 2048 / 2; player.y = 2732 - 200; game.addChild(player); // Start music LK.playMusic('bgmusic'); // Touch controls game.down = function (x, y, obj) { // Only allow drag if touch is on lower 1/3 of screen if (y > 2732 * 0.6) { dragNode = player; lastMoveX = x; lastMoveY = y; } }; game.up = function (x, y, obj) { dragNode = null; }; function handleMove(x, y, obj) { if (dragNode === player) { // Clamp to screen var minX = player.width / 2 + 20; var maxX = 2048 - player.width / 2 - 20; var minY = 2732 * 0.6; var maxY = 2732 - player.height / 2 - 20; player.x = Math.max(minX, Math.min(maxX, x)); player.y = Math.max(minY, Math.min(maxY, y)); } } game.move = handleMove; // Fire player bullets function firePlayerBullets() { if (player.shootCooldown > 0) return; var b; if (player.powerLevel === 1) { b = new PlayerBullet(); b.x = player.x; b.y = player.y - player.height / 2 - 10; playerBullets.push(b); game.addChild(b); } else if (player.powerLevel === 2) { b = new PlayerBullet(); b.x = player.x - 32; b.y = player.y - player.height / 2 - 10; playerBullets.push(b); game.addChild(b); b = new PlayerBullet(); b.x = player.x + 32; b.y = player.y - player.height / 2 - 10; playerBullets.push(b); game.addChild(b); } else if (player.powerLevel >= 3) { b = new PlayerBullet(); b.x = player.x; b.y = player.y - player.height / 2 - 10; playerBullets.push(b); game.addChild(b); b = new PlayerBullet(); b.x = player.x - 48; b.y = player.y - player.height / 2 - 10; playerBullets.push(b); game.addChild(b); b = new PlayerBullet(); b.x = player.x + 48; b.y = player.y - player.height / 2 - 10; playerBullets.push(b); game.addChild(b); } LK.getSound('shoot').play(); player.shootCooldown = 10; // frames } // Spawn enemy wave function spawnWave() { var n = 4 + Math.floor(level * 0.7); var margin = 180; var spacing = (2048 - margin * 2) / (n - 1); var y0 = -100; for (var i = 0; i < n; i++) { var e = new Enemy(); // Evolve enemy types and patterns as level increases var type = 1; var pattern = 0; if (level >= 3 && Math.random() < 0.4) type = 2; if (level >= 7 && Math.random() < 0.25) type = 3; if (level >= 2 && Math.random() < 0.3) pattern = 1; if (level >= 5 && Math.random() < 0.2) pattern = 2; e.init(type, pattern); e.x = margin + i * spacing; e.y = y0 - Math.random() * 120; e.baseX = e.x; e.baseY = e.y; enemies.push(e); game.addChild(e); } } // Spawn powerup function spawnPowerup() { var p = new Powerup(); p.x = 200 + Math.random() * (2048 - 400); p.y = -60; // Randomly assign one of 10 powerup types, weighted for early game var type = 1; if (level < 3) { // Early: mostly power/shield type = Math.random() < 0.7 ? 1 : 2; } else if (level < 6) { // Add rapid, slowmo, bomb var r = Math.random(); if (r < 0.4) type = 1;else if (r < 0.6) type = 2;else if (r < 0.75) type = 3;else if (r < 0.9) type = 4;else type = 5; } else { // All types possible type = 1 + Math.floor(Math.random() * 10); } if (typeof p.setType === "function") { p.setType(type); } else { p.type = type; } powerups.push(p); game.addChild(p); } // Main update loop game.update = function () { if (gameOver) return; // Player shooting if (player.shootCooldown > 0) player.shootCooldown--; // Rapid fire powerup if (player.rapidFire > 0) { player.rapidFire--; if (LK.ticks % 3 === 0) firePlayerBullets(); if (player.rapidFire === 0) { // End rapid fire } } else { if (LK.ticks % 6 === 0) firePlayerBullets(); } // Player invincibility if (player.invincible > 0) { player.invincible--; if (player.invincible === 0) { tween(player, { alpha: 1 }, { duration: 200 }); } } // Shrink/Expand powerup if (player.shrink > 0) { player.shrink--; if (player.shrink === 0) { tween(player, { scaleX: 1, scaleY: 1 }, { duration: 200 }); } } if (player.expand > 0) { player.expand--; if (player.expand === 0) { tween(player, { scaleX: 1, scaleY: 1 }, { duration: 200 }); } } // Slowmo powerup if (game.slowmo > 0) { game.slowmo--; } // Update player bullets for (var i = playerBullets.length - 1; i >= 0; i--) { var b = playerBullets[i]; b.update(); if (b.y < -60) { b.destroy(); playerBullets.splice(i, 1); continue; } // Collision with enemies for (var j = enemies.length - 1; j >= 0; j--) { var e = enemies[j]; if (b.intersects(e)) { e.hp--; e.flash(); if (e.hp <= 0) { LK.setScore(LK.getScore() + e.scoreValue); scoreTxt.setText(LK.getScore()); LK.getSound('explosion').play(); e.destroy(); enemies.splice(j, 1); } b.destroy(); playerBullets.splice(i, 1); break; } } } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; // Slowmo: enemies move slower if (game.slowmo > 0) { if (LK.ticks % 2 === 0) { e.update(); } } else { e.update(); } // Enemy shoots if (level >= 2 && LK.ticks % (60 - Math.min(level * 2, 40)) === 0 && Math.random() < 0.5) { var eb = new EnemyBullet(); eb.x = e.x; eb.y = e.y + e.height / 2 + 10; // Aim at player var dx = player.x - e.x; var dy = player.y - e.y; var len = Math.sqrt(dx * dx + dy * dy); if (len > 0) { eb.dx = dx / len; eb.dy = dy / len; } enemyBullets.push(eb); game.addChild(eb); LK.getSound('enemyShoot').play(); } // Remove if off screen if (e.y > 2732 + 100) { e.destroy(); enemies.splice(i, 1); } } // Update enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var eb = enemyBullets[i]; // Slowmo: bullets move slower if (game.slowmo > 0) { if (LK.ticks % 2 === 0) { eb.update(); } } else { eb.update(); } if (eb.y > 2732 + 60 || eb.x < -60 || eb.x > 2048 + 60) { eb.destroy(); enemyBullets.splice(i, 1); continue; } // Collision with player if (player.invincible === 0 && eb.intersects(player)) { // Reflect powerup: reflect enemy bullets upward if (player.reflect > 0) { eb.dy = -Math.abs(eb.dy); eb.dx = eb.dx; continue; } player.flash(); player.invincible = 60; tween(player, { alpha: 0.5 }, { duration: 100 }); LK.effects.flashScreen(0xff0000, 400); LK.showGameOver(); gameOver = true; return; } } // Update powerups for (var i = powerups.length - 1; i >= 0; i--) { var p = powerups[i]; p.update(); if (p.y > 2732 + 60) { p.destroy(); powerups.splice(i, 1); continue; } // Collision with player if (p.intersects(player)) { LK.getSound('powerup').play(); // 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi if (p.type === 1) { // Power up: increase powerLevel if (player.powerLevel < 3) player.powerLevel++; } else if (p.type === 2) { // Shield: invincibility player.invincible = 180; tween(player, { alpha: 0.5 }, { duration: 100 }); } else if (p.type === 3) { // Rapid fire: reduce shootCooldown for 8 seconds player.rapidFire = 480; // frames } else if (p.type === 4) { // Slowmo: slow all enemies for 6 seconds game.slowmo = 360; } else if (p.type === 5) { // Bomb: destroy all enemies on screen for (var j = enemies.length - 1; j >= 0; j--) { LK.setScore(LK.getScore() + enemies[j].scoreValue); enemies[j].destroy(); enemies.splice(j, 1); } scoreTxt.setText(LK.getScore()); LK.effects.flashScreen(0xffffff, 400); } else if (p.type === 6) { // Score: +100 points LK.setScore(LK.getScore() + 100); scoreTxt.setText(LK.getScore()); } else if (p.type === 7) { // Shrink: shrink player for 10 seconds player.shrink = 600; tween(player, { scaleX: 0.6, scaleY: 0.6 }, { duration: 200 }); } else if (p.type === 8) { // Expand: expand player for 10 seconds player.expand = 600; tween(player, { scaleX: 1.5, scaleY: 1.5 }, { duration: 200 }); } else if (p.type === 9) { // Reflect: reflect enemy bullets for 8 seconds player.reflect = 480; } else if (p.type === 10) { // Multi: all effects for 3 seconds (except bomb/score) player.rapidFire = 180; player.invincible = 180; player.reflect = 180; player.shrink = 180; tween(player, { scaleX: 0.6, scaleY: 0.6 }, { duration: 200 }); game.slowmo = 180; } p.destroy(); powerups.splice(i, 1); } } // Spawn new wave if all enemies gone if (enemies.length === 0 && waveTimer <= 0) { spawnWave(); level++; waveTimer = 60; } if (waveTimer > 0) waveTimer--; // Spawn powerup at score milestones if (LK.getScore() >= nextPowerupScore) { spawnPowerup(); nextPowerupScore += 40 + Math.floor(level * 10); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Enemy
var Enemy = Container.expand(function () {
var self = Container.call(this);
self.type = 1; // 1,2,3
self.hp = 1;
self.shootTimer = 0;
self.pattern = 0; // 0: straight, 1: sine, 2: zigzag
self.baseX = 0;
self.baseY = 0;
self.t = 0;
self.speed = 4;
self.scoreValue = 10;
self.asset = null;
self.init = function (type, pattern) {
self.type = type;
self.pattern = pattern;
if (type === 1) {
self.asset = self.attachAsset('enemy1', {
anchorX: 0.5,
anchorY: 0.5
});
self.hp = 1;
self.scoreValue = 10;
} else if (type === 2) {
self.asset = self.attachAsset('enemy2', {
anchorX: 0.5,
anchorY: 0.5
});
self.hp = 2;
self.scoreValue = 20;
} else if (type === 3) {
self.asset = self.attachAsset('enemy3', {
anchorX: 0.5,
anchorY: 0.5
});
self.hp = 3;
self.scoreValue = 40;
}
self.width = self.asset.width;
self.height = self.asset.height;
self.baseX = self.x;
self.baseY = self.y;
self.t = 0;
self.shootTimer = 0;
self.speed = 4 + type;
};
self.update = function () {
self.t += 1;
// Movement patterns
if (self.pattern === 0) {
// Straight down
self.y += self.speed;
} else if (self.pattern === 1) {
// Sine wave
self.y += self.speed;
self.x = self.baseX + Math.sin(self.t / 20) * 180;
} else if (self.pattern === 2) {
// Zigzag
self.y += self.speed;
self.x = self.baseX + (self.t % 60 < 30 ? -80 : 80);
}
};
// Flash when hit
self.flash = function () {
tween(self.asset, {
tint: 0xffffff
}, {
duration: 80,
onFinish: function onFinish() {
tween(self.asset, {
tint: self.type === 1 ? 0xff3b3b : self.type === 2 ? 0xffe14d : 0x7bff7b
}, {
duration: 120
});
}
});
};
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.dx = 0;
self.dy = 1;
self.update = function () {
self.x += self.dx * self.speed;
self.y += self.dy * self.speed;
};
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;
});
// Player Ship
var PlayerShip = Container.expand(function () {
var self = Container.call(this);
var ship = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = ship.width;
self.height = ship.height;
self.speed = 22;
self.shootCooldown = 0;
self.powerLevel = 1; // 1: single, 2: double, 3: triple
self.invincible = 0; // frames left of invincibility
// Flash when hit
self.flash = function () {
tween(ship, {
tint: 0xffff00
}, {
duration: 100,
onFinish: function onFinish() {
tween(ship, {
tint: 0x33c1ff
}, {
duration: 200
});
}
});
};
return self;
});
// Powerup
var Powerup = Container.expand(function () {
var self = Container.call(this);
// 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi
self.type = 1;
self.asset = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
// Color tint for each powerup type for visual feedback
var tints = [0xffffff,
// fallback
0x33c1ff,
// 1: power (blue)
0xffe14d,
// 2: shield (yellow)
0x7bff7b,
// 3: rapid (green)
0xff3b3b,
// 4: slowmo (red)
0xff7bf7,
// 5: bomb (pink)
0x7b7bff,
// 6: score (purple)
0x00ffff,
// 7: shrink (cyan)
0xffa500,
// 8: expand (orange)
0x00ff00,
// 9: reflect (lime)
0xffffff // 10: multi (white)
];
self.setType = function (type) {
self.type = type;
if (type >= 1 && type <= 10) {
self.asset.tint = tints[type];
} else {
self.asset.tint = 0xffffff;
}
};
self.update = function () {
self.y += 10;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game state variables
// Ship (player)
// Enemy types
// Bullets
// Powerup
// Sounds
// Music
var player = null;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerups = [];
var dragNode = null;
var lastMoveX = 0;
var lastMoveY = 0;
var scoreTxt = null;
var level = 1;
var waveTimer = 0;
var nextPowerupScore = 30;
var gameOver = false;
var lastIntersecting = false;
var invincibleTimer = 0;
// Powerup effect timers
// On player
// rapidFire: frames left of rapid fire
// shrink: frames left of shrink
// expand: frames left of expand
// reflect: frames left of reflect
PlayerShip.prototype.rapidFire = 0;
PlayerShip.prototype.shrink = 0;
PlayerShip.prototype.expand = 0;
PlayerShip.prototype.reflect = 0;
// On game
game.slowmo = 0;
// Set background color
game.setBackgroundColor(0x0a0a1a);
// Score display
scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Initialize player
player = new PlayerShip();
player.x = 2048 / 2;
player.y = 2732 - 200;
game.addChild(player);
// Start music
LK.playMusic('bgmusic');
// Touch controls
game.down = function (x, y, obj) {
// Only allow drag if touch is on lower 1/3 of screen
if (y > 2732 * 0.6) {
dragNode = player;
lastMoveX = x;
lastMoveY = y;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
function handleMove(x, y, obj) {
if (dragNode === player) {
// Clamp to screen
var minX = player.width / 2 + 20;
var maxX = 2048 - player.width / 2 - 20;
var minY = 2732 * 0.6;
var maxY = 2732 - player.height / 2 - 20;
player.x = Math.max(minX, Math.min(maxX, x));
player.y = Math.max(minY, Math.min(maxY, y));
}
}
game.move = handleMove;
// Fire player bullets
function firePlayerBullets() {
if (player.shootCooldown > 0) return;
var b;
if (player.powerLevel === 1) {
b = new PlayerBullet();
b.x = player.x;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
} else if (player.powerLevel === 2) {
b = new PlayerBullet();
b.x = player.x - 32;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
b = new PlayerBullet();
b.x = player.x + 32;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
} else if (player.powerLevel >= 3) {
b = new PlayerBullet();
b.x = player.x;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
b = new PlayerBullet();
b.x = player.x - 48;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
b = new PlayerBullet();
b.x = player.x + 48;
b.y = player.y - player.height / 2 - 10;
playerBullets.push(b);
game.addChild(b);
}
LK.getSound('shoot').play();
player.shootCooldown = 10; // frames
}
// Spawn enemy wave
function spawnWave() {
var n = 4 + Math.floor(level * 0.7);
var margin = 180;
var spacing = (2048 - margin * 2) / (n - 1);
var y0 = -100;
for (var i = 0; i < n; i++) {
var e = new Enemy();
// Evolve enemy types and patterns as level increases
var type = 1;
var pattern = 0;
if (level >= 3 && Math.random() < 0.4) type = 2;
if (level >= 7 && Math.random() < 0.25) type = 3;
if (level >= 2 && Math.random() < 0.3) pattern = 1;
if (level >= 5 && Math.random() < 0.2) pattern = 2;
e.init(type, pattern);
e.x = margin + i * spacing;
e.y = y0 - Math.random() * 120;
e.baseX = e.x;
e.baseY = e.y;
enemies.push(e);
game.addChild(e);
}
}
// Spawn powerup
function spawnPowerup() {
var p = new Powerup();
p.x = 200 + Math.random() * (2048 - 400);
p.y = -60;
// Randomly assign one of 10 powerup types, weighted for early game
var type = 1;
if (level < 3) {
// Early: mostly power/shield
type = Math.random() < 0.7 ? 1 : 2;
} else if (level < 6) {
// Add rapid, slowmo, bomb
var r = Math.random();
if (r < 0.4) type = 1;else if (r < 0.6) type = 2;else if (r < 0.75) type = 3;else if (r < 0.9) type = 4;else type = 5;
} else {
// All types possible
type = 1 + Math.floor(Math.random() * 10);
}
if (typeof p.setType === "function") {
p.setType(type);
} else {
p.type = type;
}
powerups.push(p);
game.addChild(p);
}
// Main update loop
game.update = function () {
if (gameOver) return;
// Player shooting
if (player.shootCooldown > 0) player.shootCooldown--;
// Rapid fire powerup
if (player.rapidFire > 0) {
player.rapidFire--;
if (LK.ticks % 3 === 0) firePlayerBullets();
if (player.rapidFire === 0) {
// End rapid fire
}
} else {
if (LK.ticks % 6 === 0) firePlayerBullets();
}
// Player invincibility
if (player.invincible > 0) {
player.invincible--;
if (player.invincible === 0) {
tween(player, {
alpha: 1
}, {
duration: 200
});
}
}
// Shrink/Expand powerup
if (player.shrink > 0) {
player.shrink--;
if (player.shrink === 0) {
tween(player, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
}
if (player.expand > 0) {
player.expand--;
if (player.expand === 0) {
tween(player, {
scaleX: 1,
scaleY: 1
}, {
duration: 200
});
}
}
// Slowmo powerup
if (game.slowmo > 0) {
game.slowmo--;
}
// Update player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var b = playerBullets[i];
b.update();
if (b.y < -60) {
b.destroy();
playerBullets.splice(i, 1);
continue;
}
// Collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var e = enemies[j];
if (b.intersects(e)) {
e.hp--;
e.flash();
if (e.hp <= 0) {
LK.setScore(LK.getScore() + e.scoreValue);
scoreTxt.setText(LK.getScore());
LK.getSound('explosion').play();
e.destroy();
enemies.splice(j, 1);
}
b.destroy();
playerBullets.splice(i, 1);
break;
}
}
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var e = enemies[i];
// Slowmo: enemies move slower
if (game.slowmo > 0) {
if (LK.ticks % 2 === 0) {
e.update();
}
} else {
e.update();
}
// Enemy shoots
if (level >= 2 && LK.ticks % (60 - Math.min(level * 2, 40)) === 0 && Math.random() < 0.5) {
var eb = new EnemyBullet();
eb.x = e.x;
eb.y = e.y + e.height / 2 + 10;
// Aim at player
var dx = player.x - e.x;
var dy = player.y - e.y;
var len = Math.sqrt(dx * dx + dy * dy);
if (len > 0) {
eb.dx = dx / len;
eb.dy = dy / len;
}
enemyBullets.push(eb);
game.addChild(eb);
LK.getSound('enemyShoot').play();
}
// Remove if off screen
if (e.y > 2732 + 100) {
e.destroy();
enemies.splice(i, 1);
}
}
// Update enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var eb = enemyBullets[i];
// Slowmo: bullets move slower
if (game.slowmo > 0) {
if (LK.ticks % 2 === 0) {
eb.update();
}
} else {
eb.update();
}
if (eb.y > 2732 + 60 || eb.x < -60 || eb.x > 2048 + 60) {
eb.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Collision with player
if (player.invincible === 0 && eb.intersects(player)) {
// Reflect powerup: reflect enemy bullets upward
if (player.reflect > 0) {
eb.dy = -Math.abs(eb.dy);
eb.dx = eb.dx;
continue;
}
player.flash();
player.invincible = 60;
tween(player, {
alpha: 0.5
}, {
duration: 100
});
LK.effects.flashScreen(0xff0000, 400);
LK.showGameOver();
gameOver = true;
return;
}
}
// Update powerups
for (var i = powerups.length - 1; i >= 0; i--) {
var p = powerups[i];
p.update();
if (p.y > 2732 + 60) {
p.destroy();
powerups.splice(i, 1);
continue;
}
// Collision with player
if (p.intersects(player)) {
LK.getSound('powerup').play();
// 1: power, 2: shield, 3: rapid, 4: slowmo, 5: bomb, 6: score, 7: shrink, 8: expand, 9: reflect, 10: multi
if (p.type === 1) {
// Power up: increase powerLevel
if (player.powerLevel < 3) player.powerLevel++;
} else if (p.type === 2) {
// Shield: invincibility
player.invincible = 180;
tween(player, {
alpha: 0.5
}, {
duration: 100
});
} else if (p.type === 3) {
// Rapid fire: reduce shootCooldown for 8 seconds
player.rapidFire = 480; // frames
} else if (p.type === 4) {
// Slowmo: slow all enemies for 6 seconds
game.slowmo = 360;
} else if (p.type === 5) {
// Bomb: destroy all enemies on screen
for (var j = enemies.length - 1; j >= 0; j--) {
LK.setScore(LK.getScore() + enemies[j].scoreValue);
enemies[j].destroy();
enemies.splice(j, 1);
}
scoreTxt.setText(LK.getScore());
LK.effects.flashScreen(0xffffff, 400);
} else if (p.type === 6) {
// Score: +100 points
LK.setScore(LK.getScore() + 100);
scoreTxt.setText(LK.getScore());
} else if (p.type === 7) {
// Shrink: shrink player for 10 seconds
player.shrink = 600;
tween(player, {
scaleX: 0.6,
scaleY: 0.6
}, {
duration: 200
});
} else if (p.type === 8) {
// Expand: expand player for 10 seconds
player.expand = 600;
tween(player, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 200
});
} else if (p.type === 9) {
// Reflect: reflect enemy bullets for 8 seconds
player.reflect = 480;
} else if (p.type === 10) {
// Multi: all effects for 3 seconds (except bomb/score)
player.rapidFire = 180;
player.invincible = 180;
player.reflect = 180;
player.shrink = 180;
tween(player, {
scaleX: 0.6,
scaleY: 0.6
}, {
duration: 200
});
game.slowmo = 180;
}
p.destroy();
powerups.splice(i, 1);
}
}
// Spawn new wave if all enemies gone
if (enemies.length === 0 && waveTimer <= 0) {
spawnWave();
level++;
waveTimer = 60;
}
if (waveTimer > 0) waveTimer--;
// Spawn powerup at score milestones
if (LK.getScore() >= nextPowerupScore) {
spawnPowerup();
nextPowerupScore += 40 + Math.floor(level * 10);
}
};
Make me a Spacelnvaders InfinityGene EVO character. In-Game asset. 2d. High contrast. No shadows
Make a Spacelnvaders InfinityGene EVO enemy character. In-Game asset. 2d. High contrast. No shadows
Make this blue and green
Make this red and purple
Bana uzay gemisinin mermisini 2d pixel çiz. In-Game asset. 2d. High contrast. No shadows