User prompt
Fix diamond asset not appearing in screen
User prompt
All types enemies MUST drop at least 1 to 10 coins and 1 to 5 diamonds
User prompt
Add diamonds as drop from killed enemies
User prompt
All enemies should drop 1 to 5 diamonds too
User prompt
All enemies drop 1 to 10 coins
User prompt
All enemies must drop 1 to 5 coins or 1 to 3 diamonds
User prompt
20% chance for drop diamond from enemies
User prompt
Drop amount from killed enemy by explosion is same with the one by bullet
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in this line: 'bombButton.x = frenzyButton.x;' Line Number: 566
User prompt
Fix Bug: 'Cannot read properties of undefined (reading 'height')' in this line: 'thumbstick.y = 2732 - shootButton.height - 100;' Line Number: 553
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'height')' in this line: 'thumbstick.y = 2732 - shootButton.height - 100;' Line Number: 553
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'width')' in this line: 'shieldUpgradeButton.x = multiBulletUpgradeButton.width / 2 + 100;' Line Number: 543
User prompt
FAILURE: Integration failed, target source not found. Please try again.
User prompt
All enemies must drop either coins or diamond when kill by explosion effect
User prompt
Only Big enemy must drop diamonds and coins both
User prompt
Fast enemy can drop 1 to 5 diamond
User prompt
Fast Enemy and regular enemy must drop 1 to 5 coins
User prompt
Add some intro before big enemy go inside screen and increase its move speed when going inside screen
User prompt
Big enemy must drop diamond and coins
User prompt
Big enemy must drop 5 to 10 diamonds and 15 to 25 coins both
User prompt
Add big enemy class which spawn every 25 score, when it spawn no other enemy can spawn, big enemy needs 10 shot to kill
User prompt
Add big enemy
User prompt
Add big enemy class which spawn every 25 score, when it spawn no other enemy can spawn, big enemy needs 10 shot to kill
User prompt
Shield upgrade button increase maximum hp by 25%
User prompt
Explosion effect from bomb button only last 1 sec
/**** * Classes ****/ var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet', 0.5, 0.5); self.speed = 5; self.move = function () { self.y += self.speed; }; }); var HealthBar = Container.expand(function () { var self = Container.call(this); var healthBar = self.createAsset('healthBar', 'Health Bar', 0, 0.5); var backgroundBar = self.createAsset('healthBarBackground', 'Health Bar Background', 0, 0.5); backgroundBar.x = healthBar.x; var healthBar = self.createAsset('healthBar', 'Health Bar', 0, 0.5); healthBar.width = 200; // Initial full health width self.setHealth = function (percentage) { healthBar.width = 200 * percentage; }; }); var ScorePopup = Container.expand(function () { var self = Container.call(this); var scoreText = new Text2('+1', { size: 80, fill: "#ffffff" }); scoreText.anchor.set(0.5, 0.5); self.addChild(scoreText); self.animate = function () { self.y -= 2; if (self.alpha > 0) { self.alpha -= 0.05; } else { self.destroy(); } }; }); // ShootButton class var ShootButton = Container.expand(function () { var self = Container.call(this); var shootButtonGraphics = self.createAsset('shootButton', 'Shoot Button', 0.5, 0.5); self.cooldown = false; self.on('down', function () { if (!self.cooldown) { self.cooldown = true; for (var i = 0; i < hero.bulletCount; i++) { var newBullet = new Bullet(); // Calculate the distance between bullets based on the current bullet count var bulletSpacing = hero.bulletCount > 1 ? hero.width / hero.bulletCount : 0; newBullet.x = hero.x - hero.width / 2 + bulletSpacing * i; newBullet.y = hero.y - hero.children[1].height; if (bullets.length < 40) { bullets.push(newBullet); game.addChild(newBullet); } else { newBullet.destroy(); } } LK.setTimeout(function () { self.cooldown = false; }, 250); } }); }); // Hero class var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = self.createAsset('hero', 'Hero character', 0.5, 0.5); self.maxHealth = 100; // Initialize hero's max health to 100 self.maxShield = 100; // Initialize hero's max shield to 100 self.health = self.maxHealth; // Initialize hero's current health to max health // Direction indicator line var directionLine = self.createAsset('directionLine', 'Direction Indicator', 0.5, 1); directionLine.y = -heroGraphics.height / 2 - 60; // Direction indicator line self.bulletCount = 1; // Initialize with 1 bullet // The update method for the Hero class self.update = function () { // Add hero movement or other periodic update logic here if (self.shield > 0) { var shieldPercentage = self.shield / self.maxShield; self.shieldBar.setShield(shieldPercentage); self.shieldGraphic.updateVisibility(true); self.shieldGraphic.updatePosition(self.x, self.y); } else if (self.shieldGraphic) { self.shieldGraphic.updateVisibility(false); } self.healthBar.setHealth(self.health / self.maxHealth); if (!self.shieldRegenerationTimer) { self.shieldRegenerationTimer = LK.setInterval(function () { if (self.shield < self.maxShield) { self.shield = Math.min(self.shield + self.maxShield * 0.05, self.maxShield); self.shieldBar.setShield(self.shield / self.maxShield); } }, 4000); } }; // Health bar for the hero self.healthBar = game.addChild(new HealthBar()); self.healthBar.x = 50; // Move health bar 50 pixels to the right self.healthBar.y = 2732 - self.healthBar.children[1].height; // Position at the left bottom corner // Initialize shield graphic and shield bar only if shield upgrade has been purchased if (self.shield) { self.shieldGraphic = game.addChild(new ShieldGraphic()); self.shieldGraphic.updatePosition(self.x, self.y); self.shieldGraphic.updateVisibility(false); self.shieldBar = game.addChild(new ShieldBar()); self.shieldBar.x = self.healthBar.x + self.healthBar.children[1].width + 10; // Position shield bar next to health bar self.shieldBar.y = self.healthBar.y; // Align shield bar with health bar } // Regeneration timer for the hero self.regenerationTimer = LK.setInterval(function () { if (self.health < self.maxHealth && self.health > 0) { self.health = Math.min(self.health + 10, self.maxHealth); self.healthBar.setHealth(self.health / self.maxHealth); } }, 4000); // Initialize shield graphic and shield bar only if shield upgrade has been purchased if (self.shield) { self.shieldGraphic = game.addChild(new ShieldGraphic()); self.shieldGraphic.updatePosition(self.x, self.y); self.shieldGraphic.updateVisibility(false); self.shieldBar = game.addChild(new ShieldBar()); self.shieldBar.x = self.healthBar.x + self.healthBar.children[1].width + 10; // Position shield bar next to health bar self.shieldBar.y = self.healthBar.y; // Align shield bar with health bar } }); // Bullet class var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.createAsset('bullet', 'Hero Bullet', 0.5, 0.5); self.speed = -10; self.move = function () { self.y += self.speed; }; }); // Coin class var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.createAsset('coin', 'Coin', 0.5, 0.5); self.value = 1; self.speed = 5; self.move = function () { self.y += self.speed; }; self.collect = function () { self.collect = function () { // Increment total coins collected by 1 totalCoins += 1; // Update the total coins display coinsDisplay.updateCoins(totalCoins); // Create and animate the '+1' text for coins var scorePopup = new ScorePopup(); scorePopup.x = self.x; scorePopup.y = self.y; game.addChild(scorePopup); scorePopups.push(scorePopup); scorePopup.animate(); self.destroy(); }; }; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.createAsset('enemy', 'Enemy character', 0.5, 0.5); self.speed = 1; // Normal enemy speed self.shootTimer = 0; self.shootInterval = 300; // 5 seconds at 60FPS self.move = function (directionX, directionY) { self.x += directionX * self.speed; self.y += directionY * self.speed; self.x = Math.max(0, Math.min(2048 - self.children[0].width, self.x)); self.y += directionY * self.speed; }; self.shoot = function () { if (self.shootTimer >= self.shootInterval) { var enemyBullet = new EnemyBullet(); enemyBullet.x = self.x; enemyBullet.y = self.y + enemyGraphics.height / 2; enemyBullets.push(enemyBullet); game.addChild(enemyBullet); self.shootTimer = 0; } }; }); // FastEnemy class var FastEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.createAsset('fastEnemy', 'Fast Enemy character', 0.5, 0.5); self.speed = 2; // Increased speed for FastEnemy self.shootTimer = 0; self.shootInterval = 150; // 2.5 seconds at 60FPS self.move = function () { var directionX = Math.random() < 0.5 ? -1 : 1; var directionY = 1; self.x += directionX * self.speed; self.y += directionY * self.speed; self.x = Math.max(0, Math.min(2048 - self.children[0].width, self.x)); self.y += directionY * self.speed; }; self.shoot = function () { if (self.shootTimer >= self.shootInterval) { var enemyBullet = new EnemyBullet(); enemyBullet.x = self.x; enemyBullet.y = self.y + enemyGraphics.height / 2; enemyBullets.push(enemyBullet); game.addChild(enemyBullet); self.shootTimer = 0; } }; }); // CoinsDisplay class var CoinsDisplay = Container.expand(function () { var self = Container.call(this); var coinsText = new Text2('Coins: 0', { size: 100, fill: "#ffd700" }); coinsText.anchor.set(0.5, 0); self.addChild(coinsText); self.updateCoins = function (totalCoins) { coinsText.setText('Coins: ' + totalCoins.toString()); }; }); var ShieldBar = Container.expand(function () { var self = Container.call(this); var shieldBar = self.createAsset('shieldBar', 'Shield Bar', 0, 0.5); var backgroundBar = self.createAsset('shieldBarBackground', 'Shield Bar Background', 0, 0.5); backgroundBar.x = shieldBar.x; shieldBar.width = 200; // Initial full shield width self.setShield = function (percentage) { shieldBar.width = 200 * percentage; }; }); var ShieldGraphic = Container.expand(function () { var self = Container.call(this); var shieldGraphic = self.createAsset('shieldGraphic', 'Hero Shield', 0.5, 0.5); self.updatePosition = function (x, y) { self.x = x; self.y = y; }; self.updateVisibility = function (visible) { self.visible = visible; }; }); var HealthOrb = Container.expand(function () { var self = Container.call(this); var orbGraphics = self.createAsset('healthOrb', 'Health Orb', 0.5, 0.5); self.speed = 3; self.move = function () { self.y += self.speed; }; self.collect = function () { if (hero.health < hero.maxHealth) { hero.health = Math.min(hero.health + 20, hero.maxHealth); hero.healthBar.setHealth(hero.health / hero.maxHealth); self.destroy(); } }; }); var Life = Container.expand(function () { var self = Container.call(this); var lifeGraphics = self.createAsset('lifeIcon', 'Life Icon', 0.5, 0.5); }); var LivesDisplay = Container.expand(function () { var self = Container.call(this); self.lives = 3; self.icons = []; for (var i = 0; i < self.lives; i++) { var life = new Life(); life.x = (life.width + 10) * i; self.addChild(life); self.icons.push(life); } self.removeLife = function () { if (self.lives > 0) { self.lives--; var lifeToRemove = self.icons[self.lives]; lifeToRemove.destroy(); self.icons.pop(); } }; }); //{5.1} // DiamondsDisplay class var DiamondsDisplay = Container.expand(function () { var self = Container.call(this); var diamondsText = new Text2('Diamonds: 0', { size: 100, fill: "#b9f2ff" }); diamondsText.anchor.set(0.5, 0); self.addChild(diamondsText); self.updateDiamonds = function (totalDiamonds) { diamondsText.setText('Diamonds: ' + totalDiamonds.toString()); }; }); var FrenzyButton = Container.expand(function () { var self = Container.call(this); var frenzyButtonGraphics = self.createAsset('frenzyButton', 'Frenzy Mode Button', 0.5, 0.5); self.isFrenzyActive = false; self.toggleFrenzyMode = function () { if (!self.isFrenzyActive && !self.cooldownActive) { self.isFrenzyActive = true; fireRate = Math.max(5, fireRate - 10); LK.setTimeout(function () { self.isFrenzyActive = false; fireRate = 30; // Reset fire rate to default when frenzy mode ends self.cooldownActive = true; LK.setTimeout(function () { self.cooldownActive = false; }, 20000); // 20-second cooldown }, 10000); // Frenzy mode lasts only 10 seconds } }; self.on('down', function () { self.toggleFrenzyMode(); }); }); // Diamond class var Diamond = Container.expand(function () { var self = Container.call(this); var diamondGraphics = self.createAsset('diamond', 'Diamond', 0.5, 0.5); self.value = 5; self.speed = 5; self.move = function () { self.y += self.speed; }; self.collect = function () { // Increment total diamonds collected by 1 totalDiamonds += 1; // Update the total diamonds display diamondsDisplay.updateDiamonds(totalDiamonds); // Create and animate the '+1' text for diamonds var scorePopup = new ScorePopup(); scorePopup.x = self.x; scorePopup.y = self.y; game.addChild(scorePopup); scorePopups.push(scorePopup); scorePopup.animate(); self.destroy(); }; }); // Bomb class var Explosion = Container.expand(function () { var self = Container.call(this); var explosionGraphics = self.createAsset('explosion', 'Explosion', 0.5, 0.5); self.explode = function () { LK.setTimeout(function () { self.checkCollisionWithEnemy(); self.destroy(); }, 1000); }; self.checkCollisionWithEnemy = function () { for (var i = enemies.length - 1; i >= 0; i--) { if (self.intersects(enemies[i])) { // Increase score for each enemy destroyed by the explosion score++; scoreTxt.setText(score.toString()); // Spawn a coin or diamond when an enemy is destroyed var dropChance = Math.random(); if (dropChance < 0.2) { // 20% chance to drop a diamond if (diamonds.length < 5) { var newDiamond = new Diamond(); newDiamond.x = enemies[i].x + (Math.random() - 0.5) * enemies[i].children[0].width; newDiamond.y = enemies[i].y; diamonds.push(newDiamond); game.addChild(newDiamond); } } else { // 50% chance to drop a coin if (coins.length < 10) { var newCoin = new Coin(); newCoin.x = enemies[i].x + (Math.random() - 0.5) * enemies[i].children[0].width; newCoin.y = enemies[i].y; newCoin.value = 1; coins.push(newCoin); game.addChild(newCoin); } } enemies[i].destroy(); enemies.splice(i, 1); } } // Check for enemy bullet-explosion collisions for (var j = enemyBullets.length - 1; j >= 0; j--) { if (self.intersects(enemyBullets[j])) { enemyBullets[j].destroy(); enemyBullets.splice(j, 1); } } }; }); // BombButton class var BombButton = Container.expand(function () { var self = Container.call(this); var bombButtonGraphics = self.createAsset('bombButton', 'Bomb Button', 0.5, 0.5); self.cooldown = false; self.on('down', function () { if (!self.cooldown) { self.cooldown = true; var explosion = new Explosion(); explosion.x = 2048 / 2; explosion.y = 2732 / 2 - 500; game.addChild(explosion); explosion.explode(); LK.setTimeout(function () { self.cooldown = false; }, 5000); } }); }); // MagnetButton class var MagnetButton = Container.expand(function () { var self = Container.call(this); var magnetButtonGraphics = self.createAsset('magnetButton', 'Magnet Button', 0.5, 0.5); self.cooldown = false; self.on('down', function () { if (!self.cooldown) { self.cooldown = true; coins.forEach(function (coin) { // Increment total coins collected totalCoins += coin.value; // Update the total coins display coinsDisplay.updateCoins(totalCoins); coin.destroy(); }); coins = []; // Clear the coins array diamonds.forEach(function (diamond) { // Increment total diamonds collected by 1 totalDiamonds += 2; // Update the total diamonds display diamondsDisplay.updateDiamonds(totalDiamonds); diamond.destroy(); }); diamonds = []; // Clear the diamonds array LK.setTimeout(function () { self.cooldown = false; }, 3000); // 3-second cooldown } }); }); var Thumbstick = Container.expand(function () { var self = Container.call(this); var outerCircle = self.createAsset('thumbstickOuter', 'Thumbstick Outer Circle', 0.5, 0.5); var innerCircle = self.createAsset('thumbstickInner', 'Thumbstick Inner Circle', 0.5, 0.5); self.isDragging = false; self.on('down', function (obj) { self.isDragging = true; var pos = obj.event.getLocalPosition(game); innerCircle.position.set(pos.x, pos.y); }); game.on('move', function (obj) { if (self.isDragging) { var pos = obj.event.getLocalPosition(outerCircle); var dx = pos.x - outerCircle.width * 0.5; var dy = pos.y - outerCircle.height * 0.5; var distance = Math.sqrt(dx * dx + dy * dy); var maxDistance = outerCircle.width * 0.5; if (distance > maxDistance) { var angle = Math.atan2(dy, dx); innerCircle.x = Math.cos(angle) * maxDistance; innerCircle.y = Math.sin(angle) * maxDistance; } else { innerCircle.position.set(pos.x, pos.y); } var heroMoveX = Math.min(10, Math.abs(dx * 0.05)) * Math.sign(dx); var heroMoveY = Math.min(10, Math.abs(dy * 0.05)) * Math.sign(dy); hero.x = Math.max(hero.width / 2, Math.min(2048 - hero.width / 2, hero.x + heroMoveX)); hero.y = Math.max(hero.height / 2, Math.min(2732 - hero.height / 2, hero.y + heroMoveY)); } }); game.on('up', function (obj) { self.isDragging = false; innerCircle.position.set(outerCircle.x, outerCircle.y); }); }); var MultiBulletUpgradeButton = Container.expand(function () { var self = Container.call(this); var upgradeButtonGraphics = self.createAsset('multiBulletUpgradeButton', 'Multi Bullet Upgrade Button', 0.5, 0.5); self.on('down', function () { if (totalCoins >= 10 && totalDiamonds >= 5) { hero.bulletCount = Math.min(hero.bulletCount + 1, 5); totalCoins -= 10; totalDiamonds -= 5; coinsDisplay.updateCoins(totalCoins); diamondsDisplay.updateDiamonds(totalDiamonds); } }); }); // ShieldUpgradeButton class var ShieldUpgradeButton = Container.expand(function () { var self = Container.call(this); var shieldButtonGraphics = self.createAsset('shieldButton', 'Shield Upgrade Button', 0.5, 0.5); self.on('down', function () { if (totalCoins >= 20 && totalDiamonds >= 10) { hero.maxHealth = Math.min(hero.maxHealth * 1.25, 200); // Increase max health by 25% up to a limit of 200 hero.health = hero.maxHealth; // Reset health to max after upgrade totalCoins -= 20; totalDiamonds -= 10; coinsDisplay.updateCoins(totalCoins); diamondsDisplay.updateDiamonds(totalDiamonds); hero.healthBar.setHealth(hero.health / hero.maxHealth); // Extend the health bar's width to reflect the increased max health hero.healthBar.children[1].width = hero.healthBar.children[1].width / (hero.maxHealth - 20) * hero.maxHealth; } }); }); var BigEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.createAsset('bigEnemy', 'Big Enemy', 0.5, 0.5); self.health = 10; // Big enemy needs 10 shots to be killed self.speed = 0.5; // Slower speed for BigEnemy self.move = function () { if (self.introAnimation) { if (self.y < 0) { self.y += self.speed * 2; // Double the speed during intro animation } else { self.introAnimation = false; // Stop intro animation once on screen } } else { self.y += self.speed; } }; self.hit = function () { self.health--; if (self.health <= 0) { // Spawn a coin or diamond when BigEnemy is destroyed var diamondDropCount = Math.floor(Math.random() * 6) + 5; // Randomly choose between 5 and 10 diamonds to drop for (var diamondIndex = 0; diamondIndex < diamondDropCount; diamondIndex++) { if (diamonds.length < 10) { var newDiamond = new Diamond(); newDiamond.x = self.x + (Math.random() - 0.5) * self.children[0].width; newDiamond.y = self.y; diamonds.push(newDiamond); game.addChild(newDiamond); } } var coinDropCount = Math.floor(Math.random() * 11) + 15; // Randomly choose between 15 and 25 coins to drop for (var coinIndex = 0; coinIndex < coinDropCount; coinIndex++) { if (coins.length < 25) { var newCoin = new Coin(); newCoin.x = self.x + (Math.random() - 0.5) * self.children[0].width; newCoin.y = self.y; newCoin.value = 1; coins.push(newCoin); game.addChild(newCoin); } } self.destroy(); return true; } return false; }; }); /**** * Initialize Game ****/ // Create frenzy button instance var game = new LK.Game({ icon: 'newGameIcon', // Set the new game icon asset backgroundColor: 0xE0FFD6 //Init game with very light green background }); /**** * Game Code ****/ // Create multi bullet upgrade button instance var multiBulletUpgradeButton = game.addChild(new MultiBulletUpgradeButton()); multiBulletUpgradeButton.x = multiBulletUpgradeButton.width / 2 + 100; multiBulletUpgradeButton.y = 2732 / 2 - multiBulletUpgradeButton.height / 2; // Create shield upgrade button instance var shieldUpgradeButton = game.addChild(new ShieldUpgradeButton()); shieldUpgradeButton.x = multiBulletUpgradeButton.width / 2 + 100; shieldUpgradeButton.y = multiBulletUpgradeButton.y + multiBulletUpgradeButton.height + 20; var multiBulletUpgradeButton = game.addChild(new MultiBulletUpgradeButton()); multiBulletUpgradeButton.x = multiBulletUpgradeButton.width / 2 + 100; multiBulletUpgradeButton.y = 2732 / 2 - multiBulletUpgradeButton.height / 2; var shootButton = game.addChild(new ShootButton()); shootButton.x = 2048 - shootButton.width / 2 - 100; shootButton.y = 2732 - shootButton.height - 100; var thumbstick = game.addChild(new Thumbstick()); thumbstick.x = thumbstick.width / 2 + 100; thumbstick.y = 2732 - shootButton.height - 100; // Create shoot button instance // Create multi bullet upgrade button instance var shootButton = game.addChild(new ShootButton()); shootButton.x = 2048 - shootButton.width / 2 - 100; shootButton.y = 2732 - shootButton.height - 100; var frenzyButton = game.addChild(new FrenzyButton()); frenzyButton.x = 2048 - frenzyButton.width / 2 - 100; frenzyButton.y = 2732 / 2; var bombButton = game.addChild(new BombButton()); bombButton.x = frenzyButton.x; bombButton.y = frenzyButton.y + frenzyButton.height + 20; var frenzyButton = game.addChild(new FrenzyButton()); var magnetButton = game.addChild(new MagnetButton()); magnetButton.x = 2048 - magnetButton.width / 2 - 100; magnetButton.y = bombButton.y + bombButton.height + 20; frenzyButton.x = 2048 - frenzyButton.width / 2 - 100; frenzyButton.y = 2732 / 2; // Initialize important asset arrays, score, coins, diamonds, fire rate, enemy bullets, and explosion var enemyBullets = []; var bullets = []; var enemies = []; var coins = []; // Array to store coin instances var diamonds = []; // Array to store diamond instances var currentExplosion = null; // Variable to store the current explosion instance var fireRate = 30; // Initialize fire rate to 30 var scorePopups = []; // Array to store instances of ScorePopup var totalCoins = 0; // Initialize total coins collected to 0 var totalDiamonds = 0; // Initialize total diamonds collected to 0 var score = 0; // Initialize score to 0 // Create score display var scoreTxt = new Text2(score.toString(), { size: 150, fill: "#000000" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Create coins display instance var coinsDisplay = new CoinsDisplay(); coinsDisplay.scale.set(0.5, 0.5); LK.gui.top.addChild(coinsDisplay); coinsDisplay.y = scoreTxt.height; // Create diamonds display instance var diamondsDisplay = new DiamondsDisplay(); diamondsDisplay.scale.set(0.5, 0.5); LK.gui.top.addChild(diamondsDisplay); diamondsDisplay.y = coinsDisplay.y + coinsDisplay.height; // Create LivesDisplay instance var livesDisplay = game.addChild(new LivesDisplay()); livesDisplay.x = 2048 - (livesDisplay.width + 10 * livesDisplay.lives); livesDisplay.y = 100; // Create hero instance var hero = game.addChild(new Hero()); hero.x = 2048 / 2; hero.y = 2732 - hero.height / 2 - 100; // Position hero a bit more up from the bottom of the screen // Game tick event LK.on('tick', function () { // Spawn HealthOrb every 10 seconds if hero's health is not full if (hero.health < hero.maxHealth && LK.ticks % (10 * 60) == 0) { var healthOrb = new HealthOrb(); healthOrb.x = Math.random() * (2048 - healthOrb.width) + healthOrb.width / 2; healthOrb.y = -healthOrb.height; game.addChild(healthOrb); } // Move enemy bullets and check for collisions with hero for (var i = enemyBullets.length - 1; i >= 0; i--) { enemyBullets[i].move(); if (enemyBullets[i].intersects(hero)) { if (hero.shield > 0) { hero.shield = Math.max(0, hero.shield - 10); } else { hero.health = Math.max(0, hero.health - 10); // Reset the health regeneration timer each time the hero is damaged LK.clearInterval(hero.regenerationTimer); hero.regenerationTimer = LK.setInterval(function () { if (hero.health < hero.maxHealth && hero.health > 0) { hero.health = Math.min(hero.health + 10, hero.maxHealth); hero.healthBar.setHealth(hero.health / hero.maxHealth); } }, 4000); } hero.healthBar.setHealth(hero.health / 100); // Update health bar if (hero.health <= 0) { livesDisplay.removeLife(); if (livesDisplay.lives > 0) { hero.health = hero.maxHealth; hero.healthBar.setHealth(hero.health / hero.maxHealth); } else { LK.showGameOver(); } } enemyBullets[i].destroy(); enemyBullets.splice(i, 1); } else if (enemyBullets[i].y > 2732) { enemyBullets[i].destroy(); enemyBullets.splice(i, 1); } } // Handle enemy shooting for (var j = 0; j < enemies.length; j++) { enemies[j].shootTimer++; if (typeof enemies[j].shoot === 'function') { enemies[j].shoot(); } } // Move bullets for (var i = bullets.length - 1; i >= 0; i--) { bullets[i].move(); if (bullets[i].y < 0) { bullets[i].destroy(); bullets.splice(i, 1); } } // Move enemies and check for collision with hero for (var j = enemies.length - 1; j >= 0; j--) { var directionX = Math.random() < 0.5 ? -1 : 1; var directionY = Math.random() < 0.5 ? 0 : 1; enemies[j].move(directionX, directionY); if (enemies[j].y > 2732) { // Increase score for each enemy reaching the bottom score++; // Update score text scoreTxt.setText(score.toString()); enemies[j].destroy(); enemies.splice(j, 1); } else if (hero.intersects(enemies[j])) { hero.health -= 10; // Reduce hero health by 10 on collision // Reset the health regeneration timer each time the hero is damaged LK.clearInterval(hero.regenerationTimer); hero.regenerationTimer = LK.setInterval(function () { if (hero.health < hero.maxHealth && hero.health > 0) { hero.health = Math.min(hero.health + 10, hero.maxHealth); hero.healthBar.setHealth(hero.health / hero.maxHealth); } }, 4000); if (hero.health <= 0) { livesDisplay.removeLife(); if (livesDisplay.lives > 0) { hero.health = hero.maxHealth; hero.healthBar.setHealth(hero.health / hero.maxHealth); } else { LK.showGameOver(); } } enemies[j].destroy(); enemies.splice(j, 1); } } // Check for bullet-enemy collisions and bullet-enemyBullet collisions for (var b = bullets.length - 1; b >= 0; b--) { for (var eb = enemyBullets.length - 1; eb >= 0; eb--) { if (bullets[b].intersects(enemyBullets[eb])) { bullets[b].destroy(); bullets.splice(b, 1); enemyBullets[eb].destroy(); enemyBullets.splice(eb, 1); break; // Exit the loop after handling collision } } for (var e = enemies.length - 1; e >= 0; e--) { if (bullets[b] && bullets[b].intersects(enemies[e])) { var isBigEnemy = enemies[e] instanceof BigEnemy; var enemyDestroyed = isBigEnemy ? enemies[e].hit() : true; if (enemyDestroyed) { // Increase score and update display score += isBigEnemy ? 5 : 1; // BigEnemy gives more score scoreTxt.setText(score.toString()); // Create and animate the '+1' text var scorePopup = new ScorePopup(); scorePopup.x = enemies[e].x; scorePopup.y = enemies[e].y; game.addChild(scorePopup); // Animate the '+1' text scorePopups.push(scorePopup); scorePopup.animate(); // Destroy the bullet and remove it from the array bullets[b].destroy(); bullets.splice(b, 1); if (!isBigEnemy) { // Spawn a coin or diamond when a regular enemy is destroyed var diamondDropCount = Math.floor(Math.random() * 6) + 5; // Randomly choose between 5 and 10 diamonds to drop for (var diamondIndex = 0; diamondIndex < diamondDropCount; diamondIndex++) { if (diamonds.length < 10) { var newDiamond = new Diamond(); newDiamond.x = enemies[e].x + (Math.random() - 0.5) * enemies[e].children[0].width; newDiamond.y = enemies[e].y; diamonds.push(newDiamond); game.addChild(newDiamond); } } var coinDropCount = Math.floor(Math.random() * 11) + 15; // Randomly choose between 15 and 25 coins to drop for (var coinIndex = 0; coinIndex < coinDropCount; coinIndex++) { if (coins.length < 25) { var newCoin = new Coin(); newCoin.x = enemies[e].x + (Math.random() - 0.5) * enemies[e].children[0].width; newCoin.y = enemies[e].y; newCoin.value = 1; coins.push(newCoin); game.addChild(newCoin); } } } if (!isBigEnemy || enemies[e].health <= 0) { enemies[e].destroy(); enemies.splice(e, 1); } break; } } } } // Move and collect diamonds for (var d = diamonds.length - 1; d >= 0; d--) { diamonds[d].move(); var heroDiamondCollectionArea = new Rectangle(hero.x - hero.width, hero.y - hero.height, hero.width * 3, hero.height * 3); if (heroDiamondCollectionArea.contains(diamonds[d].x, diamonds[d].y)) { // Increment total diamonds collected totalDiamonds += 1; // Update the total diamonds display diamondsDisplay.updateDiamonds(totalDiamonds); diamonds[d].destroy(); diamonds.splice(d, 1); } else if (diamonds[d].y > 2732) { // Remove diamonds that have moved off screen diamonds[d].destroy(); diamonds.splice(d, 1); } } // Move and collect HealthOrb var healthOrbs = game.children.filter(function (child) { return child instanceof HealthOrb; }); for (var h = healthOrbs.length - 1; h >= 0; h--) { healthOrbs[h].move(); if (healthOrbs[h].intersects(hero)) { healthOrbs[h].collect(); } else if (healthOrbs[h].y > 2732) { healthOrbs[h].destroy(); } } // Move and collect coins for (var c = coins.length - 1; c >= 0; c--) { coins[c].move(); var heroCoinCollectionArea = new Rectangle(hero.x - hero.width, hero.y - hero.height, hero.width * 3, hero.height * 3); if (heroCoinCollectionArea.contains(coins[c].x, coins[c].y)) { // Increment total coins collected totalCoins += coins[c].value; // Update the total coins display coinsDisplay.updateCoins(totalCoins); coins[c].destroy(); coins.splice(c, 1); } else if (coins[c].y > 2732) { // Remove coins that have moved off screen coins[c].destroy(); coins.splice(c, 1); } } // Spawn BigEnemy every 25 score and prevent other enemies from spawning when BigEnemy is present if (score % 25 === 0 && score > 0 && enemies.filter(function (e) { return e instanceof BigEnemy; }).length === 0) { var bigEnemy = new BigEnemy(); bigEnemy.x = 1024; // Spawn in the middle of the screen bigEnemy.y = -bigEnemy.children[0].height * 2; // Start further off-screen for intro animation bigEnemy.introAnimation = true; // Flag to indicate the intro animation is playing enemies.push(bigEnemy); game.addChild(bigEnemy); } else if (enemies.filter(function (e) { return e instanceof BigEnemy; }).length === 0) { var enemySpawnRate = frenzyButton.isFrenzyActive ? 120 : 480; if (LK.ticks % enemySpawnRate == 0) { var regularEnemy = new Enemy(); regularEnemy.x = Math.random() * 1024; regularEnemy.y = -50; enemies.push(regularEnemy); game.addChild(regularEnemy); var fastEnemy = new FastEnemy(); fastEnemy.x = Math.random() * 1024 + 1024; fastEnemy.y = -50; enemies.push(fastEnemy); game.addChild(fastEnemy); } } // Check for explosion-enemy collisions // Animate and remove the '+1' text popups for (var p = scorePopups.length - 1; p >= 0; p--) { scorePopups[p].animate(); if (scorePopups[p].alpha <= 0) { scorePopups.splice(p, 1); } } // Update hero hero.update(); });
===================================================================
--- original.js
+++ change.js
@@ -514,9 +514,17 @@
var enemyGraphics = self.createAsset('bigEnemy', 'Big Enemy', 0.5, 0.5);
self.health = 10; // Big enemy needs 10 shots to be killed
self.speed = 0.5; // Slower speed for BigEnemy
self.move = function () {
- self.y += self.speed;
+ if (self.introAnimation) {
+ if (self.y < 0) {
+ self.y += self.speed * 2; // Double the speed during intro animation
+ } else {
+ self.introAnimation = false; // Stop intro animation once on screen
+ }
+ } else {
+ self.y += self.speed;
+ }
};
self.hit = function () {
self.health--;
if (self.health <= 0) {
@@ -840,9 +848,10 @@
return e instanceof BigEnemy;
}).length === 0) {
var bigEnemy = new BigEnemy();
bigEnemy.x = 1024; // Spawn in the middle of the screen
- bigEnemy.y = -bigEnemy.children[0].height;
+ bigEnemy.y = -bigEnemy.children[0].height * 2; // Start further off-screen for intro animation
+ bigEnemy.introAnimation = true; // Flag to indicate the intro animation is playing
enemies.push(bigEnemy);
game.addChild(bigEnemy);
} else if (enemies.filter(function (e) {
return e instanceof BigEnemy;
Coin. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Fighter jet. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Has rocket behind to boost movement to down faster
Explosion. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Medkit. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.