/**** * 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); } };
===================================================================
--- original.js
+++ change.js
@@ -146,13 +146,45 @@
});
// Powerup
var Powerup = Container.expand(function () {
var self = Container.call(this);
- var asset = self.attachAsset('powerup', {
+ // 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
});
- self.type = 1; // 1: power, 2: shield
+ // 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;
@@ -167,15 +199,15 @@
/****
* Game Code
****/
-// Music
-// Sounds
-// Powerup
-// Bullets
-// Enemy types
-// Ship (player)
// Game state variables
+// Ship (player)
+// Enemy types
+// Bullets
+// Powerup
+// Sounds
+// Music
var player = null;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
@@ -189,8 +221,20 @@
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', {
@@ -299,23 +343,44 @@
function spawnPowerup() {
var p = new Powerup();
p.x = 200 + Math.random() * (2048 - 400);
p.y = -60;
- // Evolve powerup type
- if (level >= 5 && Math.random() < 0.5) {
- p.type = 2; // shield
+ // 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 {
- p.type = 1; // power
+ // 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--;
- if (LK.ticks % 6 === 0) firePlayerBullets();
+ // 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) {
@@ -325,8 +390,35 @@
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();
@@ -356,9 +448,16 @@
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var e = enemies[i];
- e.update();
+ // 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;
@@ -383,16 +482,29 @@
}
// Update enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var eb = enemyBullets[i];
- eb.update();
+ // 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
@@ -416,8 +528,9 @@
}
// 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) {
@@ -427,8 +540,61 @@
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);
}
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