User prompt
add background asset
User prompt
player can jump 7 times
User prompt
platform random location
User prompt
reduce enemy bullet multiple
User prompt
enemy interval release shoot is every one second
User prompt
player have health bar
User prompt
enemy can shoot right and can shoot left
User prompt
triple jump
Code edit (1 edits merged)
Please save this source code
User prompt
Soldier Assault: Platform Combat
Initial prompt
1. JavaScript 2D side scroling ground and Platformer Game soldier shooter attack game. 2. player soldier game mobe right and right. 3 enemy soldier move left and right. 4. random platform. 5. game end when all enemies died. 6. game over when player died. 7. touchscreen controler button for move left and right. touch controler button A for soldier shoot attack. touch controler S for jump. 8.limited platform just 7 paltform and enemy on the platform. 9.enemy not same platform with player
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var ActionButton = Container.expand(function (label) { var self = Container.call(this); var buttonGraphics = self.attachAsset('actionButton', { anchorX: 0.5, anchorY: 0.5, alpha: 0.5 }); var buttonText = new Text2(label, { size: 60, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.buttonType = label; self.isPressed = false; self.down = function () { self.isPressed = true; buttonGraphics.alpha = 0.8; if (self.buttonType === 'A') { player.shoot(); } else if (self.buttonType === 'B') { player.jump(); } }; self.up = function () { self.isPressed = false; buttonGraphics.alpha = 0.5; }; return self; }); var Background = Container.expand(function () { var self = Container.call(this); var backgroundGraphics = self.attachAsset('background', { anchorX: 0, anchorY: 0 }); return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.direction = 1; // 1 for right, -1 for left self.speed = 15; self.fromPlayer = true; self.update = function () { self.x += self.speed * self.direction; // Check if bullet is off-screen if (self.x < -50 || self.x > 2100) { self.shouldRemove = true; } }; return self; }); var Character = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('soldier', { anchorX: 0.5, anchorY: 1.0 }); self.direction = 1; // 1 for right, -1 for left self.velocityY = 0; self.velocityX = 0; self.speed = 8; self.jumpForce = -20; self.gravity = 1; self.isJumping = false; self.isGrounded = false; self.jumpsRemaining = 0; self.maxJumps = 7; self.platform = null; self.health = 100; self.maxHealth = 100; self.jump = function () { if (self.isGrounded || self.jumpsRemaining > 0) { self.velocityY = self.jumpForce; self.isJumping = true; if (self.isGrounded) { self.jumpsRemaining = self.maxJumps - 1; } else { self.jumpsRemaining--; } self.isGrounded = false; LK.getSound('jump').play(); } }; self.shoot = function () { var bullet = new Bullet(); bullet.x = self.x + self.direction * 40; bullet.y = self.y - 60; bullet.direction = self.direction; bullet.fromPlayer = true; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); }; self.moveLeft = function () { self.direction = -1; self.velocityX = -self.speed; graphics.scaleX = -1; }; self.moveRight = function () { self.direction = 1; self.velocityX = self.speed; graphics.scaleX = 1; }; self.stopMoving = function () { self.velocityX = 0; }; self.update = function () { // Apply gravity self.velocityY += self.gravity; // Apply velocity self.x += self.velocityX; self.y += self.velocityY; // Check screen boundaries if (self.x < 40) { self.x = 40; } else if (self.x > 2008) { self.x = 2008; } // Check if character fell off the bottom of the screen if (self.y > 2732) { LK.getSound('playerDeath').play(); LK.effects.flashScreen(0xff0000, 500); LK.showGameOver(); } // Reset grounded state self.isGrounded = false; // Check platform collisions for (var i = 0; i < platforms.length; i++) { var platform = platforms[i]; // Simple collision detection with platform if (self.velocityY >= 0 && // Only check collision when falling self.x >= platform.x && self.x <= platform.x + platform.width && self.y >= platform.y - 10 && self.y <= platform.y + 10) { self.isGrounded = true; self.isJumping = false; self.jumpsRemaining = self.maxJumps; self.velocityY = 0; self.y = platform.y; self.platform = platform; break; } } }; return self; }); var Enemy = Character.expand(function () { var self = Character.call(this); // Replace soldier asset with enemy asset self.removeChildren(); var graphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 1.0 }); // Adjust enemy properties self.speed = 4; self.direction = -1; self.shootCooldown = 0; self.shootInterval = 180; // Three seconds (60 frames * 3) graphics.scaleX = -1; // Override update method var parentUpdate = self.update; self.update = function () { parentUpdate.call(this); // AI movement: patrol the platform if (self.platform) { // Check if reached edge of platform if (self.x <= self.platform.x + 40) { self.direction = 1; graphics.scaleX = 1; self.velocityX = self.speed; } else if (self.x >= self.platform.x + self.platform.width - 40) { self.direction = -1; graphics.scaleX = -1; self.velocityX = -self.speed; } } // Shooting logic self.shootCooldown++; if (self.shootCooldown >= self.shootInterval) { // Face the player before shooting if (player) { var directionToPlayer = player.x < self.x ? -1 : 1; graphics.scaleX = directionToPlayer; } self.shoot(); self.shootCooldown = 0; self.shootInterval = 180; // Three seconds (60 frames * 3) } }; // Override shoot method self.shoot = function () { // Determine direction to shoot based on player position var directionToPlayer = player.x < self.x ? -1 : 1; // Only 30% chance to actually fire a bullet if (Math.random() < 0.3) { var bullet = new Bullet(); bullet.x = self.x + directionToPlayer * 40; bullet.y = self.y - 60; bullet.direction = directionToPlayer; bullet.fromPlayer = false; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); } }; return self; }); var ControlButton = Container.expand(function (type) { var self = Container.call(this); var buttonGraphics = self.attachAsset('controlButton', { anchorX: 0.5, anchorY: 0.5, alpha: 0.5 }); var buttonText = new Text2(type, { size: 60, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); self.addChild(buttonText); self.buttonType = type; self.isPressed = false; self.down = function () { self.isPressed = true; buttonGraphics.alpha = 0.8; }; self.up = function () { self.isPressed = false; buttonGraphics.alpha = 0.5; }; return self; }); var HealthBar = Container.expand(function () { var self = Container.call(this); // Background bar self.background = new Container(); var bgGraphics = self.background.attachAsset('platform', { anchorX: 0, anchorY: 0 }); bgGraphics.tint = 0x333333; self.addChild(self.background); // Health bar self.bar = new Container(); var barGraphics = self.bar.attachAsset('platform', { anchorX: 0, anchorY: 0 }); barGraphics.tint = 0x00FF00; self.addChild(self.bar); // Set size self.width = 200; self.height = 20; self.background.width = self.width; self.background.height = self.height; self.background.scaleX = self.width / 400; self.background.scaleY = self.height / 50; // Update health percentage self.updateHealth = function (current, max) { var percentage = Math.max(0, Math.min(1, current / max)); self.bar.width = self.width * percentage; self.bar.scaleX = self.width / 400 * percentage; self.bar.scaleY = self.height / 50; // Change color based on health var barGraphics = self.bar.children[0]; if (percentage > 0.6) { barGraphics.tint = 0x00FF00; // Green } else if (percentage > 0.3) { barGraphics.tint = 0xFFFF00; // Yellow } else { barGraphics.tint = 0xFF0000; // Red } }; return self; }); var Platform = Container.expand(function () { var self = Container.call(this); var platformGraphics = self.attachAsset('platform', { anchorX: 0, anchorY: 0 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game variables var player; var platforms = []; var enemies = []; var bullets = []; var leftButton, rightButton, jumpButton, shootButton; var scoreText; var jumpIndicator; var healthBar; // Setup game UI function setupUI() { // Create score display scoreText = new Text2('Enemies: ' + enemies.length, { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); // Create jump counter display jumpIndicator = new Text2('Jumps: 7', { size: 60, fill: 0xFFFFFF }); jumpIndicator.anchor.set(0, 0); jumpIndicator.x = 50; LK.gui.top.addChild(jumpIndicator); // Create health bar healthBar = new HealthBar(); healthBar.x = 50; healthBar.y = 100; LK.gui.top.addChild(healthBar); // Create control buttons leftButton = new ControlButton('←'); leftButton.x = 150; leftButton.y = 2500; game.addChild(leftButton); rightButton = new ControlButton('→'); rightButton.x = 350; rightButton.y = 2500; game.addChild(rightButton); jumpButton = new ActionButton('B'); jumpButton.x = 1850; jumpButton.y = 2500; game.addChild(jumpButton); shootButton = new ActionButton('A'); shootButton.x = 1650; shootButton.y = 2500; game.addChild(shootButton); } // Create game platforms function createPlatforms() { // Create ground platform var ground = new Platform(); ground.x = 0; ground.y = 2600; ground.width = 2048; ground.scaleX = 5.12; // Scale to fit screen width (2048/400) platforms.push(ground); game.addChild(ground); // Create elevated platforms (6 more for a total of 7) with random positions var platformPositions = []; // Define height sections for platform distribution var heightSections = [{ min: 2200, max: 2400 }, { min: 1900, max: 2100 }, { min: 1600, max: 1800 }, { min: 1300, max: 1500 }, { min: 1000, max: 1200 }, { min: 700, max: 900 }]; // Create one platform in each height section for (var i = 0; i < heightSections.length; i++) { var section = heightSections[i]; var randomX = Math.floor(Math.random() * (1700 - 200) + 200); // Random X between 200-1700 var randomY = Math.floor(Math.random() * (section.max - section.min) + section.min); var randomScale = Math.random() * 0.5 + 0.8; // Random scale between 0.8 and 1.3 platformPositions.push({ x: randomX, y: randomY, scale: randomScale }); } for (var i = 0; i < platformPositions.length; i++) { var pos = platformPositions[i]; var platform = new Platform(); platform.x = pos.x; platform.y = pos.y; platform.scaleX = pos.scale; platform.width = 400 * pos.scale; platforms.push(platform); game.addChild(platform); } } // Create enemies function createEnemies() { // Place enemies on different platforms with random x positions var enemyPositions = []; // Skip the ground platform (index 0) and place enemies on platforms 1-5 for (var i = 1; i <= 5; i++) { var platform = platforms[i]; var platformWidth = platform.width; // Calculate a random x position within the platform's bounds var randomX = Math.floor(Math.random() * (platformWidth - 80)) + platform.x + 40; enemyPositions.push({ x: randomX, platform: i }); } for (var i = 0; i < enemyPositions.length; i++) { var pos = enemyPositions[i]; var enemy = new Enemy(); var platform = platforms[pos.platform]; enemy.x = pos.x; enemy.y = platform.y; enemy.platform = platform; enemies.push(enemy); game.addChild(enemy); } } // Create player function createPlayer() { player = new Character(); player.x = 100; player.y = platforms[0].y; // Start on ground player.platform = platforms[0]; player.health = player.maxHealth; // Initialize full health game.addChild(player); } // Initialize game function initGame() { // Add background var background = new Background(); background.x = 0; background.y = 0; game.addChild(background); // Create game elements createPlatforms(); createEnemies(); createPlayer(); setupUI(); // Play background music LK.playMusic('bgMusic'); } // Handle input game.down = function (x, y, obj) { // Only respond to direct object clicks if (!obj) return; if (obj === leftButton) { leftButton.down(); } else if (obj === rightButton) { rightButton.down(); } else if (obj === jumpButton) { jumpButton.down(); } else if (obj === shootButton) { shootButton.down(); } }; game.up = function (x, y, obj) { // First check if any button was directly clicked if (obj) { if (obj === leftButton) { leftButton.up(); } else if (obj === rightButton) { rightButton.up(); } else if (obj === jumpButton) { jumpButton.up(); } else if (obj === shootButton) { shootButton.up(); } return; } // Check if any button is being released if (leftButton.isPressed) leftButton.up(); if (rightButton.isPressed) rightButton.up(); if (jumpButton.isPressed) jumpButton.up(); if (shootButton.isPressed) shootButton.up(); }; // Update function gets called every frame game.update = function () { if (!player) { initGame(); return; } // Handle control input if (leftButton && leftButton.isPressed) { player.moveLeft(); } else if (rightButton && rightButton.isPressed) { player.moveRight(); } else { player.stopMoving(); } // Update player player.update(); // Update jump indicator text if (jumpIndicator) { jumpIndicator.setText("Jumps: " + (player.isGrounded ? player.maxJumps : player.jumpsRemaining)); } // Update health bar if (healthBar) { healthBar.updateHealth(player.health, player.maxHealth); } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { enemies[i].update(); } // Update bullets for (var j = bullets.length - 1; j >= 0; j--) { var bullet = bullets[j]; bullet.update(); // Check if bullet should be removed if (bullet.shouldRemove) { bullet.destroy(); bullets.splice(j, 1); continue; } // Check bullet collisions with enemies if (bullet.fromPlayer) { for (var k = enemies.length - 1; k >= 0; k--) { var enemy = enemies[k]; if (bullet.intersects(enemy)) { // Enemy hit LK.getSound('enemyDeath').play(); LK.effects.flashObject(enemy, 0xFF0000, 300); // Remove enemy enemy.destroy(); enemies.splice(k, 1); // Remove bullet bullet.destroy(); bullets.splice(j, 1); // Update score scoreText.setText('Enemies: ' + enemies.length); // Check if all enemies are defeated if (enemies.length === 0) { LK.showYouWin(); } break; } } } // Check bullet collisions with player else if (!bullet.fromPlayer && bullet.intersects(player)) { // Player hit LK.getSound('shoot').play(); LK.effects.flashObject(player, 0xFF0000, 300); // Reduce player health player.health -= 20; // Each bullet deals 20 damage healthBar.updateHealth(player.health, player.maxHealth); // Game over if health is depleted if (player.health <= 0) { LK.getSound('playerDeath').play(); LK.effects.flashScreen(0xFF0000, 500); // Game over LK.showGameOver(); } // Remove bullet bullet.destroy(); bullets.splice(j, 1); } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var ActionButton = Container.expand(function (label) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('actionButton', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5
});
var buttonText = new Text2(label, {
size: 60,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.buttonType = label;
self.isPressed = false;
self.down = function () {
self.isPressed = true;
buttonGraphics.alpha = 0.8;
if (self.buttonType === 'A') {
player.shoot();
} else if (self.buttonType === 'B') {
player.jump();
}
};
self.up = function () {
self.isPressed = false;
buttonGraphics.alpha = 0.5;
};
return self;
});
var Background = Container.expand(function () {
var self = Container.call(this);
var backgroundGraphics = self.attachAsset('background', {
anchorX: 0,
anchorY: 0
});
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = 1; // 1 for right, -1 for left
self.speed = 15;
self.fromPlayer = true;
self.update = function () {
self.x += self.speed * self.direction;
// Check if bullet is off-screen
if (self.x < -50 || self.x > 2100) {
self.shouldRemove = true;
}
};
return self;
});
var Character = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('soldier', {
anchorX: 0.5,
anchorY: 1.0
});
self.direction = 1; // 1 for right, -1 for left
self.velocityY = 0;
self.velocityX = 0;
self.speed = 8;
self.jumpForce = -20;
self.gravity = 1;
self.isJumping = false;
self.isGrounded = false;
self.jumpsRemaining = 0;
self.maxJumps = 7;
self.platform = null;
self.health = 100;
self.maxHealth = 100;
self.jump = function () {
if (self.isGrounded || self.jumpsRemaining > 0) {
self.velocityY = self.jumpForce;
self.isJumping = true;
if (self.isGrounded) {
self.jumpsRemaining = self.maxJumps - 1;
} else {
self.jumpsRemaining--;
}
self.isGrounded = false;
LK.getSound('jump').play();
}
};
self.shoot = function () {
var bullet = new Bullet();
bullet.x = self.x + self.direction * 40;
bullet.y = self.y - 60;
bullet.direction = self.direction;
bullet.fromPlayer = true;
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
self.moveLeft = function () {
self.direction = -1;
self.velocityX = -self.speed;
graphics.scaleX = -1;
};
self.moveRight = function () {
self.direction = 1;
self.velocityX = self.speed;
graphics.scaleX = 1;
};
self.stopMoving = function () {
self.velocityX = 0;
};
self.update = function () {
// Apply gravity
self.velocityY += self.gravity;
// Apply velocity
self.x += self.velocityX;
self.y += self.velocityY;
// Check screen boundaries
if (self.x < 40) {
self.x = 40;
} else if (self.x > 2008) {
self.x = 2008;
}
// Check if character fell off the bottom of the screen
if (self.y > 2732) {
LK.getSound('playerDeath').play();
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
}
// Reset grounded state
self.isGrounded = false;
// Check platform collisions
for (var i = 0; i < platforms.length; i++) {
var platform = platforms[i];
// Simple collision detection with platform
if (self.velocityY >= 0 &&
// Only check collision when falling
self.x >= platform.x && self.x <= platform.x + platform.width && self.y >= platform.y - 10 && self.y <= platform.y + 10) {
self.isGrounded = true;
self.isJumping = false;
self.jumpsRemaining = self.maxJumps;
self.velocityY = 0;
self.y = platform.y;
self.platform = platform;
break;
}
}
};
return self;
});
var Enemy = Character.expand(function () {
var self = Character.call(this);
// Replace soldier asset with enemy asset
self.removeChildren();
var graphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 1.0
});
// Adjust enemy properties
self.speed = 4;
self.direction = -1;
self.shootCooldown = 0;
self.shootInterval = 180; // Three seconds (60 frames * 3)
graphics.scaleX = -1;
// Override update method
var parentUpdate = self.update;
self.update = function () {
parentUpdate.call(this);
// AI movement: patrol the platform
if (self.platform) {
// Check if reached edge of platform
if (self.x <= self.platform.x + 40) {
self.direction = 1;
graphics.scaleX = 1;
self.velocityX = self.speed;
} else if (self.x >= self.platform.x + self.platform.width - 40) {
self.direction = -1;
graphics.scaleX = -1;
self.velocityX = -self.speed;
}
}
// Shooting logic
self.shootCooldown++;
if (self.shootCooldown >= self.shootInterval) {
// Face the player before shooting
if (player) {
var directionToPlayer = player.x < self.x ? -1 : 1;
graphics.scaleX = directionToPlayer;
}
self.shoot();
self.shootCooldown = 0;
self.shootInterval = 180; // Three seconds (60 frames * 3)
}
};
// Override shoot method
self.shoot = function () {
// Determine direction to shoot based on player position
var directionToPlayer = player.x < self.x ? -1 : 1;
// Only 30% chance to actually fire a bullet
if (Math.random() < 0.3) {
var bullet = new Bullet();
bullet.x = self.x + directionToPlayer * 40;
bullet.y = self.y - 60;
bullet.direction = directionToPlayer;
bullet.fromPlayer = false;
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
};
return self;
});
var ControlButton = Container.expand(function (type) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset('controlButton', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5
});
var buttonText = new Text2(type, {
size: 60,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.buttonType = type;
self.isPressed = false;
self.down = function () {
self.isPressed = true;
buttonGraphics.alpha = 0.8;
};
self.up = function () {
self.isPressed = false;
buttonGraphics.alpha = 0.5;
};
return self;
});
var HealthBar = Container.expand(function () {
var self = Container.call(this);
// Background bar
self.background = new Container();
var bgGraphics = self.background.attachAsset('platform', {
anchorX: 0,
anchorY: 0
});
bgGraphics.tint = 0x333333;
self.addChild(self.background);
// Health bar
self.bar = new Container();
var barGraphics = self.bar.attachAsset('platform', {
anchorX: 0,
anchorY: 0
});
barGraphics.tint = 0x00FF00;
self.addChild(self.bar);
// Set size
self.width = 200;
self.height = 20;
self.background.width = self.width;
self.background.height = self.height;
self.background.scaleX = self.width / 400;
self.background.scaleY = self.height / 50;
// Update health percentage
self.updateHealth = function (current, max) {
var percentage = Math.max(0, Math.min(1, current / max));
self.bar.width = self.width * percentage;
self.bar.scaleX = self.width / 400 * percentage;
self.bar.scaleY = self.height / 50;
// Change color based on health
var barGraphics = self.bar.children[0];
if (percentage > 0.6) {
barGraphics.tint = 0x00FF00; // Green
} else if (percentage > 0.3) {
barGraphics.tint = 0xFFFF00; // Yellow
} else {
barGraphics.tint = 0xFF0000; // Red
}
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('platform', {
anchorX: 0,
anchorY: 0
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var player;
var platforms = [];
var enemies = [];
var bullets = [];
var leftButton, rightButton, jumpButton, shootButton;
var scoreText;
var jumpIndicator;
var healthBar;
// Setup game UI
function setupUI() {
// Create score display
scoreText = new Text2('Enemies: ' + enemies.length, {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Create jump counter display
jumpIndicator = new Text2('Jumps: 7', {
size: 60,
fill: 0xFFFFFF
});
jumpIndicator.anchor.set(0, 0);
jumpIndicator.x = 50;
LK.gui.top.addChild(jumpIndicator);
// Create health bar
healthBar = new HealthBar();
healthBar.x = 50;
healthBar.y = 100;
LK.gui.top.addChild(healthBar);
// Create control buttons
leftButton = new ControlButton('←');
leftButton.x = 150;
leftButton.y = 2500;
game.addChild(leftButton);
rightButton = new ControlButton('→');
rightButton.x = 350;
rightButton.y = 2500;
game.addChild(rightButton);
jumpButton = new ActionButton('B');
jumpButton.x = 1850;
jumpButton.y = 2500;
game.addChild(jumpButton);
shootButton = new ActionButton('A');
shootButton.x = 1650;
shootButton.y = 2500;
game.addChild(shootButton);
}
// Create game platforms
function createPlatforms() {
// Create ground platform
var ground = new Platform();
ground.x = 0;
ground.y = 2600;
ground.width = 2048;
ground.scaleX = 5.12; // Scale to fit screen width (2048/400)
platforms.push(ground);
game.addChild(ground);
// Create elevated platforms (6 more for a total of 7) with random positions
var platformPositions = [];
// Define height sections for platform distribution
var heightSections = [{
min: 2200,
max: 2400
}, {
min: 1900,
max: 2100
}, {
min: 1600,
max: 1800
}, {
min: 1300,
max: 1500
}, {
min: 1000,
max: 1200
}, {
min: 700,
max: 900
}];
// Create one platform in each height section
for (var i = 0; i < heightSections.length; i++) {
var section = heightSections[i];
var randomX = Math.floor(Math.random() * (1700 - 200) + 200); // Random X between 200-1700
var randomY = Math.floor(Math.random() * (section.max - section.min) + section.min);
var randomScale = Math.random() * 0.5 + 0.8; // Random scale between 0.8 and 1.3
platformPositions.push({
x: randomX,
y: randomY,
scale: randomScale
});
}
for (var i = 0; i < platformPositions.length; i++) {
var pos = platformPositions[i];
var platform = new Platform();
platform.x = pos.x;
platform.y = pos.y;
platform.scaleX = pos.scale;
platform.width = 400 * pos.scale;
platforms.push(platform);
game.addChild(platform);
}
}
// Create enemies
function createEnemies() {
// Place enemies on different platforms with random x positions
var enemyPositions = [];
// Skip the ground platform (index 0) and place enemies on platforms 1-5
for (var i = 1; i <= 5; i++) {
var platform = platforms[i];
var platformWidth = platform.width;
// Calculate a random x position within the platform's bounds
var randomX = Math.floor(Math.random() * (platformWidth - 80)) + platform.x + 40;
enemyPositions.push({
x: randomX,
platform: i
});
}
for (var i = 0; i < enemyPositions.length; i++) {
var pos = enemyPositions[i];
var enemy = new Enemy();
var platform = platforms[pos.platform];
enemy.x = pos.x;
enemy.y = platform.y;
enemy.platform = platform;
enemies.push(enemy);
game.addChild(enemy);
}
}
// Create player
function createPlayer() {
player = new Character();
player.x = 100;
player.y = platforms[0].y; // Start on ground
player.platform = platforms[0];
player.health = player.maxHealth; // Initialize full health
game.addChild(player);
}
// Initialize game
function initGame() {
// Add background
var background = new Background();
background.x = 0;
background.y = 0;
game.addChild(background);
// Create game elements
createPlatforms();
createEnemies();
createPlayer();
setupUI();
// Play background music
LK.playMusic('bgMusic');
}
// Handle input
game.down = function (x, y, obj) {
// Only respond to direct object clicks
if (!obj) return;
if (obj === leftButton) {
leftButton.down();
} else if (obj === rightButton) {
rightButton.down();
} else if (obj === jumpButton) {
jumpButton.down();
} else if (obj === shootButton) {
shootButton.down();
}
};
game.up = function (x, y, obj) {
// First check if any button was directly clicked
if (obj) {
if (obj === leftButton) {
leftButton.up();
} else if (obj === rightButton) {
rightButton.up();
} else if (obj === jumpButton) {
jumpButton.up();
} else if (obj === shootButton) {
shootButton.up();
}
return;
}
// Check if any button is being released
if (leftButton.isPressed) leftButton.up();
if (rightButton.isPressed) rightButton.up();
if (jumpButton.isPressed) jumpButton.up();
if (shootButton.isPressed) shootButton.up();
};
// Update function gets called every frame
game.update = function () {
if (!player) {
initGame();
return;
}
// Handle control input
if (leftButton && leftButton.isPressed) {
player.moveLeft();
} else if (rightButton && rightButton.isPressed) {
player.moveRight();
} else {
player.stopMoving();
}
// Update player
player.update();
// Update jump indicator text
if (jumpIndicator) {
jumpIndicator.setText("Jumps: " + (player.isGrounded ? player.maxJumps : player.jumpsRemaining));
}
// Update health bar
if (healthBar) {
healthBar.updateHealth(player.health, player.maxHealth);
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].update();
}
// Update bullets
for (var j = bullets.length - 1; j >= 0; j--) {
var bullet = bullets[j];
bullet.update();
// Check if bullet should be removed
if (bullet.shouldRemove) {
bullet.destroy();
bullets.splice(j, 1);
continue;
}
// Check bullet collisions with enemies
if (bullet.fromPlayer) {
for (var k = enemies.length - 1; k >= 0; k--) {
var enemy = enemies[k];
if (bullet.intersects(enemy)) {
// Enemy hit
LK.getSound('enemyDeath').play();
LK.effects.flashObject(enemy, 0xFF0000, 300);
// Remove enemy
enemy.destroy();
enemies.splice(k, 1);
// Remove bullet
bullet.destroy();
bullets.splice(j, 1);
// Update score
scoreText.setText('Enemies: ' + enemies.length);
// Check if all enemies are defeated
if (enemies.length === 0) {
LK.showYouWin();
}
break;
}
}
}
// Check bullet collisions with player
else if (!bullet.fromPlayer && bullet.intersects(player)) {
// Player hit
LK.getSound('shoot').play();
LK.effects.flashObject(player, 0xFF0000, 300);
// Reduce player health
player.health -= 20; // Each bullet deals 20 damage
healthBar.updateHealth(player.health, player.maxHealth);
// Game over if health is depleted
if (player.health <= 0) {
LK.getSound('playerDeath').play();
LK.effects.flashScreen(0xFF0000, 500);
// Game over
LK.showGameOver();
}
// Remove bullet
bullet.destroy();
bullets.splice(j, 1);
}
}
};