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