User prompt
Let’s make the main ship be controlled by a stick attached to it
User prompt
Remove remove the joystick and make it touch control
User prompt
Increase joystick sensitivity
User prompt
Move the joystick up by eight pixels
User prompt
Make the joystick larger
User prompt
Move the joystick to the right bottom corner
User prompt
Let’s make the ship use a joystick in the bottom left corner of the screen
User prompt
Change the name to space invaders 2.0
User prompt
Let’s make it so that you can see the visible shield around your ship ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Let’s make temporary upgrades for your ship ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Let’s make the ships more realistic, but still 16 bit
Code edit (1 edits merged)
Please save this source code
User prompt
Space Squadron
Initial prompt
It is a game in witch you play as a space ship and have to shoot down other ships
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
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 EnemyShip = Container.expand(function () {
var self = Container.call(this);
// Main body
var shipBody = self.attachAsset('enemyShipBody', {
anchorX: 0.5,
anchorY: 0.5
});
// Wings
var wings = self.attachAsset('enemyShipWings', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -15
});
// Core/cockpit
var core = self.attachAsset('enemyShipCore', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0
});
// Thruster
var thruster = self.attachAsset('enemyShipThruster', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 30
});
self.speed = 3;
self.health = 1;
self.shootTimer = 0;
self.shootInterval = 60 + Math.random() * 120; // Random shooting interval
self.update = function () {
self.y += self.speed;
// Enemy shooting logic
self.shootTimer++;
if (self.shootTimer >= self.shootInterval) {
self.shootTimer = 0;
self.shootInterval = 60 + Math.random() * 120; // Reset with new random interval
// Create enemy bullet
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 40;
bullet.lastY = bullet.y;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
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 PlayerShip = Container.expand(function () {
var self = Container.call(this);
// Main body
var shipBody = self.attachAsset('playerShipBody', {
anchorX: 0.5,
anchorY: 0.5
});
// Wings
var leftWing = self.attachAsset('playerShipWings', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 20
});
// Cockpit
var cockpit = self.attachAsset('playerShipCockpit', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -15
});
// Engine thrusters
var leftEngine = self.attachAsset('playerShipEngines', {
anchorX: 0.5,
anchorY: 0.5,
x: -25,
y: 35
});
var rightEngine = self.attachAsset('playerShipEngines', {
anchorX: 0.5,
anchorY: 0.5,
x: 25,
y: 35
});
self.shootTimer = 0;
self.shootInterval = 15; // Shoot every 15 ticks (4 times per second)
self.update = function () {
// Auto-shooting logic
self.shootTimer++;
var currentShootInterval = playerUpgrades.rapidFire ? Math.floor(self.shootInterval / 2) : self.shootInterval;
if (self.shootTimer >= currentShootInterval) {
self.shootTimer = 0;
if (playerUpgrades.tripleShot) {
// Triple shot
for (var shotIndex = 0; shotIndex < 3; shotIndex++) {
var bullet = new PlayerBullet();
bullet.x = self.x + (shotIndex - 1) * 30; // Spread shots
bullet.y = self.y - 50;
bullet.lastY = bullet.y;
playerBullets.push(bullet);
game.addChild(bullet);
}
} else {
// Single shot
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();
}
};
return self;
});
var Upgrade = Container.expand(function (type) {
var self = Container.call(this);
self.type = type;
self.speed = 4;
var upgradeGraphics = self.attachAsset('upgrade' + type, {
anchorX: 0.5,
anchorY: 0.5
});
// Pulsing animation
tween(upgradeGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(upgradeGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Restart the pulsing animation
if (self.parent) {
tween(upgradeGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: arguments.callee.caller
});
}
}
});
}
});
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000011
});
/****
* Game Code
****/
// Game variables
var playerBullets = [];
var enemyBullets = [];
var enemies = [];
var upgrades = [];
var enemySpawnTimer = 0;
var enemySpawnInterval = 120; // Start with 2 seconds between spawns
var upgradeSpawnTimer = 0;
var upgradeSpawnInterval = 600; // 10 seconds between upgrades
var dragNode = null;
var difficultyTimer = 0;
// Upgrade system
var playerUpgrades = {
rapidFire: false,
rapidFireTimer: 0,
shield: false,
shieldTimer: 0,
tripleShot: false,
tripleShotTimer: 0
};
// Create player ship
var player = game.addChild(new PlayerShip());
player.x = 1024; // Center horizontally
player.y = 2400; // Near bottom of screen
// Create score display
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.setText(LK.getScore());
// Touch/drag controls
function handleMove(x, y, obj) {
if (dragNode) {
// Keep player within screen bounds
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;
};
game.update = function () {
// Update difficulty over time
difficultyTimer++;
if (difficultyTimer % 600 == 0) {
// Every 10 seconds
enemySpawnInterval = Math.max(30, enemySpawnInterval - 10); // Faster spawning, minimum 0.5 seconds
}
// Update upgrade timers
if (playerUpgrades.rapidFire) {
playerUpgrades.rapidFireTimer--;
if (playerUpgrades.rapidFireTimer <= 0) {
playerUpgrades.rapidFire = false;
// Flash effect when upgrade expires
LK.effects.flashObject(player, 0x00ff00, 300);
}
}
if (playerUpgrades.shield) {
playerUpgrades.shieldTimer--;
if (playerUpgrades.shieldTimer <= 0) {
playerUpgrades.shield = false;
player.alpha = 1.0; // Reset transparency
}
}
if (playerUpgrades.tripleShot) {
playerUpgrades.tripleShotTimer--;
if (playerUpgrades.tripleShotTimer <= 0) {
playerUpgrades.tripleShot = false;
// Flash effect when upgrade expires
LK.effects.flashObject(player, 0xff0080, 300);
}
}
// Spawn upgrades
upgradeSpawnTimer++;
if (upgradeSpawnTimer >= upgradeSpawnInterval) {
upgradeSpawnTimer = 0;
var upgradeTypes = ['RapidFire', 'Shield', 'TripleShot'];
var randomType = upgradeTypes[Math.floor(Math.random() * upgradeTypes.length)];
var upgrade = new Upgrade(randomType);
upgrade.x = 100 + Math.random() * 1848;
upgrade.y = -50;
upgrade.lastY = upgrade.y;
upgrades.push(upgrade);
game.addChild(upgrade);
}
// Spawn enemies
enemySpawnTimer++;
if (enemySpawnTimer >= enemySpawnInterval) {
enemySpawnTimer = 0;
var enemy = new EnemyShip();
enemy.x = 100 + Math.random() * 1848; // Random x position within screen
enemy.y = -50; // Start above screen
enemy.lastY = enemy.y;
enemy.speed = 2 + Math.random() * 3 + LK.getScore() / 50; // Increase speed with score
enemies.push(enemy);
game.addChild(enemy);
}
// Update and check player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY >= -25 && bullet.y < -25) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with enemies
var hitEnemy = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Enemy destroyed
LK.setScore(LK.getScore() + 10);
scoreTxt.setText(LK.getScore());
// Visual effect
LK.effects.flashObject(enemy, 0xffffff, 200);
// Clean up
bullet.destroy();
enemy.destroy();
playerBullets.splice(i, 1);
enemies.splice(j, 1);
LK.getSound('enemyDestroy').play();
hitEnemy = true;
break;
}
}
if (!hitEnemy) {
bullet.lastY = bullet.y;
}
}
// Update and check enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY <= 2757 && bullet.y > 2757) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Check collision with player
if (bullet.intersects(player)) {
if (!playerUpgrades.shield) {
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
LK.showGameOver();
return;
} else {
// Shield absorbs the hit
bullet.destroy();
enemyBullets.splice(i, 1);
LK.effects.flashObject(player, 0x0080ff, 200);
continue;
}
}
bullet.lastY = bullet.y;
}
// Update and check upgrades
for (var i = upgrades.length - 1; i >= 0; i--) {
var upgrade = upgrades[i];
if (upgrade.lastY === undefined) upgrade.lastY = upgrade.y;
// Remove upgrades that go off screen
if (upgrade.lastY <= 2757 && upgrade.y > 2757) {
upgrade.destroy();
upgrades.splice(i, 1);
continue;
}
// Check collision with player
if (upgrade.intersects(player)) {
LK.getSound('upgradePickup').play();
if (upgrade.type === 'RapidFire') {
playerUpgrades.rapidFire = true;
playerUpgrades.rapidFireTimer = 600; // 10 seconds
LK.effects.flashObject(player, 0x00ff00, 500);
} else if (upgrade.type === 'Shield') {
playerUpgrades.shield = true;
playerUpgrades.shieldTimer = 600; // 10 seconds
player.alpha = 0.7; // Make player semi-transparent to show shield
LK.effects.flashObject(player, 0x0080ff, 500);
} else if (upgrade.type === 'TripleShot') {
playerUpgrades.tripleShot = true;
playerUpgrades.tripleShotTimer = 600; // 10 seconds
LK.effects.flashObject(player, 0xff0080, 500);
}
upgrade.destroy();
upgrades.splice(i, 1);
continue;
}
upgrade.lastY = upgrade.y;
}
// Update and check enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
// Remove enemies that go off screen
if (enemy.lastY <= 2757 && enemy.y > 2757) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with player
if (enemy.intersects(player)) {
if (!playerUpgrades.shield) {
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
LK.showGameOver();
return;
} else {
// Shield absorbs the hit and destroys the enemy
LK.setScore(LK.getScore() + 5); // Bonus points for shield collision
scoreTxt.setText(LK.getScore());
LK.effects.flashObject(player, 0x0080ff, 200);
enemy.destroy();
enemies.splice(i, 1);
continue;
}
}
enemy.lastY = enemy.y;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -118,22 +118,78 @@
self.shootInterval = 15; // Shoot every 15 ticks (4 times per second)
self.update = function () {
// Auto-shooting logic
self.shootTimer++;
- if (self.shootTimer >= self.shootInterval) {
+ var currentShootInterval = playerUpgrades.rapidFire ? Math.floor(self.shootInterval / 2) : self.shootInterval;
+ if (self.shootTimer >= currentShootInterval) {
self.shootTimer = 0;
- // Create player bullet
- var bullet = new PlayerBullet();
- bullet.x = self.x;
- bullet.y = self.y - 50;
- bullet.lastY = bullet.y;
- playerBullets.push(bullet);
- game.addChild(bullet);
+ if (playerUpgrades.tripleShot) {
+ // Triple shot
+ for (var shotIndex = 0; shotIndex < 3; shotIndex++) {
+ var bullet = new PlayerBullet();
+ bullet.x = self.x + (shotIndex - 1) * 30; // Spread shots
+ bullet.y = self.y - 50;
+ bullet.lastY = bullet.y;
+ playerBullets.push(bullet);
+ game.addChild(bullet);
+ }
+ } else {
+ // Single shot
+ 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();
}
};
return self;
});
+var Upgrade = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type;
+ self.speed = 4;
+ var upgradeGraphics = self.attachAsset('upgrade' + type, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Pulsing animation
+ tween(upgradeGraphics, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 800,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(upgradeGraphics, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 800,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ // Restart the pulsing animation
+ if (self.parent) {
+ tween(upgradeGraphics, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 800,
+ easing: tween.easeInOut,
+ onFinish: arguments.callee.caller
+ });
+ }
+ }
+ });
+ }
+ });
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
/****
* Initialize Game
****/
@@ -147,12 +203,24 @@
// Game variables
var playerBullets = [];
var enemyBullets = [];
var enemies = [];
+var upgrades = [];
var enemySpawnTimer = 0;
var enemySpawnInterval = 120; // Start with 2 seconds between spawns
+var upgradeSpawnTimer = 0;
+var upgradeSpawnInterval = 600; // 10 seconds between upgrades
var dragNode = null;
var difficultyTimer = 0;
+// Upgrade system
+var playerUpgrades = {
+ rapidFire: false,
+ rapidFireTimer: 0,
+ shield: false,
+ shieldTimer: 0,
+ tripleShot: false,
+ tripleShotTimer: 0
+};
// Create player ship
var player = game.addChild(new PlayerShip());
player.x = 1024; // Center horizontally
player.y = 2400; // Near bottom of screen
@@ -186,8 +254,45 @@
if (difficultyTimer % 600 == 0) {
// Every 10 seconds
enemySpawnInterval = Math.max(30, enemySpawnInterval - 10); // Faster spawning, minimum 0.5 seconds
}
+ // Update upgrade timers
+ if (playerUpgrades.rapidFire) {
+ playerUpgrades.rapidFireTimer--;
+ if (playerUpgrades.rapidFireTimer <= 0) {
+ playerUpgrades.rapidFire = false;
+ // Flash effect when upgrade expires
+ LK.effects.flashObject(player, 0x00ff00, 300);
+ }
+ }
+ if (playerUpgrades.shield) {
+ playerUpgrades.shieldTimer--;
+ if (playerUpgrades.shieldTimer <= 0) {
+ playerUpgrades.shield = false;
+ player.alpha = 1.0; // Reset transparency
+ }
+ }
+ if (playerUpgrades.tripleShot) {
+ playerUpgrades.tripleShotTimer--;
+ if (playerUpgrades.tripleShotTimer <= 0) {
+ playerUpgrades.tripleShot = false;
+ // Flash effect when upgrade expires
+ LK.effects.flashObject(player, 0xff0080, 300);
+ }
+ }
+ // Spawn upgrades
+ upgradeSpawnTimer++;
+ if (upgradeSpawnTimer >= upgradeSpawnInterval) {
+ upgradeSpawnTimer = 0;
+ var upgradeTypes = ['RapidFire', 'Shield', 'TripleShot'];
+ var randomType = upgradeTypes[Math.floor(Math.random() * upgradeTypes.length)];
+ var upgrade = new Upgrade(randomType);
+ upgrade.x = 100 + Math.random() * 1848;
+ upgrade.y = -50;
+ upgrade.lastY = upgrade.y;
+ upgrades.push(upgrade);
+ game.addChild(upgrade);
+ }
// Spawn enemies
enemySpawnTimer++;
if (enemySpawnTimer >= enemySpawnInterval) {
enemySpawnTimer = 0;
@@ -244,15 +349,56 @@
continue;
}
// Check collision with player
if (bullet.intersects(player)) {
- LK.effects.flashScreen(0xff0000, 1000);
- LK.getSound('playerHit').play();
- LK.showGameOver();
- return;
+ if (!playerUpgrades.shield) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.getSound('playerHit').play();
+ LK.showGameOver();
+ return;
+ } else {
+ // Shield absorbs the hit
+ bullet.destroy();
+ enemyBullets.splice(i, 1);
+ LK.effects.flashObject(player, 0x0080ff, 200);
+ continue;
+ }
}
bullet.lastY = bullet.y;
}
+ // Update and check upgrades
+ for (var i = upgrades.length - 1; i >= 0; i--) {
+ var upgrade = upgrades[i];
+ if (upgrade.lastY === undefined) upgrade.lastY = upgrade.y;
+ // Remove upgrades that go off screen
+ if (upgrade.lastY <= 2757 && upgrade.y > 2757) {
+ upgrade.destroy();
+ upgrades.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (upgrade.intersects(player)) {
+ LK.getSound('upgradePickup').play();
+ if (upgrade.type === 'RapidFire') {
+ playerUpgrades.rapidFire = true;
+ playerUpgrades.rapidFireTimer = 600; // 10 seconds
+ LK.effects.flashObject(player, 0x00ff00, 500);
+ } else if (upgrade.type === 'Shield') {
+ playerUpgrades.shield = true;
+ playerUpgrades.shieldTimer = 600; // 10 seconds
+ player.alpha = 0.7; // Make player semi-transparent to show shield
+ LK.effects.flashObject(player, 0x0080ff, 500);
+ } else if (upgrade.type === 'TripleShot') {
+ playerUpgrades.tripleShot = true;
+ playerUpgrades.tripleShotTimer = 600; // 10 seconds
+ LK.effects.flashObject(player, 0xff0080, 500);
+ }
+ upgrade.destroy();
+ upgrades.splice(i, 1);
+ continue;
+ }
+ upgrade.lastY = upgrade.y;
+ }
// Update and check enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
@@ -263,12 +409,22 @@
continue;
}
// Check collision with player
if (enemy.intersects(player)) {
- LK.effects.flashScreen(0xff0000, 1000);
- LK.getSound('playerHit').play();
- LK.showGameOver();
- return;
+ if (!playerUpgrades.shield) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.getSound('playerHit').play();
+ LK.showGameOver();
+ return;
+ } else {
+ // Shield absorbs the hit and destroys the enemy
+ LK.setScore(LK.getScore() + 5); // Bonus points for shield collision
+ scoreTxt.setText(LK.getScore());
+ LK.effects.flashObject(player, 0x0080ff, 200);
+ enemy.destroy();
+ enemies.splice(i, 1);
+ continue;
+ }
}
enemy.lastY = enemy.y;
}
};
\ No newline at end of file