User prompt
player and enemi doubble health bar
User prompt
make enemy slow move
User prompt
make player and bos long health bar
User prompt
make player can shoot left direction
User prompt
double jump
Code edit (1 edits merged)
Please save this source code
User prompt
Epic Boss Rush
Initial prompt
boss fight side scrolling game
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.attackPattern = 0;
self.attackCooldown = 1500; // ms
self.canAttack = true;
self.attackTimer = null;
self.movementSpeed = 3;
self.direction = 1; // 1 = right, -1 = left
self.phaseChangeThreshold = 50; // Health threshold for phase change
self.isPhaseTwo = false;
self.update = function () {
// Boss movement
if (!self.isPhaseTwo) {
// Phase 1 movement: back and forth
self.x += self.movementSpeed * self.direction;
if (self.x > 1800 || self.x < 600) {
self.direction *= -1;
}
} else {
// Phase 2 movement: follow player
if (self.x < hero.x - 100) {
self.x += self.movementSpeed * 0.5;
} else if (self.x > hero.x + 100) {
self.x -= self.movementSpeed * 0.5;
}
}
// Attack if possible
if (self.canAttack) {
self.attack();
}
// Check for phase change
if (!self.isPhaseTwo && self.health <= self.phaseChangeThreshold) {
self.enterPhaseTwo();
}
};
self.attack = function () {
self.canAttack = false;
// Different attack patterns
if (self.isPhaseTwo) {
// Phase 2 - more aggressive attacks
switch (Math.floor(Math.random() * 3)) {
case 0:
self.spreadAttack();
break;
case 1:
self.targetedAttack();
break;
case 2:
self.burstAttack();
break;
}
} else {
// Phase 1 - basic attacks
if (Math.random() > 0.5) {
self.singleAttack();
} else {
self.targetedAttack();
}
}
// Reset attack cooldown
self.attackTimer = LK.setTimeout(function () {
self.canAttack = true;
}, self.attackCooldown);
};
self.singleAttack = function () {
var projectile = new BossProjectile();
projectile.x = self.x;
projectile.y = self.y;
game.addChild(projectile);
bossProjectiles.push(projectile);
};
self.spreadAttack = function () {
for (var i = -2; i <= 2; i++) {
var projectile = new BossProjectile();
projectile.x = self.x;
projectile.y = self.y;
projectile.velocityX = -5 + i * 2;
projectile.velocityY = 5;
game.addChild(projectile);
bossProjectiles.push(projectile);
}
};
self.targetedAttack = function () {
var projectile = new BossProjectile();
projectile.x = self.x;
projectile.y = self.y;
// Calculate direction toward player
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var angle = Math.atan2(dy, dx);
projectile.velocityX = Math.cos(angle) * 8;
projectile.velocityY = Math.sin(angle) * 8;
game.addChild(projectile);
bossProjectiles.push(projectile);
};
self.burstAttack = function () {
var projectileCount = 8;
for (var i = 0; i < projectileCount; i++) {
var angle = i / projectileCount * Math.PI * 2;
var projectile = new BossProjectile();
projectile.x = self.x;
projectile.y = self.y;
projectile.velocityX = Math.cos(angle) * 6;
projectile.velocityY = Math.sin(angle) * 6;
game.addChild(projectile);
bossProjectiles.push(projectile);
}
};
self.takeDamage = function (damage) {
self.health -= damage;
// Flash boss red
LK.effects.flashObject(self, 0xff0000, 300);
if (self.health <= 0) {
self.health = 0;
self.onDefeat();
}
updateBossHealthBar();
LK.getSound('hit').play();
};
self.enterPhaseTwo = function () {
self.isPhaseTwo = true;
self.attackCooldown = 1000; // Faster attacks in phase 2
self.movementSpeed = 4; // Faster movement
// Flash the boss to indicate phase change
LK.effects.flashObject(self, 0xffff00, 1000);
// Clear any existing attack timer and reset
if (self.attackTimer) {
LK.clearTimeout(self.attackTimer);
}
self.canAttack = true;
};
self.onDefeat = function () {
LK.getSound('bossDeath').play();
LK.showYouWin();
};
return self;
});
var BossProjectile = Container.expand(function () {
var self = Container.call(this);
var projectileGraphics = self.attachAsset('projectile', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = -7;
self.velocityY = 0;
self.damage = 15;
self.update = function () {
self.x += self.velocityX;
self.y += self.velocityY;
// Remove if off screen
if (self.x < -projectileGraphics.width || self.x > 2048 + projectileGraphics.width || self.y < -projectileGraphics.height || self.y > 2732 + projectileGraphics.height) {
self.destroy();
var index = bossProjectiles.indexOf(self);
if (index !== -1) {
bossProjectiles.splice(index, 1);
}
}
};
return self;
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 100;
self.maxHealth = 100;
self.speed = 7;
self.jumpForce = -15;
self.gravity = 0.7;
self.velocityY = 0;
self.isJumping = false;
self.isGrounded = false;
self.canShoot = true;
self.shootCooldown = 400; // ms
self.invulnerable = false;
self.invulnerabilityTime = 1000; // ms
self.update = function () {
// Apply gravity
self.velocityY += self.gravity;
self.y += self.velocityY;
// Check if hero is on ground
if (self.y >= groundLevel - heroGraphics.height / 2) {
self.y = groundLevel - heroGraphics.height / 2;
self.velocityY = 0;
self.isGrounded = true;
self.isJumping = false;
} else {
self.isGrounded = false;
}
// Keep hero within game boundaries
if (self.x < heroGraphics.width / 2) {
self.x = heroGraphics.width / 2;
} else if (self.x > 2048 - heroGraphics.width / 2) {
self.x = 2048 - heroGraphics.width / 2;
}
};
self.jump = function () {
if (self.isGrounded && !self.isJumping) {
self.velocityY = self.jumpForce;
self.isJumping = true;
self.isGrounded = false;
}
};
self.shoot = function () {
if (!self.canShoot) {
return;
}
var projectile = new HeroProjectile();
projectile.x = self.x + 50;
projectile.y = self.y;
game.addChild(projectile);
projectiles.push(projectile);
LK.getSound('shoot').play();
self.canShoot = false;
LK.setTimeout(function () {
self.canShoot = true;
}, self.shootCooldown);
};
self.takeDamage = function (damage) {
if (self.invulnerable) {
return;
}
self.health -= damage;
if (self.health <= 0) {
self.health = 0;
LK.showGameOver();
}
LK.getSound('playerHit').play();
updateHealthBar();
// Flash hero and make invulnerable temporarily
self.invulnerable = true;
LK.effects.flashObject(self, 0xffffff, 1000);
LK.setTimeout(function () {
self.invulnerable = false;
}, self.invulnerabilityTime);
};
return self;
});
var HeroProjectile = Container.expand(function () {
var self = Container.call(this);
var projectileGraphics = self.attachAsset('heroProjectile', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 15;
self.damage = 10;
self.update = function () {
self.x += self.velocityX;
// Remove if off screen
if (self.x > 2048 + projectileGraphics.width) {
self.destroy();
var index = projectiles.indexOf(self);
if (index !== -1) {
projectiles.splice(index, 1);
}
}
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x34495e
});
/****
* Game Code
****/
// Game variables
var hero;
var boss;
var platforms = [];
var projectiles = [];
var bossProjectiles = [];
var groundLevel = 2400;
var heroHealthBar;
var heroHealthBarBg;
var bossHealthBar;
var bossHealthBarBg;
var moveLeftBtn;
var moveRightBtn;
var jumpBtn;
var shootBtn;
var pressedLeft = false;
var pressedRight = false;
// Set up game environment
function setupGame() {
// Create hero
hero = new Hero();
hero.x = 400;
hero.y = groundLevel - hero.height / 2;
game.addChild(hero);
// Create boss
boss = new Boss();
boss.x = 1600;
boss.y = groundLevel - boss.height / 2;
game.addChild(boss);
// Create platforms
createPlatforms();
// Create UI
createUI();
// Start background music
LK.playMusic('battleMusic');
}
function createPlatforms() {
// Ground platform
var ground = new Platform();
ground.x = 1024;
ground.y = groundLevel + 20;
ground.scaleX = 5.12; // Cover full width (2048 / 400)
game.addChild(ground);
platforms.push(ground);
// Add some floating platforms
var platformPositions = [{
x: 600,
y: 2200
}, {
x: 1200,
y: 2100
}, {
x: 1800,
y: 2200
}, {
x: 1000,
y: 2000
}, {
x: 1500,
y: 1900
}];
for (var i = 0; i < platformPositions.length; i++) {
var platform = new Platform();
platform.x = platformPositions[i].x;
platform.y = platformPositions[i].y;
game.addChild(platform);
platforms.push(platform);
}
}
function createUI() {
// Create hero health bar background
heroHealthBarBg = LK.getAsset('healthBarBackground', {
anchorX: 0,
anchorY: 0.5,
x: 20,
y: 50
});
LK.gui.topLeft.addChild(heroHealthBarBg);
// Create hero health bar
heroHealthBar = LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0.5,
x: 20,
y: 50
});
LK.gui.topLeft.addChild(heroHealthBar);
// Create boss health bar background
bossHealthBarBg = LK.getAsset('healthBarBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 50
});
LK.gui.top.addChild(bossHealthBarBg);
// Create boss health bar
bossHealthBar = LK.getAsset('healthBar', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 50
});
LK.gui.top.addChild(bossHealthBar);
// Create control buttons
createControlButtons();
}
function createControlButtons() {
// Left movement button
moveLeftBtn = LK.getAsset('platform', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5,
x: 150,
y: -150
});
moveLeftBtn.width = 150;
moveLeftBtn.height = 150;
moveLeftBtn.tint = 0x3498db;
LK.gui.bottomLeft.addChild(moveLeftBtn);
// Right movement button
moveRightBtn = LK.getAsset('platform', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5,
x: 320,
y: -150
});
moveRightBtn.width = 150;
moveRightBtn.height = 150;
moveRightBtn.tint = 0x3498db;
LK.gui.bottomLeft.addChild(moveRightBtn);
// Jump button
jumpBtn = LK.getAsset('platform', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5,
x: -150,
y: -150
});
jumpBtn.width = 150;
jumpBtn.height = 150;
jumpBtn.tint = 0x2ecc71;
LK.gui.bottomRight.addChild(jumpBtn);
// Shoot button
shootBtn = LK.getAsset('platform', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5,
x: -320,
y: -150
});
shootBtn.width = 150;
shootBtn.height = 150;
shootBtn.tint = 0xe74c3c;
LK.gui.bottomRight.addChild(shootBtn);
// Add event handlers
moveLeftBtn.interactive = true;
moveRightBtn.interactive = true;
jumpBtn.interactive = true;
shootBtn.interactive = true;
// Setup button events
moveLeftBtn.down = function () {
pressedLeft = true;
};
moveLeftBtn.up = function () {
pressedLeft = false;
};
moveRightBtn.down = function () {
pressedRight = true;
};
moveRightBtn.up = function () {
pressedRight = false;
};
jumpBtn.down = function () {
hero.jump();
};
shootBtn.down = function () {
hero.shoot();
};
}
function updateHealthBar() {
var healthPercentage = hero.health / hero.maxHealth;
heroHealthBar.scaleX = healthPercentage;
}
function updateBossHealthBar() {
var healthPercentage = boss.health / boss.maxHealth;
bossHealthBar.scaleX = healthPercentage;
}
function checkCollisions() {
// Check hero-boss collision
if (hero.intersects(boss) && !hero.invulnerable) {
hero.takeDamage(20);
// Knock hero back
hero.velocityY = -10;
if (hero.x < boss.x) {
hero.x -= 100;
} else {
hero.x += 100;
}
}
// Check platform collisions for hero
for (var i = 0; i < platforms.length; i++) {
var platform = platforms[i];
// Only check if hero is falling
if (hero.velocityY > 0) {
var heroPrevY = hero.y - hero.velocityY;
// Check if hero was above platform in previous frame
if (heroPrevY + hero.height / 2 <= platform.y - platform.height / 2) {
// Check if hero is now colliding with platform
if (hero.intersects(platform)) {
hero.y = platform.y - platform.height / 2 - hero.height / 2;
hero.velocityY = 0;
hero.isGrounded = true;
hero.isJumping = false;
}
}
}
}
// Check hero projectile collisions with boss
for (var j = projectiles.length - 1; j >= 0; j--) {
var projectile = projectiles[j];
if (projectile.intersects(boss)) {
boss.takeDamage(projectile.damage);
// Remove projectile
projectile.destroy();
projectiles.splice(j, 1);
}
}
// Check boss projectile collisions with hero
for (var k = bossProjectiles.length - 1; k >= 0; k--) {
var bossProjectile = bossProjectiles[k];
if (bossProjectile.intersects(hero) && !hero.invulnerable) {
hero.takeDamage(bossProjectile.damage);
// Remove projectile
bossProjectile.destroy();
bossProjectiles.splice(k, 1);
}
}
}
function handleGameInput() {
// Handle movement based on button states
if (pressedLeft) {
hero.x -= hero.speed;
}
if (pressedRight) {
hero.x += hero.speed;
}
}
// Set up game
setupGame();
// Game update loop
game.update = function () {
// Update hero
hero.update();
// Update boss
boss.update();
// Update projectiles
for (var i = 0; i < projectiles.length; i++) {
projectiles[i].update();
}
for (var j = 0; j < bossProjectiles.length; j++) {
bossProjectiles[j].update();
}
// Handle input
handleGameInput();
// Check collisions
checkCollisions();
};
// Touch events for the game area
game.down = function (x, y, obj) {
// Check if touch was on control buttons
var touchPoint = {
x: x,
y: y
};
var moveLeftPos = moveLeftBtn.parent.toGlobal(moveLeftBtn.position);
var moveRightPos = moveRightBtn.parent.toGlobal(moveRightBtn.position);
var jumpPos = jumpBtn.parent.toGlobal(jumpBtn.position);
var shootPos = shootBtn.parent.toGlobal(shootBtn.position);
// Simple distance check for buttons
if (distance(touchPoint, moveLeftPos) < 75) {
pressedLeft = true;
} else if (distance(touchPoint, moveRightPos) < 75) {
pressedRight = true;
} else if (distance(touchPoint, jumpPos) < 75) {
hero.jump();
} else if (distance(touchPoint, shootPos) < 75) {
hero.shoot();
}
};
game.up = function (x, y, obj) {
// Stop movement when touch is released
pressedLeft = false;
pressedRight = false;
};
// Helper function to calculate distance between points
function distance(p1, p2) {
return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
} ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,593 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Boss = Container.expand(function () {
+ var self = Container.call(this);
+ var bossGraphics = self.attachAsset('boss', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 100;
+ self.maxHealth = 100;
+ self.attackPattern = 0;
+ self.attackCooldown = 1500; // ms
+ self.canAttack = true;
+ self.attackTimer = null;
+ self.movementSpeed = 3;
+ self.direction = 1; // 1 = right, -1 = left
+ self.phaseChangeThreshold = 50; // Health threshold for phase change
+ self.isPhaseTwo = false;
+ self.update = function () {
+ // Boss movement
+ if (!self.isPhaseTwo) {
+ // Phase 1 movement: back and forth
+ self.x += self.movementSpeed * self.direction;
+ if (self.x > 1800 || self.x < 600) {
+ self.direction *= -1;
+ }
+ } else {
+ // Phase 2 movement: follow player
+ if (self.x < hero.x - 100) {
+ self.x += self.movementSpeed * 0.5;
+ } else if (self.x > hero.x + 100) {
+ self.x -= self.movementSpeed * 0.5;
+ }
+ }
+ // Attack if possible
+ if (self.canAttack) {
+ self.attack();
+ }
+ // Check for phase change
+ if (!self.isPhaseTwo && self.health <= self.phaseChangeThreshold) {
+ self.enterPhaseTwo();
+ }
+ };
+ self.attack = function () {
+ self.canAttack = false;
+ // Different attack patterns
+ if (self.isPhaseTwo) {
+ // Phase 2 - more aggressive attacks
+ switch (Math.floor(Math.random() * 3)) {
+ case 0:
+ self.spreadAttack();
+ break;
+ case 1:
+ self.targetedAttack();
+ break;
+ case 2:
+ self.burstAttack();
+ break;
+ }
+ } else {
+ // Phase 1 - basic attacks
+ if (Math.random() > 0.5) {
+ self.singleAttack();
+ } else {
+ self.targetedAttack();
+ }
+ }
+ // Reset attack cooldown
+ self.attackTimer = LK.setTimeout(function () {
+ self.canAttack = true;
+ }, self.attackCooldown);
+ };
+ self.singleAttack = function () {
+ var projectile = new BossProjectile();
+ projectile.x = self.x;
+ projectile.y = self.y;
+ game.addChild(projectile);
+ bossProjectiles.push(projectile);
+ };
+ self.spreadAttack = function () {
+ for (var i = -2; i <= 2; i++) {
+ var projectile = new BossProjectile();
+ projectile.x = self.x;
+ projectile.y = self.y;
+ projectile.velocityX = -5 + i * 2;
+ projectile.velocityY = 5;
+ game.addChild(projectile);
+ bossProjectiles.push(projectile);
+ }
+ };
+ self.targetedAttack = function () {
+ var projectile = new BossProjectile();
+ projectile.x = self.x;
+ projectile.y = self.y;
+ // Calculate direction toward player
+ var dx = hero.x - self.x;
+ var dy = hero.y - self.y;
+ var angle = Math.atan2(dy, dx);
+ projectile.velocityX = Math.cos(angle) * 8;
+ projectile.velocityY = Math.sin(angle) * 8;
+ game.addChild(projectile);
+ bossProjectiles.push(projectile);
+ };
+ self.burstAttack = function () {
+ var projectileCount = 8;
+ for (var i = 0; i < projectileCount; i++) {
+ var angle = i / projectileCount * Math.PI * 2;
+ var projectile = new BossProjectile();
+ projectile.x = self.x;
+ projectile.y = self.y;
+ projectile.velocityX = Math.cos(angle) * 6;
+ projectile.velocityY = Math.sin(angle) * 6;
+ game.addChild(projectile);
+ bossProjectiles.push(projectile);
+ }
+ };
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ // Flash boss red
+ LK.effects.flashObject(self, 0xff0000, 300);
+ if (self.health <= 0) {
+ self.health = 0;
+ self.onDefeat();
+ }
+ updateBossHealthBar();
+ LK.getSound('hit').play();
+ };
+ self.enterPhaseTwo = function () {
+ self.isPhaseTwo = true;
+ self.attackCooldown = 1000; // Faster attacks in phase 2
+ self.movementSpeed = 4; // Faster movement
+ // Flash the boss to indicate phase change
+ LK.effects.flashObject(self, 0xffff00, 1000);
+ // Clear any existing attack timer and reset
+ if (self.attackTimer) {
+ LK.clearTimeout(self.attackTimer);
+ }
+ self.canAttack = true;
+ };
+ self.onDefeat = function () {
+ LK.getSound('bossDeath').play();
+ LK.showYouWin();
+ };
+ return self;
+});
+var BossProjectile = Container.expand(function () {
+ var self = Container.call(this);
+ var projectileGraphics = self.attachAsset('projectile', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.velocityX = -7;
+ self.velocityY = 0;
+ self.damage = 15;
+ self.update = function () {
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ // Remove if off screen
+ if (self.x < -projectileGraphics.width || self.x > 2048 + projectileGraphics.width || self.y < -projectileGraphics.height || self.y > 2732 + projectileGraphics.height) {
+ self.destroy();
+ var index = bossProjectiles.indexOf(self);
+ if (index !== -1) {
+ bossProjectiles.splice(index, 1);
+ }
+ }
+ };
+ return self;
+});
+var Hero = Container.expand(function () {
+ var self = Container.call(this);
+ var heroGraphics = self.attachAsset('hero', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 100;
+ self.maxHealth = 100;
+ self.speed = 7;
+ self.jumpForce = -15;
+ self.gravity = 0.7;
+ self.velocityY = 0;
+ self.isJumping = false;
+ self.isGrounded = false;
+ self.canShoot = true;
+ self.shootCooldown = 400; // ms
+ self.invulnerable = false;
+ self.invulnerabilityTime = 1000; // ms
+ self.update = function () {
+ // Apply gravity
+ self.velocityY += self.gravity;
+ self.y += self.velocityY;
+ // Check if hero is on ground
+ if (self.y >= groundLevel - heroGraphics.height / 2) {
+ self.y = groundLevel - heroGraphics.height / 2;
+ self.velocityY = 0;
+ self.isGrounded = true;
+ self.isJumping = false;
+ } else {
+ self.isGrounded = false;
+ }
+ // Keep hero within game boundaries
+ if (self.x < heroGraphics.width / 2) {
+ self.x = heroGraphics.width / 2;
+ } else if (self.x > 2048 - heroGraphics.width / 2) {
+ self.x = 2048 - heroGraphics.width / 2;
+ }
+ };
+ self.jump = function () {
+ if (self.isGrounded && !self.isJumping) {
+ self.velocityY = self.jumpForce;
+ self.isJumping = true;
+ self.isGrounded = false;
+ }
+ };
+ self.shoot = function () {
+ if (!self.canShoot) {
+ return;
+ }
+ var projectile = new HeroProjectile();
+ projectile.x = self.x + 50;
+ projectile.y = self.y;
+ game.addChild(projectile);
+ projectiles.push(projectile);
+ LK.getSound('shoot').play();
+ self.canShoot = false;
+ LK.setTimeout(function () {
+ self.canShoot = true;
+ }, self.shootCooldown);
+ };
+ self.takeDamage = function (damage) {
+ if (self.invulnerable) {
+ return;
+ }
+ self.health -= damage;
+ if (self.health <= 0) {
+ self.health = 0;
+ LK.showGameOver();
+ }
+ LK.getSound('playerHit').play();
+ updateHealthBar();
+ // Flash hero and make invulnerable temporarily
+ self.invulnerable = true;
+ LK.effects.flashObject(self, 0xffffff, 1000);
+ LK.setTimeout(function () {
+ self.invulnerable = false;
+ }, self.invulnerabilityTime);
+ };
+ return self;
+});
+var HeroProjectile = Container.expand(function () {
+ var self = Container.call(this);
+ var projectileGraphics = self.attachAsset('heroProjectile', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.velocityX = 15;
+ self.damage = 10;
+ self.update = function () {
+ self.x += self.velocityX;
+ // Remove if off screen
+ if (self.x > 2048 + projectileGraphics.width) {
+ self.destroy();
+ var index = projectiles.indexOf(self);
+ if (index !== -1) {
+ projectiles.splice(index, 1);
+ }
+ }
+ };
+ return self;
+});
+var Platform = Container.expand(function () {
+ var self = Container.call(this);
+ var platformGraphics = self.attachAsset('platform', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x34495e
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var hero;
+var boss;
+var platforms = [];
+var projectiles = [];
+var bossProjectiles = [];
+var groundLevel = 2400;
+var heroHealthBar;
+var heroHealthBarBg;
+var bossHealthBar;
+var bossHealthBarBg;
+var moveLeftBtn;
+var moveRightBtn;
+var jumpBtn;
+var shootBtn;
+var pressedLeft = false;
+var pressedRight = false;
+// Set up game environment
+function setupGame() {
+ // Create hero
+ hero = new Hero();
+ hero.x = 400;
+ hero.y = groundLevel - hero.height / 2;
+ game.addChild(hero);
+ // Create boss
+ boss = new Boss();
+ boss.x = 1600;
+ boss.y = groundLevel - boss.height / 2;
+ game.addChild(boss);
+ // Create platforms
+ createPlatforms();
+ // Create UI
+ createUI();
+ // Start background music
+ LK.playMusic('battleMusic');
+}
+function createPlatforms() {
+ // Ground platform
+ var ground = new Platform();
+ ground.x = 1024;
+ ground.y = groundLevel + 20;
+ ground.scaleX = 5.12; // Cover full width (2048 / 400)
+ game.addChild(ground);
+ platforms.push(ground);
+ // Add some floating platforms
+ var platformPositions = [{
+ x: 600,
+ y: 2200
+ }, {
+ x: 1200,
+ y: 2100
+ }, {
+ x: 1800,
+ y: 2200
+ }, {
+ x: 1000,
+ y: 2000
+ }, {
+ x: 1500,
+ y: 1900
+ }];
+ for (var i = 0; i < platformPositions.length; i++) {
+ var platform = new Platform();
+ platform.x = platformPositions[i].x;
+ platform.y = platformPositions[i].y;
+ game.addChild(platform);
+ platforms.push(platform);
+ }
+}
+function createUI() {
+ // Create hero health bar background
+ heroHealthBarBg = LK.getAsset('healthBarBackground', {
+ anchorX: 0,
+ anchorY: 0.5,
+ x: 20,
+ y: 50
+ });
+ LK.gui.topLeft.addChild(heroHealthBarBg);
+ // Create hero health bar
+ heroHealthBar = LK.getAsset('healthBar', {
+ anchorX: 0,
+ anchorY: 0.5,
+ x: 20,
+ y: 50
+ });
+ LK.gui.topLeft.addChild(heroHealthBar);
+ // Create boss health bar background
+ bossHealthBarBg = LK.getAsset('healthBarBackground', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 0,
+ y: 50
+ });
+ LK.gui.top.addChild(bossHealthBarBg);
+ // Create boss health bar
+ bossHealthBar = LK.getAsset('healthBar', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 0,
+ y: 50
+ });
+ LK.gui.top.addChild(bossHealthBar);
+ // Create control buttons
+ createControlButtons();
+}
+function createControlButtons() {
+ // Left movement button
+ moveLeftBtn = LK.getAsset('platform', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.5,
+ x: 150,
+ y: -150
+ });
+ moveLeftBtn.width = 150;
+ moveLeftBtn.height = 150;
+ moveLeftBtn.tint = 0x3498db;
+ LK.gui.bottomLeft.addChild(moveLeftBtn);
+ // Right movement button
+ moveRightBtn = LK.getAsset('platform', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.5,
+ x: 320,
+ y: -150
+ });
+ moveRightBtn.width = 150;
+ moveRightBtn.height = 150;
+ moveRightBtn.tint = 0x3498db;
+ LK.gui.bottomLeft.addChild(moveRightBtn);
+ // Jump button
+ jumpBtn = LK.getAsset('platform', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.5,
+ x: -150,
+ y: -150
+ });
+ jumpBtn.width = 150;
+ jumpBtn.height = 150;
+ jumpBtn.tint = 0x2ecc71;
+ LK.gui.bottomRight.addChild(jumpBtn);
+ // Shoot button
+ shootBtn = LK.getAsset('platform', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.5,
+ x: -320,
+ y: -150
+ });
+ shootBtn.width = 150;
+ shootBtn.height = 150;
+ shootBtn.tint = 0xe74c3c;
+ LK.gui.bottomRight.addChild(shootBtn);
+ // Add event handlers
+ moveLeftBtn.interactive = true;
+ moveRightBtn.interactive = true;
+ jumpBtn.interactive = true;
+ shootBtn.interactive = true;
+ // Setup button events
+ moveLeftBtn.down = function () {
+ pressedLeft = true;
+ };
+ moveLeftBtn.up = function () {
+ pressedLeft = false;
+ };
+ moveRightBtn.down = function () {
+ pressedRight = true;
+ };
+ moveRightBtn.up = function () {
+ pressedRight = false;
+ };
+ jumpBtn.down = function () {
+ hero.jump();
+ };
+ shootBtn.down = function () {
+ hero.shoot();
+ };
+}
+function updateHealthBar() {
+ var healthPercentage = hero.health / hero.maxHealth;
+ heroHealthBar.scaleX = healthPercentage;
+}
+function updateBossHealthBar() {
+ var healthPercentage = boss.health / boss.maxHealth;
+ bossHealthBar.scaleX = healthPercentage;
+}
+function checkCollisions() {
+ // Check hero-boss collision
+ if (hero.intersects(boss) && !hero.invulnerable) {
+ hero.takeDamage(20);
+ // Knock hero back
+ hero.velocityY = -10;
+ if (hero.x < boss.x) {
+ hero.x -= 100;
+ } else {
+ hero.x += 100;
+ }
+ }
+ // Check platform collisions for hero
+ for (var i = 0; i < platforms.length; i++) {
+ var platform = platforms[i];
+ // Only check if hero is falling
+ if (hero.velocityY > 0) {
+ var heroPrevY = hero.y - hero.velocityY;
+ // Check if hero was above platform in previous frame
+ if (heroPrevY + hero.height / 2 <= platform.y - platform.height / 2) {
+ // Check if hero is now colliding with platform
+ if (hero.intersects(platform)) {
+ hero.y = platform.y - platform.height / 2 - hero.height / 2;
+ hero.velocityY = 0;
+ hero.isGrounded = true;
+ hero.isJumping = false;
+ }
+ }
+ }
+ }
+ // Check hero projectile collisions with boss
+ for (var j = projectiles.length - 1; j >= 0; j--) {
+ var projectile = projectiles[j];
+ if (projectile.intersects(boss)) {
+ boss.takeDamage(projectile.damage);
+ // Remove projectile
+ projectile.destroy();
+ projectiles.splice(j, 1);
+ }
+ }
+ // Check boss projectile collisions with hero
+ for (var k = bossProjectiles.length - 1; k >= 0; k--) {
+ var bossProjectile = bossProjectiles[k];
+ if (bossProjectile.intersects(hero) && !hero.invulnerable) {
+ hero.takeDamage(bossProjectile.damage);
+ // Remove projectile
+ bossProjectile.destroy();
+ bossProjectiles.splice(k, 1);
+ }
+ }
+}
+function handleGameInput() {
+ // Handle movement based on button states
+ if (pressedLeft) {
+ hero.x -= hero.speed;
+ }
+ if (pressedRight) {
+ hero.x += hero.speed;
+ }
+}
+// Set up game
+setupGame();
+// Game update loop
+game.update = function () {
+ // Update hero
+ hero.update();
+ // Update boss
+ boss.update();
+ // Update projectiles
+ for (var i = 0; i < projectiles.length; i++) {
+ projectiles[i].update();
+ }
+ for (var j = 0; j < bossProjectiles.length; j++) {
+ bossProjectiles[j].update();
+ }
+ // Handle input
+ handleGameInput();
+ // Check collisions
+ checkCollisions();
+};
+// Touch events for the game area
+game.down = function (x, y, obj) {
+ // Check if touch was on control buttons
+ var touchPoint = {
+ x: x,
+ y: y
+ };
+ var moveLeftPos = moveLeftBtn.parent.toGlobal(moveLeftBtn.position);
+ var moveRightPos = moveRightBtn.parent.toGlobal(moveRightBtn.position);
+ var jumpPos = jumpBtn.parent.toGlobal(jumpBtn.position);
+ var shootPos = shootBtn.parent.toGlobal(shootBtn.position);
+ // Simple distance check for buttons
+ if (distance(touchPoint, moveLeftPos) < 75) {
+ pressedLeft = true;
+ } else if (distance(touchPoint, moveRightPos) < 75) {
+ pressedRight = true;
+ } else if (distance(touchPoint, jumpPos) < 75) {
+ hero.jump();
+ } else if (distance(touchPoint, shootPos) < 75) {
+ hero.shoot();
+ }
+};
+game.up = function (x, y, obj) {
+ // Stop movement when touch is released
+ pressedLeft = false;
+ pressedRight = false;
+};
+// Helper function to calculate distance between points
+function distance(p1, p2) {
+ return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
+}
\ No newline at end of file
chibi mario bross stand fight Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
chibi fat bowser left pose. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
rock pattern. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
chibi fire ball. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
8 bit image dark castle corridor cartoon style. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows