User prompt
Make an asset called healthbar, position it above player's head and add code for proper workking of healthbar.
User prompt
The healthbar is not visible, it should be visible above player's head.
User prompt
Reduce the rate of how often they change sides. Also add a healthbar above the player which will take some hits to completely finish.
User prompt
Let's make it so that the enemy ships occasionally move over to the other side of the map and stop grouping together. This will make it easier for the player to actually kill the ships.
User prompt
Make it so that my ship launches bullets from both the left and right side, like duel cannons. Also add a powerup which allows me to spray bullets from all 4 sides that bounce from walls and can pierce through enemies. Also make it so that my ship spins while the powerup is activbe.
User prompt
The dynamic movement is now gone and I just leave the ship behind sometimes wehn I drag my mouse too fast also don't let this line bug out this time: player.moveTween = tween(player, {
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 481 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 481
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 481
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 481
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 481
User prompt
The movemet still looks very laggy and the time to start moving is not instantaneous, so fix that. Add proper dynamic movemnt.\
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 475 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 475
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 475
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 475
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 475
User prompt
After I move mouse to somewhere, the ship takes way too much time to move over to my mouse. This leads to me dying. Make it so that the ship starts moving to the mouse instantaneouly using dynamic movement.
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 481 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 481
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 481
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 481
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 481
User prompt
Make the ship move towards the mouse with dynamic movement all the time.
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'player.moveTween = tween.to(player, {' Line Number: 470 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Enemy properties
self.health = 1;
self.speed = 2;
self.scoreValue = 100;
self.fireRate = 120; // Ticks between shots
self.lastShot = Math.floor(Math.random() * 60); // Randomize initial shot timer
self.movementPattern = Math.floor(Math.random() * 3); // 0: straight, 1: zigzag, 2: circular
self.movementCounter = 0;
self.update = function () {
// Basic downward movement
self.y += self.speed;
// Apply movement pattern
if (self.movementPattern === 1) {
// Zigzag
self.x += Math.sin(self.movementCounter * 0.05) * 3;
self.movementCounter++;
} else if (self.movementPattern === 2) {
// Circular
self.x += Math.sin(self.movementCounter * 0.03) * 4;
self.movementCounter++;
}
};
// Take damage and check if destroyed
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health <= 0) {
return true; // Enemy is destroyed
}
return false;
};
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 = 7; // Moving downward
self.update = function () {
self.y += self.speed;
};
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 = -15; // Moving upward
self.power = 1;
self.direction = 'up'; // up, down, left, right
self.isPiercing = false;
self.isBouncing = false;
self.bounceCount = 0;
self.maxBounces = 3;
self.update = function () {
// Move bullet based on direction
if (self.direction === 'up') {
self.y += self.speed;
// Check for bouncing against top edge
if (self.isBouncing && self.y < 0 && self.bounceCount < self.maxBounces) {
self.direction = 'down';
self.bounceCount++;
}
} else if (self.direction === 'down') {
self.y -= self.speed; // Note: speed is negative, so this is adding a positive value
// Check for bouncing against bottom edge
if (self.isBouncing && self.y > GAME_HEIGHT && self.bounceCount < self.maxBounces) {
self.direction = 'up';
self.bounceCount++;
}
} else if (self.direction === 'left') {
self.x += self.speed;
// Check for bouncing against left edge
if (self.isBouncing && self.x < 0 && self.bounceCount < self.maxBounces) {
self.direction = 'right';
self.bounceCount++;
}
} else if (self.direction === 'right') {
self.x -= self.speed; // Note: speed is negative, so this is adding a positive value
// Check for bouncing against right edge
if (self.isBouncing && self.x > GAME_WIDTH && self.bounceCount < self.maxBounces) {
self.direction = 'left';
self.bounceCount++;
}
}
};
return self;
});
var PlayerShip = Container.expand(function () {
var self = Container.call(this);
// Visual representation
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
// Shield visual (initially invisible)
var shieldGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
// Player properties
self.speed = 10;
self.fireRate = 20; // Ticks between shots
self.lastShot = 0;
self.shieldActive = false;
self.powerUpActive = false;
self.quadBulletsActive = false;
self.rotationSpeed = 0;
// Physics properties for smooth movement
self.targetX = null;
self.targetY = null;
self.isMoving = false;
self.moveTween = null;
// Update method for rotation
self.update = function () {
if (self.quadBulletsActive) {
shipGraphics.rotation += self.rotationSpeed;
}
};
// Shield activation
self.activateShield = function () {
self.shieldActive = true;
shieldGraphics.alpha = 0.5;
// Shield times out after 5 seconds
LK.setTimeout(function () {
self.shieldActive = false;
shieldGraphics.alpha = 0;
}, 5000);
};
// Power-up activation
self.activatePowerUp = function () {
self.powerUpActive = true;
shipGraphics.tint = 0xf1c40f; // Yellow tint for power-up
self.fireRate = 10; // Faster firing
// Power-up times out after 7 seconds
LK.setTimeout(function () {
self.powerUpActive = false;
shipGraphics.tint = 0xFFFFFF;
self.fireRate = 20;
}, 7000);
};
// Quad bullets activation
self.activateQuadBullets = function () {
self.quadBulletsActive = true;
shipGraphics.tint = 0xe74c3c; // Red tint for quad bullets
self.fireRate = 15; // Medium firing speed
self.rotationSpeed = 0.05; // Start spinning
// Quad bullets time out after 8 seconds
LK.setTimeout(function () {
self.quadBulletsActive = false;
shipGraphics.tint = 0xFFFFFF;
self.fireRate = 20;
self.rotationSpeed = 0;
shipGraphics.rotation = 0; // Reset rotation
}, 8000);
};
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 = 3;
// Add quad bullet type with 1/3 chance
var rand = Math.random();
if (rand < 0.33) {
self.type = 'shield';
} else if (rand < 0.66) {
self.type = 'weapon';
} else {
self.type = 'quadBullets';
}
// Set color based on type
if (self.type === 'shield') {
powerUpGraphics.tint = 0x3498db; // Blue for shield
} else if (self.type === 'weapon') {
powerUpGraphics.tint = 0xf1c40f; // Yellow for weapon
} else {
powerUpGraphics.tint = 0xe74c3c; // Red for quad bullets
}
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game constants
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
var SPAWN_ENEMY_INTERVAL = 60; // Spawn enemy every 60 ticks initially
var SPAWN_POWERUP_INTERVAL = 600; // Spawn power-up every 600 ticks
var MIN_SPAWN_INTERVAL = 20; // Minimum spawn rate as difficulty increases
// Game state variables
var player;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerUps = [];
var gameLevel = 1;
var spawnCounter = 0;
var powerUpCounter = 0;
var isGameActive = true;
var score = 0;
// Initialize score display
var scoreTxt = new Text2('SCORE: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.y = 30;
// Initialize level display
var levelTxt = new Text2('LEVEL: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
levelTxt.y = 100;
// Create player ship
function initializeGame() {
player = new PlayerShip();
player.x = GAME_WIDTH / 2;
player.y = GAME_HEIGHT - 200;
game.addChild(player);
// Reset arrays
playerBullets = [];
enemies = [];
enemyBullets = [];
powerUps = [];
// Reset game state
gameLevel = 1;
spawnCounter = 0;
powerUpCounter = 0;
isGameActive = true;
// Reset score and update display
LK.setScore(0);
score = 0;
updateScoreDisplay();
updateLevelDisplay();
// Play background music
LK.playMusic('gameMusic');
}
// Initialize the game
initializeGame();
// Update score display
function updateScoreDisplay() {
scoreTxt.setText('SCORE: ' + score);
}
// Update level display
function updateLevelDisplay() {
levelTxt.setText('LEVEL: ' + gameLevel);
}
// Player shooting
function playerShoot() {
// Check fire rate cooldown
if (LK.ticks - player.lastShot < player.fireRate) {
return;
}
// Always fire dual cannons (left and right)
var bulletLeft = new PlayerBullet();
bulletLeft.x = player.x - 20;
bulletLeft.y = player.y - 40;
bulletLeft.direction = 'up';
game.addChild(bulletLeft);
playerBullets.push(bulletLeft);
var bulletRight = new PlayerBullet();
bulletRight.x = player.x + 20;
bulletRight.y = player.y - 40;
bulletRight.direction = 'up';
game.addChild(bulletRight);
playerBullets.push(bulletRight);
// Triple bullets if weapon power-up is active
if (player.powerUpActive) {
var bulletCenter = new PlayerBullet();
bulletCenter.x = player.x;
bulletCenter.y = player.y - 50;
bulletCenter.direction = 'up';
game.addChild(bulletCenter);
playerBullets.push(bulletCenter);
}
// Quad-directional bullets if quad bullets power-up is active
if (player.quadBulletsActive) {
// Up bullet already covered
// Down bullet
var bulletDown = new PlayerBullet();
bulletDown.x = player.x;
bulletDown.y = player.y + 40;
bulletDown.direction = 'down';
bulletDown.isPiercing = true;
bulletDown.isBouncing = true;
game.addChild(bulletDown);
playerBullets.push(bulletDown);
// Left bullet
var bulletLeft = new PlayerBullet();
bulletLeft.x = player.x - 40;
bulletLeft.y = player.y;
bulletLeft.direction = 'left';
bulletLeft.isPiercing = true;
bulletLeft.isBouncing = true;
game.addChild(bulletLeft);
playerBullets.push(bulletLeft);
// Right bullet
var bulletRight = new PlayerBullet();
bulletRight.x = player.x + 40;
bulletRight.y = player.y;
bulletRight.direction = 'right';
bulletRight.isPiercing = true;
bulletRight.isBouncing = true;
game.addChild(bulletRight);
playerBullets.push(bulletRight);
}
// Play sound and reset shot timer
LK.getSound('playerShoot').play();
player.lastShot = LK.ticks;
}
// Enemy shooting
function enemyShoot(enemy) {
if (LK.ticks - enemy.lastShot < enemy.fireRate) {
return;
}
var bullet = new EnemyBullet();
bullet.x = enemy.x;
bullet.y = enemy.y + 40;
game.addChild(bullet);
enemyBullets.push(bullet);
LK.getSound('enemyShoot').play();
enemy.lastShot = LK.ticks;
}
// Spawn new enemy
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = Math.random() * (GAME_WIDTH - 100) + 50;
enemy.y = -50;
// Increase difficulty with levels
if (gameLevel > 1) {
enemy.speed = Math.min(2 + gameLevel * 0.5, 6);
enemy.health = Math.min(1 + Math.floor(gameLevel / 3), 3);
}
if (gameLevel > 5) {
enemy.fireRate = Math.max(120 - gameLevel * 5, 60);
}
game.addChild(enemy);
enemies.push(enemy);
}
// Spawn power-up
function spawnPowerUp() {
var powerUp = new PowerUp();
powerUp.x = Math.random() * (GAME_WIDTH - 100) + 50;
powerUp.y = -50;
game.addChild(powerUp);
powerUps.push(powerUp);
}
// Check level progress
function checkLevelProgress() {
// Advance level based on score
var shouldAdvanceLevel = Math.floor(score / 1000) + 1;
if (shouldAdvanceLevel > gameLevel) {
gameLevel = shouldAdvanceLevel;
updateLevelDisplay();
// Flash screen to indicate level up
LK.effects.flashScreen(0x3498db, 500);
}
}
// Handle collisions
function handleCollisions() {
// Check player bullets hitting enemies
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
var bulletHit = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Enemy takes damage
if (enemy.takeDamage(bullet.power)) {
// Enemy destroyed
score += enemy.scoreValue;
LK.setScore(score);
updateScoreDisplay();
LK.getSound('explosion').play();
LK.effects.flashObject(enemy, 0xff0000, 300);
// Remove enemy
enemy.destroy();
enemies.splice(j, 1);
}
// Only remove non-piercing bullets on hit
if (!bullet.isPiercing) {
bullet.destroy();
playerBullets.splice(i, 1);
bulletHit = true;
break;
}
}
}
// If a non-piercing bullet hit something, skip to the next bullet
if (bulletHit) {
continue;
}
}
// Check enemy bullets hitting player
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.intersects(player) && !player.shieldActive) {
// Player hit
bullet.destroy();
enemyBullets.splice(i, 1);
// Game over
LK.effects.flashScreen(0xff0000, 1000);
isGameActive = false;
LK.showGameOver();
break;
}
}
// Check enemies colliding with player
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.intersects(player)) {
if (!player.shieldActive) {
// Player dies on collision
LK.effects.flashScreen(0xff0000, 1000);
isGameActive = false;
LK.showGameOver();
break;
} else {
// Shield absorbs the hit
enemy.destroy();
enemies.splice(i, 1);
// Shield gets depleted
player.shieldActive = false;
var shield = player.getChildAt(1);
shield.alpha = 0;
score += enemy.scoreValue;
LK.setScore(score);
updateScoreDisplay();
}
}
}
// Check player collecting power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.intersects(player)) {
LK.getSound('powerUp').play();
// Apply power-up effect
if (powerUp.type === 'shield') {
player.activateShield();
} else if (powerUp.type === 'weapon') {
player.activatePowerUp();
} else if (powerUp.type === 'quadBullets') {
player.activateQuadBullets();
}
// Remove power-up
powerUp.destroy();
powerUps.splice(i, 1);
}
}
}
// Clean up off-screen objects
function cleanupOffscreenObjects() {
// Clean up bullets that went off screen
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
// Check if bullet is off screen based on direction (unless it's bouncing)
if (!bullet.isBouncing) {
if (bullet.direction === 'up' && bullet.y < -50 || bullet.direction === 'down' && bullet.y > GAME_HEIGHT + 50 || bullet.direction === 'left' && bullet.x < -50 || bullet.direction === 'right' && bullet.x > GAME_WIDTH + 50) {
bullet.destroy();
playerBullets.splice(i, 1);
}
} else if (bullet.bounceCount >= bullet.maxBounces) {
// Remove bouncing bullet that reached max bounce count
bullet.destroy();
playerBullets.splice(i, 1);
}
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
if (enemyBullets[i].y > GAME_HEIGHT + 50) {
enemyBullets[i].destroy();
enemyBullets.splice(i, 1);
}
}
// Clean up enemies that went off screen
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i].y > GAME_HEIGHT + 100) {
enemies[i].destroy();
enemies.splice(i, 1);
}
}
// Clean up power-ups that went off screen
for (var i = powerUps.length - 1; i >= 0; i--) {
if (powerUps[i].y > GAME_HEIGHT + 50) {
powerUps[i].destroy();
powerUps.splice(i, 1);
}
}
}
// Player movement
var isDragging = false;
game.down = function (x, y) {
// Set target position
var targetX = x;
var targetY = y;
// Clamp target position to game bounds
if (targetX < 50) {
targetX = 50;
}
if (targetX > GAME_WIDTH - 50) {
targetX = GAME_WIDTH - 50;
}
if (targetY < 50) {
targetY = 50;
}
if (targetY > GAME_HEIGHT - 50) {
targetY = GAME_HEIGHT - 50;
}
player.targetX = targetX;
player.targetY = targetY;
player.isMoving = true;
// Also shoot when player taps
playerShoot();
};
game.move = function (x, y) {
if (isGameActive) {
// Clamp target position to game bounds
var targetX = x;
var targetY = y;
if (targetX < 50) {
targetX = 50;
}
if (targetX > GAME_WIDTH - 50) {
targetX = GAME_WIDTH - 50;
}
if (targetY < 50) {
targetY = 50;
}
if (targetY > GAME_HEIGHT - 50) {
targetY = GAME_HEIGHT - 50;
}
// Update target position
player.targetX = targetX;
player.targetY = targetY;
// For better tracking during fast mouse movements, directly update position
player.x = player.targetX;
player.y = player.targetY;
player.isMoving = true; //{2K}{2L}{2M}{2N}
}
};
game.up = function () {
// Keep the ship moving toward last target point
};
// Main game update loop
game.update = function () {
if (!isGameActive) {
return;
}
// Spawn enemies
spawnCounter++;
var currentSpawnRate = Math.max(SPAWN_ENEMY_INTERVAL - gameLevel * 5, MIN_SPAWN_INTERVAL);
if (spawnCounter >= currentSpawnRate) {
spawnEnemy();
spawnCounter = 0;
}
// Spawn power-ups
powerUpCounter++;
if (powerUpCounter >= SPAWN_POWERUP_INTERVAL) {
spawnPowerUp();
powerUpCounter = 0;
}
// Make player shoot automatically
if (player.isMoving) {
playerShoot();
}
// Update enemy shooting
for (var i = 0; i < enemies.length; i++) {
enemyShoot(enemies[i]);
}
// Check collisions
handleCollisions();
// Clean up off-screen objects
cleanupOffscreenObjects();
// Check level progression
checkLevelProgress();
// Win condition check
if (score >= 10000) {
LK.showYouWin();
isGameActive = false;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -63,10 +63,44 @@
anchorY: 0.5
});
self.speed = -15; // Moving upward
self.power = 1;
+ self.direction = 'up'; // up, down, left, right
+ self.isPiercing = false;
+ self.isBouncing = false;
+ self.bounceCount = 0;
+ self.maxBounces = 3;
self.update = function () {
- self.y += self.speed;
+ // Move bullet based on direction
+ if (self.direction === 'up') {
+ self.y += self.speed;
+ // Check for bouncing against top edge
+ if (self.isBouncing && self.y < 0 && self.bounceCount < self.maxBounces) {
+ self.direction = 'down';
+ self.bounceCount++;
+ }
+ } else if (self.direction === 'down') {
+ self.y -= self.speed; // Note: speed is negative, so this is adding a positive value
+ // Check for bouncing against bottom edge
+ if (self.isBouncing && self.y > GAME_HEIGHT && self.bounceCount < self.maxBounces) {
+ self.direction = 'up';
+ self.bounceCount++;
+ }
+ } else if (self.direction === 'left') {
+ self.x += self.speed;
+ // Check for bouncing against left edge
+ if (self.isBouncing && self.x < 0 && self.bounceCount < self.maxBounces) {
+ self.direction = 'right';
+ self.bounceCount++;
+ }
+ } else if (self.direction === 'right') {
+ self.x -= self.speed; // Note: speed is negative, so this is adding a positive value
+ // Check for bouncing against right edge
+ if (self.isBouncing && self.x > GAME_WIDTH && self.bounceCount < self.maxBounces) {
+ self.direction = 'left';
+ self.bounceCount++;
+ }
+ }
};
return self;
});
var PlayerShip = Container.expand(function () {
@@ -87,12 +121,21 @@
self.fireRate = 20; // Ticks between shots
self.lastShot = 0;
self.shieldActive = false;
self.powerUpActive = false;
+ self.quadBulletsActive = false;
+ self.rotationSpeed = 0;
// Physics properties for smooth movement
self.targetX = null;
self.targetY = null;
self.isMoving = false;
+ self.moveTween = null;
+ // Update method for rotation
+ self.update = function () {
+ if (self.quadBulletsActive) {
+ shipGraphics.rotation += self.rotationSpeed;
+ }
+ };
// Shield activation
self.activateShield = function () {
self.shieldActive = true;
shieldGraphics.alpha = 0.5;
@@ -113,8 +156,23 @@
shipGraphics.tint = 0xFFFFFF;
self.fireRate = 20;
}, 7000);
};
+ // Quad bullets activation
+ self.activateQuadBullets = function () {
+ self.quadBulletsActive = true;
+ shipGraphics.tint = 0xe74c3c; // Red tint for quad bullets
+ self.fireRate = 15; // Medium firing speed
+ self.rotationSpeed = 0.05; // Start spinning
+ // Quad bullets time out after 8 seconds
+ LK.setTimeout(function () {
+ self.quadBulletsActive = false;
+ shipGraphics.tint = 0xFFFFFF;
+ self.fireRate = 20;
+ self.rotationSpeed = 0;
+ shipGraphics.rotation = 0; // Reset rotation
+ }, 8000);
+ };
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
@@ -122,14 +180,24 @@
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
- self.type = Math.random() > 0.5 ? 'shield' : 'weapon'; // Randomly choose power-up type
+ // Add quad bullet type with 1/3 chance
+ var rand = Math.random();
+ if (rand < 0.33) {
+ self.type = 'shield';
+ } else if (rand < 0.66) {
+ self.type = 'weapon';
+ } else {
+ self.type = 'quadBullets';
+ }
// Set color based on type
if (self.type === 'shield') {
powerUpGraphics.tint = 0x3498db; // Blue for shield
- } else {
+ } else if (self.type === 'weapon') {
powerUpGraphics.tint = 0xf1c40f; // Yellow for weapon
+ } else {
+ powerUpGraphics.tint = 0xe74c3c; // Red for quad bullets
}
self.update = function () {
self.y += self.speed;
};
@@ -218,27 +286,61 @@
// Check fire rate cooldown
if (LK.ticks - player.lastShot < player.fireRate) {
return;
}
- // Create new bullet
- var bullet = new PlayerBullet();
- bullet.x = player.x;
- bullet.y = player.y - 40;
- game.addChild(bullet);
- playerBullets.push(bullet);
- // Double bullets if power-up is active
+ // Always fire dual cannons (left and right)
+ var bulletLeft = new PlayerBullet();
+ bulletLeft.x = player.x - 20;
+ bulletLeft.y = player.y - 40;
+ bulletLeft.direction = 'up';
+ game.addChild(bulletLeft);
+ playerBullets.push(bulletLeft);
+ var bulletRight = new PlayerBullet();
+ bulletRight.x = player.x + 20;
+ bulletRight.y = player.y - 40;
+ bulletRight.direction = 'up';
+ game.addChild(bulletRight);
+ playerBullets.push(bulletRight);
+ // Triple bullets if weapon power-up is active
if (player.powerUpActive) {
- var bullet2 = new PlayerBullet();
- bullet2.x = player.x - 20;
- bullet2.y = player.y - 30;
- game.addChild(bullet2);
- playerBullets.push(bullet2);
- var bullet3 = new PlayerBullet();
- bullet3.x = player.x + 20;
- bullet3.y = player.y - 30;
- game.addChild(bullet3);
- playerBullets.push(bullet3);
+ var bulletCenter = new PlayerBullet();
+ bulletCenter.x = player.x;
+ bulletCenter.y = player.y - 50;
+ bulletCenter.direction = 'up';
+ game.addChild(bulletCenter);
+ playerBullets.push(bulletCenter);
}
+ // Quad-directional bullets if quad bullets power-up is active
+ if (player.quadBulletsActive) {
+ // Up bullet already covered
+ // Down bullet
+ var bulletDown = new PlayerBullet();
+ bulletDown.x = player.x;
+ bulletDown.y = player.y + 40;
+ bulletDown.direction = 'down';
+ bulletDown.isPiercing = true;
+ bulletDown.isBouncing = true;
+ game.addChild(bulletDown);
+ playerBullets.push(bulletDown);
+ // Left bullet
+ var bulletLeft = new PlayerBullet();
+ bulletLeft.x = player.x - 40;
+ bulletLeft.y = player.y;
+ bulletLeft.direction = 'left';
+ bulletLeft.isPiercing = true;
+ bulletLeft.isBouncing = true;
+ game.addChild(bulletLeft);
+ playerBullets.push(bulletLeft);
+ // Right bullet
+ var bulletRight = new PlayerBullet();
+ bulletRight.x = player.x + 40;
+ bulletRight.y = player.y;
+ bulletRight.direction = 'right';
+ bulletRight.isPiercing = true;
+ bulletRight.isBouncing = true;
+ game.addChild(bulletRight);
+ playerBullets.push(bulletRight);
+ }
// Play sound and reset shot timer
LK.getSound('playerShoot').play();
player.lastShot = LK.ticks;
}
@@ -294,8 +396,9 @@
function handleCollisions() {
// Check player bullets hitting enemies
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
+ var bulletHit = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Enemy takes damage
@@ -309,14 +412,21 @@
// Remove enemy
enemy.destroy();
enemies.splice(j, 1);
}
- // Remove bullet
- bullet.destroy();
- playerBullets.splice(i, 1);
- break;
+ // Only remove non-piercing bullets on hit
+ if (!bullet.isPiercing) {
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ bulletHit = true;
+ break;
+ }
}
}
+ // If a non-piercing bullet hit something, skip to the next bullet
+ if (bulletHit) {
+ continue;
+ }
}
// Check enemy bullets hitting player
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
@@ -362,10 +472,12 @@
LK.getSound('powerUp').play();
// Apply power-up effect
if (powerUp.type === 'shield') {
player.activateShield();
- } else {
+ } else if (powerUp.type === 'weapon') {
player.activatePowerUp();
+ } else if (powerUp.type === 'quadBullets') {
+ player.activateQuadBullets();
}
// Remove power-up
powerUp.destroy();
powerUps.splice(i, 1);
@@ -375,10 +487,18 @@
// Clean up off-screen objects
function cleanupOffscreenObjects() {
// Clean up bullets that went off screen
for (var i = playerBullets.length - 1; i >= 0; i--) {
- if (playerBullets[i].y < -50) {
- playerBullets[i].destroy();
+ var bullet = playerBullets[i];
+ // Check if bullet is off screen based on direction (unless it's bouncing)
+ if (!bullet.isBouncing) {
+ if (bullet.direction === 'up' && bullet.y < -50 || bullet.direction === 'down' && bullet.y > GAME_HEIGHT + 50 || bullet.direction === 'left' && bullet.x < -50 || bullet.direction === 'right' && bullet.x > GAME_WIDTH + 50) {
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ }
+ } else if (bullet.bounceCount >= bullet.maxBounces) {
+ // Remove bouncing bullet that reached max bounce count
+ bullet.destroy();
playerBullets.splice(i, 1);
}
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
An enemy spaceship in a topdown shooter. In-Game asset. 2d. High contrast. No shadows
A player's spaceship in a topdown shooter (mainly blue in colour). In-Game asset. 2d. High contrast. No shadows
A powerup in a top-down shooter (icon of powerup no text). In-Game asset. 2d. High contrast. No shadows
Health Powerup in 2d space shooter (top down). In-Game asset. 2d. High contrast. No shadows
An explosion which contains debris of a spaceship. In-Game asset. 2d. High contrast. No shadows
pool of fire with top down view. In-Game asset. 2d. High contrast. No shadows
Make a small circle that looks like a laser (red colour). In-Game asset. 2d. High contrast. No shadows
Make a very small circle that looks like a laser (blue colour). In-Game asset. 2d. High contrast. No shadows. In-Game asset. 2d. High contrast. No shadows
A missile. In-Game asset. 2d. High contrast. No shadows