User prompt
Make it draggable
User prompt
After 3 wave we win
User prompt
We have 3 lives
User prompt
Make the powerups a star
User prompt
Make so that powerups have 2 choice "more bullets" and"more fire rate"
Code edit (1 edits merged)
Please save this source code
User prompt
Stellar Assault
Initial prompt
space shooter
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy1', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.health = 1;
self.shootTimer = 0;
self.shootDelay = Math.random() * 120 + 60;
self.update = function () {
self.y += self.speed;
self.shootTimer++;
if (self.shootTimer >= self.shootDelay) {
self.shootTimer = 0;
self.shootDelay = Math.random() * 120 + 60;
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
bullet.lastY = bullet.y;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.fireRate = 15;
self.fireTimer = 0;
self.rapidFire = false;
self.rapidFireTimer = 0;
self.update = function () {
self.fireTimer++;
var currentFireRate = self.rapidFire ? 5 : self.fireRate;
if (self.fireTimer >= currentFireRate) {
self.fireTimer = 0;
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 50;
bullet.lastY = bullet.y;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
if (self.rapidFire) {
self.rapidFireTimer--;
if (self.rapidFireTimer <= 0) {
self.rapidFire = false;
}
}
};
self.activateRapidFire = function () {
self.rapidFire = true;
self.rapidFireTimer = 300;
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -12;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.type = 'rapidFire';
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000011
});
/****
* Game Code
****/
var player;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerups = [];
var waveTimer = 0;
var difficultyLevel = 1;
var enemySpawnRate = 180;
var scoreTxt = new Text2('0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var levelTxt = new Text2('Wave 1', {
size: 40,
fill: 0x00FF00
});
levelTxt.anchor.set(0, 0);
levelTxt.x = 20;
levelTxt.y = 20;
LK.gui.topLeft.addChild(levelTxt);
player = game.addChild(new Player());
player.x = 1024;
player.y = 2500;
var dragNode = null;
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = Math.max(40, Math.min(2008, x));
dragNode.y = Math.max(100, Math.min(2632, y));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = Math.random() * 1800 + 124;
enemy.y = -30;
enemy.lastY = enemy.y;
enemy.lastIntersecting = false;
enemies.push(enemy);
game.addChild(enemy);
}
function spawnPowerUp(x, y) {
if (Math.random() < 0.3) {
var powerup = new PowerUp();
powerup.x = x;
powerup.y = y;
powerup.lastY = powerup.y;
powerup.lastIntersecting = false;
powerups.push(powerup);
game.addChild(powerup);
}
}
game.update = function () {
waveTimer++;
if (waveTimer % 1800 === 0) {
difficultyLevel++;
enemySpawnRate = Math.max(60, enemySpawnRate - 20);
levelTxt.setText('Wave ' + difficultyLevel);
LK.effects.flashScreen(0x0000ff, 500);
}
if (waveTimer % enemySpawnRate === 0) {
spawnEnemy();
}
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.lastY >= -10 && bullet.y < -10) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
enemy.health--;
if (enemy.health <= 0) {
LK.setScore(LK.getScore() + 100);
scoreTxt.setText(LK.getScore());
LK.getSound('enemyHit').play();
spawnPowerUp(enemy.x, enemy.y);
enemy.destroy();
enemies.splice(j, 1);
}
bullet.destroy();
playerBullets.splice(i, 1);
break;
}
}
bullet.lastY = bullet.y;
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.lastY <= 2742 && bullet.y > 2742) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
if (bullet.intersects(player)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
LK.showGameOver();
return;
}
bullet.lastY = bullet.y;
}
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
if (enemy.lastY <= 2742 && enemy.y > 2742) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
if (enemy.intersects(player)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
LK.showGameOver();
return;
}
enemy.lastY = enemy.y;
}
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
if (powerup.lastY === undefined) powerup.lastY = powerup.y;
if (powerup.lastIntersecting === undefined) powerup.lastIntersecting = false;
if (powerup.lastY <= 2742 && powerup.y > 2742) {
powerup.destroy();
powerups.splice(i, 1);
continue;
}
var currentIntersecting = powerup.intersects(player);
if (!powerup.lastIntersecting && currentIntersecting) {
player.activateRapidFire();
LK.getSound('powerupCollect').play();
LK.effects.flashObject(player, 0x00ffff, 500);
powerup.destroy();
powerups.splice(i, 1);
continue;
}
powerup.lastY = powerup.y;
powerup.lastIntersecting = currentIntersecting;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,271 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy1', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 3;
+ self.health = 1;
+ self.shootTimer = 0;
+ self.shootDelay = Math.random() * 120 + 60;
+ self.update = function () {
+ self.y += self.speed;
+ self.shootTimer++;
+ if (self.shootTimer >= self.shootDelay) {
+ self.shootTimer = 0;
+ self.shootDelay = Math.random() * 120 + 60;
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y + 30;
+ bullet.lastY = bullet.y;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ }
+ };
+ return self;
+});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('enemyBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGraphics = self.attachAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.fireRate = 15;
+ self.fireTimer = 0;
+ self.rapidFire = false;
+ self.rapidFireTimer = 0;
+ self.update = function () {
+ self.fireTimer++;
+ var currentFireRate = self.rapidFire ? 5 : self.fireRate;
+ if (self.fireTimer >= currentFireRate) {
+ self.fireTimer = 0;
+ var bullet = new PlayerBullet();
+ bullet.x = self.x;
+ bullet.y = self.y - 50;
+ bullet.lastY = bullet.y;
+ playerBullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ }
+ if (self.rapidFire) {
+ self.rapidFireTimer--;
+ if (self.rapidFireTimer <= 0) {
+ self.rapidFire = false;
+ }
+ }
+ };
+ self.activateRapidFire = function () {
+ self.rapidFire = true;
+ self.rapidFireTimer = 300;
+ };
+ return self;
+});
+var PlayerBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('playerBullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -12;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var powerupGraphics = self.attachAsset('powerup', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 2;
+ self.type = 'rapidFire';
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += 0.1;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000011
+});
+
+/****
+* Game Code
+****/
+var player;
+var playerBullets = [];
+var enemies = [];
+var enemyBullets = [];
+var powerups = [];
+var waveTimer = 0;
+var difficultyLevel = 1;
+var enemySpawnRate = 180;
+var scoreTxt = new Text2('0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var levelTxt = new Text2('Wave 1', {
+ size: 40,
+ fill: 0x00FF00
+});
+levelTxt.anchor.set(0, 0);
+levelTxt.x = 20;
+levelTxt.y = 20;
+LK.gui.topLeft.addChild(levelTxt);
+player = game.addChild(new Player());
+player.x = 1024;
+player.y = 2500;
+var dragNode = null;
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ dragNode.x = Math.max(40, Math.min(2008, x));
+ dragNode.y = Math.max(100, Math.min(2632, y));
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ dragNode = player;
+ handleMove(x, y, obj);
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+function spawnEnemy() {
+ var enemy = new Enemy();
+ enemy.x = Math.random() * 1800 + 124;
+ enemy.y = -30;
+ enemy.lastY = enemy.y;
+ enemy.lastIntersecting = false;
+ enemies.push(enemy);
+ game.addChild(enemy);
+}
+function spawnPowerUp(x, y) {
+ if (Math.random() < 0.3) {
+ var powerup = new PowerUp();
+ powerup.x = x;
+ powerup.y = y;
+ powerup.lastY = powerup.y;
+ powerup.lastIntersecting = false;
+ powerups.push(powerup);
+ game.addChild(powerup);
+ }
+}
+game.update = function () {
+ waveTimer++;
+ if (waveTimer % 1800 === 0) {
+ difficultyLevel++;
+ enemySpawnRate = Math.max(60, enemySpawnRate - 20);
+ levelTxt.setText('Wave ' + difficultyLevel);
+ LK.effects.flashScreen(0x0000ff, 500);
+ }
+ if (waveTimer % enemySpawnRate === 0) {
+ spawnEnemy();
+ }
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var bullet = playerBullets[i];
+ if (bullet.lastY === undefined) bullet.lastY = bullet.y;
+ if (bullet.lastY >= -10 && bullet.y < -10) {
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ continue;
+ }
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var enemy = enemies[j];
+ if (bullet.intersects(enemy)) {
+ enemy.health--;
+ if (enemy.health <= 0) {
+ LK.setScore(LK.getScore() + 100);
+ scoreTxt.setText(LK.getScore());
+ LK.getSound('enemyHit').play();
+ spawnPowerUp(enemy.x, enemy.y);
+ enemy.destroy();
+ enemies.splice(j, 1);
+ }
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ break;
+ }
+ }
+ bullet.lastY = bullet.y;
+ }
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var bullet = enemyBullets[i];
+ if (bullet.lastY === undefined) bullet.lastY = bullet.y;
+ if (bullet.lastY <= 2742 && bullet.y > 2742) {
+ bullet.destroy();
+ enemyBullets.splice(i, 1);
+ continue;
+ }
+ if (bullet.intersects(player)) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.getSound('playerHit').play();
+ LK.showGameOver();
+ return;
+ }
+ bullet.lastY = bullet.y;
+ }
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ if (enemy.lastY === undefined) enemy.lastY = enemy.y;
+ if (enemy.lastY <= 2742 && enemy.y > 2742) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ continue;
+ }
+ if (enemy.intersects(player)) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.getSound('playerHit').play();
+ LK.showGameOver();
+ return;
+ }
+ enemy.lastY = enemy.y;
+ }
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ var powerup = powerups[i];
+ if (powerup.lastY === undefined) powerup.lastY = powerup.y;
+ if (powerup.lastIntersecting === undefined) powerup.lastIntersecting = false;
+ if (powerup.lastY <= 2742 && powerup.y > 2742) {
+ powerup.destroy();
+ powerups.splice(i, 1);
+ continue;
+ }
+ var currentIntersecting = powerup.intersects(player);
+ if (!powerup.lastIntersecting && currentIntersecting) {
+ player.activateRapidFire();
+ LK.getSound('powerupCollect').play();
+ LK.effects.flashObject(player, 0x00ffff, 500);
+ powerup.destroy();
+ powerups.splice(i, 1);
+ continue;
+ }
+ powerup.lastY = powerup.y;
+ powerup.lastIntersecting = currentIntersecting;
+ }
+};
\ No newline at end of file