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 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 = 3;
self.platform = null;
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 = Math.floor(Math.random() * 120) + 60; // Random interval between 1-3 seconds
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) {
self.shoot();
self.shootCooldown = 0;
self.shootInterval = Math.floor(Math.random() * 120) + 60;
}
};
// Override shoot method
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 = 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 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;
// 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: 3', {
size: 60,
fill: 0xFFFFFF
});
jumpIndicator.anchor.set(0, 0);
jumpIndicator.x = 50;
LK.gui.top.addChild(jumpIndicator);
// 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)
var platformPositions = [{
x: 200,
y: 2300,
scale: 1
}, {
x: 1200,
y: 2300,
scale: 1
}, {
x: 500,
y: 2000,
scale: 1.2
}, {
x: 1300,
y: 1700,
scale: 1
}, {
x: 200,
y: 1400,
scale: 1.1
}, {
x: 900,
y: 1100,
scale: 1.3
}];
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 than the player
var enemyPositions = [{
x: 300,
platform: 1
}, {
x: 1300,
platform: 2
}, {
x: 700,
platform: 3
}, {
x: 1400,
platform: 4
}, {
x: 300,
platform: 5
}];
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];
game.addChild(player);
}
// Initialize game
function initGame() {
// 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 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('playerDeath').play();
LK.effects.flashObject(player, 0xFF0000, 300);
LK.effects.flashScreen(0xFF0000, 500);
// Game over
LK.showGameOver();
// Remove bullet
bullet.destroy();
bullets.splice(j, 1);
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -68,13 +68,20 @@
self.jumpForce = -20;
self.gravity = 1;
self.isJumping = false;
self.isGrounded = false;
+ self.jumpsRemaining = 0;
+ self.maxJumps = 3;
self.platform = null;
self.jump = function () {
- if (self.isGrounded) {
+ 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();
}
};
@@ -129,8 +136,9 @@
// 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;
@@ -241,8 +249,9 @@
var enemies = [];
var bullets = [];
var leftButton, rightButton, jumpButton, shootButton;
var scoreText;
+var jumpIndicator;
// Setup game UI
function setupUI() {
// Create score display
scoreText = new Text2('Enemies: ' + enemies.length, {
@@ -250,8 +259,16 @@
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
+ // Create jump counter display
+ jumpIndicator = new Text2('Jumps: 3', {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ jumpIndicator.anchor.set(0, 0);
+ jumpIndicator.x = 50;
+ LK.gui.top.addChild(jumpIndicator);
// Create control buttons
leftButton = new ControlButton('←');
leftButton.x = 150;
leftButton.y = 2500;
@@ -413,8 +430,12 @@
player.stopMoving();
}
// Update player
player.update();
+ // Update jump indicator text
+ if (jumpIndicator) {
+ jumpIndicator.setText("Jumps: " + (player.isGrounded ? player.maxJumps : player.jumpsRemaining));
+ }
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].update();
}