User prompt
player dead after enemy bullet hit
User prompt
increase speed of enemy bullet fall
User prompt
increase enemy bullet speed fall
User prompt
enemy can shoot only one bullet
User prompt
make enemy bullet fast fall speed
User prompt
enemy bullet can destroy
User prompt
make enemy bullet can hit
User prompt
fix enemy bullet
User prompt
slow speed enemy bullet fall
User prompt
fix bullet enemy not gone after hit
User prompt
enemy bullet can hit and gone aftter hit
User prompt
enemy dead after 2x hit
User prompt
erase text space invanders
User prompt
player explosion after hit
User prompt
animate enemy red exploded āŖš” Consider importing and using the following plugins: @upit/tween.v1
User prompt
add background asset
User prompt
enemy dead after 3x hit
User prompt
enemy dead after 2x hit
User prompt
enemy multi direction shoot
User prompt
fix text btap to start space invanders
User prompt
make logic player shoot alien vertical upper shooter
Code edit (1 edits merged)
Please save this source code
User prompt
Platform Gunner: Alien Defense
Initial prompt
JavaScript 2D Platformer Game shooting game. player shoot enemy. enemy capable shoot. random platform. game over when enemy got hit player. touchscreen controler button for move left and right. touch controler button A for attack. touch controler S for jump
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Button = Container.expand(function (assetId, callback) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7
});
self.width = buttonGraphics.width;
self.height = buttonGraphics.height;
self.callback = callback;
self.down = function () {
buttonGraphics.alpha = 0.9;
self.isPressed = true;
if (self.callback) {
self.callback();
}
};
self.up = function () {
buttonGraphics.alpha = 0.7;
self.isPressed = false;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = enemyGraphics.width;
self.height = enemyGraphics.height;
self.health = 2; // Enemy needs 2 hits to die
self.movementDirection = Math.random() > 0.5 ? 1 : -1;
self.movementSpeed = 2 + Math.random() * 2;
self.verticalSpeed = 0.5 + Math.random() * 0.5;
self.shootCooldown = 60 + Math.floor(Math.random() * 120);
// Method to create explosion animation
self.explode = function () {
// Stop any movement
self.movementSpeed = 0;
self.verticalSpeed = 0;
// Create explosion animation with tweens
tween(enemyGraphics, {
alpha: 0,
scaleX: 3,
scaleY: 3
}, {
duration: 800,
easing: tween.easeOut
});
// Create red pulsing effect with tint
tween(enemyGraphics, {
tint: 0xff0000
}, {
duration: 300,
easing: tween.linear
});
};
self.update = function () {
// Move horizontally
self.x += self.movementDirection * self.movementSpeed;
// Move vertically (downward)
self.y += self.verticalSpeed;
// Change direction if at screen edge
if (self.x < self.width / 2 || self.x > 2048 - self.width / 2) {
self.movementDirection *= -1;
}
// Maybe shoot
self.shootCooldown--;
if (self.shootCooldown <= 0) {
self.shoot();
self.shootCooldown = 60 + Math.floor(Math.random() * 120);
}
// Check for player collision
if (self.intersects(player)) {
gameOver();
}
// Remove if off bottom of screen
if (self.y > SCREEN_HEIGHT + 100) {
self.destroy();
var index = enemies.indexOf(self);
if (index > -1) {
enemies.splice(index, 1);
}
}
};
self.shoot = function () {
// Check if this enemy already has a bullet active
var hasActiveBullet = false;
for (var i = 0; i < enemyBullets.length; i++) {
if (enemyBullets[i].owner === self) {
hasActiveBullet = true;
break;
}
}
// Only shoot if no active bullet
if (!hasActiveBullet) {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + self.height / 2;
bullet.owner = self; // Mark which enemy shot this bullet
game.addChild(bullet);
enemyBullets.push(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.width = bulletGraphics.width;
self.height = bulletGraphics.height;
self.speed = 12; // Increased speed for faster falling bullets
self.update = function () {
self.y += self.speed;
// Remove if off screen
if (self.y > 2732 + 50) {
self.destroy();
var index = enemyBullets.indexOf(self);
if (index > -1) {
enemyBullets.splice(index, 1);
}
}
// Check for player collision
if (player && self.intersects(player)) {
// Remove bullet
self.destroy();
var index = enemyBullets.indexOf(self);
if (index > -1) {
enemyBullets.splice(index, 1);
}
// End game
gameOver();
}
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = platformGraphics.width;
self.height = platformGraphics.height;
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = playerGraphics.width;
self.height = playerGraphics.height;
self.velocityY = 0;
self.velocityX = 0;
self.isJumping = false;
self.facingRight = true;
self.shootCooldown = 0;
self.speed = 8;
self.explode = function () {
// Stop any movement
self.velocityX = 0;
self.velocityY = 0;
// Create explosion animation with tweens
tween(playerGraphics, {
alpha: 0,
scaleX: 3,
scaleY: 3
}, {
duration: 800,
easing: tween.easeOut
});
// Create red pulsing effect
tween(playerGraphics, {
tint: 0xff0000
}, {
duration: 300,
easing: tween.linear
});
};
self.jump = function () {
if (!self.isJumping) {
self.velocityY = -20;
self.isJumping = true;
LK.getSound('jump').play();
}
};
self.shoot = function () {
if (self.shootCooldown <= 0) {
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - self.height / 2;
bullet.direction = 0; // Direction 0 means upward
game.addChild(bullet);
playerBullets.push(bullet);
self.shootCooldown = 15;
LK.getSound('shoot').play();
}
};
self.update = function () {
// Apply direct movement instead of physics
self.x += self.velocityX;
// Decrease shoot cooldown
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
// Boundary checks
if (self.x < self.width / 2) {
self.x = self.width / 2;
}
if (self.x > 2048 - self.width / 2) {
self.x = 2048 - self.width / 2;
}
// Bottom boundary check for player
if (self.y < SCREEN_HEIGHT - 300) {
self.y = self.y;
} else if (self.y > SCREEN_HEIGHT - 150) {
self.y = SCREEN_HEIGHT - 150;
}
// Update facing direction based on velocity
if (self.velocityX > 0) {
self.facingRight = true;
} else if (self.velocityX < 0) {
self.facingRight = false;
}
// Flip player graphic based on direction
if (self.facingRight) {
playerGraphics.scaleX = 1;
} else {
playerGraphics.scaleX = -1;
}
};
self.checkPlatformCollisions = function () {
var wasOnPlatform = false;
for (var i = 0; i < platforms.length; i++) {
var platform = platforms[i];
// Only check for collision if falling
if (self.velocityY > 0) {
var playerBottom = self.y + self.height / 2;
var platformTop = platform.y - platform.height / 2;
// If player's bottom is at or slightly below platform top
if (Math.abs(playerBottom - platformTop) < 20) {
// And player is horizontally within platform bounds
if (self.x + self.width / 2 > platform.x - platform.width / 2 && self.x - self.width / 2 < platform.x + platform.width / 2) {
// Land on platform
self.y = platformTop - self.height / 2;
self.velocityY = 0;
self.isJumping = false;
wasOnPlatform = true;
}
}
}
}
if (!wasOnPlatform && !self.isJumping && self.velocityY === 0) {
self.isJumping = true;
}
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = bulletGraphics.width;
self.height = bulletGraphics.height;
self.direction = 1; // 1 for right, -1 for left
self.speed = 20;
self.update = function () {
// If direction is 0, move upward, otherwise use horizontal movement
if (self.direction === 0) {
self.y -= self.speed;
} else {
self.x += self.speed * self.direction;
}
// Remove if off screen
if (self.x < -50 || self.x > 2048 + 50 || self.y < -50) {
self.destroy();
var index = playerBullets.indexOf(self);
if (index > -1) {
playerBullets.splice(index, 1);
}
}
// Check for enemy collisions
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (self.intersects(enemy)) {
// Remove bullet
self.destroy();
var bulletIndex = playerBullets.indexOf(self);
if (bulletIndex > -1) {
playerBullets.splice(bulletIndex, 1);
}
// Reduce enemy health
enemy.health -= 1;
// Flash enemy to show damage - different color based on remaining health
if (enemy.health == 1) {
LK.effects.flashObject(enemy, 0xff9900, 300); // Orange flash for 1 health remaining
} else {
LK.effects.flashObject(enemy, 0xff0000, 300); // Red flash for other cases
}
// Play hit sound
LK.getSound('enemyHit').play();
// Check if enemy is dead
if (enemy.health <= 0) {
// Play explosion animation
enemy.explode();
// Remove enemy after animation completes
LK.setTimeout(function () {
enemy.destroy();
var enemyIndex = enemies.indexOf(enemy);
if (enemyIndex > -1) {
enemies.splice(enemyIndex, 1);
}
}, 800);
// Increase score
LK.setScore(LK.getScore() + 10);
scoreTxt.setText(LK.getScore());
}
break;
}
}
// Check for enemy bullet collisions
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var enemyBullet = enemyBullets[i];
if (self.intersects(enemyBullet)) {
// Remove enemy bullet
enemyBullet.destroy();
var enemyBulletIndex = enemyBullets.indexOf(enemyBullet);
if (enemyBulletIndex > -1) {
enemyBullets.splice(enemyBulletIndex, 1);
}
// Remove player bullet
self.destroy();
var playerBulletIndex = playerBullets.indexOf(self);
if (playerBulletIndex > -1) {
playerBullets.splice(playerBulletIndex, 1);
}
// Flash effect for bullet collision
LK.effects.flashObject(enemyBullet, 0xffff00, 100);
// Increase score slightly
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
break;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Constants
var GRAVITY = 0.8;
var SCREEN_WIDTH = 2048;
var SCREEN_HEIGHT = 2732;
var PLATFORM_COUNT = 8;
var MAX_ENEMIES = 6;
// Game variables
var player;
var platforms = [];
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var gameStarted = false;
var spawnTimer = 0;
var jumpButton, shootButton, moveLeftButton, moveRightButton;
var scoreTxt;
function initGame() {
// Add background
var background = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(background);
// Add score display
scoreTxt = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(scoreTxt);
scoreTxt.x = -20;
scoreTxt.y = 20;
// Create player
player = new Player();
player.x = SCREEN_WIDTH / 2;
player.y = SCREEN_HEIGHT - 200; // Position at bottom of screen
game.addChild(player);
// Create initial platforms
generatePlatforms();
// Create UI controls
createControls();
// Start game music
LK.playMusic('gameMusic');
// Remove start screen text
if (startText && startText.parent) {
startText.parent.removeChild(startText);
}
if (instructionsText && instructionsText.parent) {
instructionsText.parent.removeChild(instructionsText);
}
// Set game as started
gameStarted = true;
}
function generatePlatforms() {
// No platforms needed for vertical shooter
}
function createControls() {
// Shoot button
shootButton = new Button('shootButton', function () {
player.shoot();
});
shootButton.x = SCREEN_WIDTH - 200;
shootButton.y = SCREEN_HEIGHT - 200;
game.addChild(shootButton);
// Move left button
moveLeftButton = new Button('moveLeftButton');
moveLeftButton.x = 200;
moveLeftButton.y = SCREEN_HEIGHT - 200;
game.addChild(moveLeftButton);
// Move right button
moveRightButton = new Button('moveRightButton');
moveRightButton.x = 400;
moveRightButton.y = SCREEN_HEIGHT - 200;
game.addChild(moveRightButton);
}
function spawnEnemy() {
if (enemies.length < MAX_ENEMIES) {
var enemy = new Enemy();
enemy.x = Math.random() * (SCREEN_WIDTH - 200) + 100;
enemy.y = 100;
game.addChild(enemy);
enemies.push(enemy);
}
}
function gameOver() {
LK.getSound('playerHit').play();
LK.effects.flashScreen(0xff0000, 500);
// Trigger player explosion animation
player.explode();
// Delay the game over screen to let explosion animation play
LK.setTimeout(function () {
LK.showGameOver();
}, 800);
}
function handleMove(x, y, obj) {
// We don't need to handle move events for this game
}
function handleDown(x, y, obj) {
// Start the game on first touch if not started
if (!gameStarted) {
initGame();
return;
}
}
function handleUp(x, y, obj) {
// We'll handle button releases in their own event handlers
}
// Game event handlers
game.move = handleMove;
game.down = handleDown;
game.up = handleUp;
// Main game update loop
game.update = function () {
if (!gameStarted) {
return;
}
// Handle player movement from buttons
if (moveLeftButton.isPressed) {
player.velocityX = -player.speed;
} else if (moveRightButton.isPressed) {
player.velocityX = player.speed;
} else {
player.velocityX = 0;
}
// Update player
player.update();
// Update player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
playerBullets[i].update();
}
// Update enemies
for (var i = 0; i < enemies.length; i++) {
enemies[i].update();
}
// Update enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
enemyBullets[i].update();
}
// Spawn enemies
spawnTimer++;
if (spawnTimer >= 120) {
// Every 2 seconds
spawnEnemy();
spawnTimer = 0;
}
// No screen boundary game over for vertical shooter
};
// Start screen message
var startText = new Text2('Tap to Start', {
size: 70,
fill: 0xFFFFFF
});
startText.anchor.set(0.5, 0.5);
startText.x = SCREEN_WIDTH / 2;
startText.y = SCREEN_HEIGHT / 2;
game.addChild(startText);
// Instructions
var instructionsText = new Text2('Use left/right buttons to move\nTap Shoot to fire at enemies from above', {
size: 40,
fill: 0xCCCCCC
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = SCREEN_WIDTH / 2;
instructionsText.y = SCREEN_HEIGHT / 2 + 200;
game.addChild(instructionsText);
; ===================================================================
--- original.js
+++ change.js
@@ -132,9 +132,19 @@
if (index > -1) {
enemyBullets.splice(index, 1);
}
}
- // This was a duplicate check, removed for clarity
+ // Check for player collision
+ if (player && self.intersects(player)) {
+ // Remove bullet
+ self.destroy();
+ var index = enemyBullets.indexOf(self);
+ if (index > -1) {
+ enemyBullets.splice(index, 1);
+ }
+ // End game
+ gameOver();
+ }
};
return self;
});
var Platform = Container.expand(function () {