User prompt
Add +1 text near enemy that just got kill
User prompt
Bullet shooting from direction line
User prompt
More up for direction line
User prompt
Move direction line more up
User prompt
Put direction line above hero
User prompt
Fix Bug: 'Uncaught ReferenceError: directionLine is not defined' in this line: 'self.addChild(directionLine);' Line Number: 28
User prompt
Remove direction line
User prompt
Remove direction line under hero
User prompt
Put direction line over hero
User prompt
Fix Bug: 'Uncaught TypeError: Graphics is not a constructor' in this line: 'var directionLine = new Graphics();' Line Number: 29
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'lineStyle')' in this line: 'directionLine.graphics.lineStyle(5, 0xFF0000).moveTo(0, 0).lineTo(0, -50);' Line Number: 30
User prompt
Fix Bug: 'Uncaught TypeError: Graphics is not a constructor' in this line: 'var directionLine = new Graphics();' Line Number: 29
User prompt
Add line above hero to know which direction is hero shooting
User prompt
Maximum addtional bullet is 5
User prompt
Adjust additional bullet position nearer to hero
User prompt
Multi bullet more to mid height
User prompt
Put multi bullet button more up
User prompt
Put multi bullet upgrade button to left screen part
User prompt
Add multi bullet upgrade button that increases bullet shoot from hero by 1 each upgrade, it spends 10 coins and 5 diamonds
User prompt
Remove multi bullet upgrade.
User prompt
Fix Bug: 'Uncaught ReferenceError: fireRateUpgradeButton is not defined' in this line: 'multiBulletUpgradeButton.y = fireRateUpgradeButton.y + fireRateUpgradeButton.height + 20;' Line Number: 297
User prompt
Delete fire rate upgrade
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'y')' in this line: 'multiBulletUpgradeButton.y = fireRateUpgradeButton.y + fireRateUpgradeButton.height + 20;' Line Number: 293
User prompt
Remove fire rate upgrade button
User prompt
Maximum hero speed 10
/**** * Classes ****/ // ShootButton class var ShootButton = Container.expand(function () { var self = Container.call(this); var shootButtonGraphics = self.createAsset('shootButton', 'Shoot Button', 0.5, 0.5); self.on('down', function () { 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 ? 2048 / (hero.bulletCount + 1) : 0; newBullet.x = hero.x + (i - Math.floor(hero.bulletCount / 2)) * bulletSpacing; newBullet.y = hero.y; if (bullets.length < 50) { bullets.push(newBullet); game.addChild(newBullet); } else { newBullet.destroy(); } } }); }); // Hero class var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = self.createAsset('hero', 'Hero character', 0.5, 0.5); 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 }; }); // 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 () { // Collection logic will be implemented in the game logic section }; }); // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.createAsset('enemy', 'Enemy character', 0.5, 0.5); self.speed = 2; self.move = function () { self.y += self.speed; }; }); // 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()); }; }); //{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()); }; }); // FireRateUpgradeButton class var FireRateUpgradeButton = Container.expand(function () { var self = Container.call(this); var upgradeButtonGraphics = self.createAsset('fireRateUpgradeButton', 'Fire Rate Upgrade Button', 0.5, 0.5); self.cost = 5; self.pressCount = 0; self.on('down', function () { if (totalCoins >= self.cost && fireRate > 5 && self.pressCount < 4) { fireRate = Math.max(5, fireRate - 5); totalCoins -= self.cost; coinsDisplay.updateCoins(totalCoins); self.pressCount++; } if (self.pressCount >= 4) { self.interactive = false; self.alpha = 0.5; // Visually indicate that the button is disabled self.visible = false; // Remove the button from the screen } }); }); 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; }, 30000); // 30-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 () { // Collection logic will be implemented in the game logic section }; }); // Bomb class var Bomb = Container.expand(function () { var self = Container.call(this); var bombGraphics = self.createAsset('bomb', 'Bomb', 0.5, 0.5); self.explode = function () { enemies.forEach(function (enemy) { // Determine whether to drop a coin or a diamond var dropChance = Math.random(); if (dropChance < 0.2) { // 20% chance to drop a diamond var newDiamond = new Diamond(); newDiamond.x = enemy.x; newDiamond.y = enemy.y; diamonds.push(newDiamond); game.addChild(newDiamond); } else { // 80% chance to drop a coin var newCoin = new Coin(); newCoin.x = enemy.x; newCoin.y = enemy.y; coins.push(newCoin); game.addChild(newCoin); } // Increase score for each enemy destroyed by the bomb score++; scoreTxt.setText(score.toString()); enemy.destroy(); }); enemies = []; // Clear the enemies array self.destroy(); // Destroy the bomb immediately after explosion }; // Set a timeout to remove the bullet from the game after 0.5 seconds LK.setTimeout(function () { if (self.parent) { self.parent.removeChild(self); } }, 500); }); // 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 bomb = new Bomb(); bomb.x = 2048 / 2; bomb.y = 2732 / 2; game.addChild(bomb); bomb.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 totalDiamonds += 1; // Update the total diamonds display diamondsDisplay.updateDiamonds(totalDiamonds); // Increment total coins collected by diamond value totalCoins += diamond.value; // Update the total coins display coinsDisplay.updateCoins(totalCoins); diamond.destroy(); }); diamonds = []; // Clear the diamonds array LK.setTimeout(function () { self.cooldown = false; }, 3000); // 3-second cooldown } }); }); // MultiBulletUpgradeButton class var MultiBulletUpgradeButton = Container.expand(function () { var self = Container.call(this); var upgradeButtonGraphics = self.createAsset('multiBulletUpgradeButton', 'Multi Bullet Upgrade Button', 0.5, 0.5); self.cost = 5; self.on('down', function () { if (totalDiamonds >= self.cost) { hero.bulletCount = Math.min(5, hero.bulletCount + 1); totalDiamonds -= self.cost; diamondsDisplay.updateDiamonds(totalDiamonds); } }); }); 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); }); }); /**** * Initialize Game ****/ // Create frenzy button instance var game = new LK.Game({ backgroundColor: 0xFFFFFF //Init game with white background }); /**** * Game Code ****/ 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 multiBulletUpgradeButton = game.addChild(new MultiBulletUpgradeButton()); multiBulletUpgradeButton.x = 100; var fireRateUpgradeButton = game.addChild(new FireRateUpgradeButton()); fireRateUpgradeButton.x = 100; fireRateUpgradeButton.y = 2732 / 2; var multiBulletUpgradeButton = game.addChild(new MultiBulletUpgradeButton()); multiBulletUpgradeButton.x = 100; multiBulletUpgradeButton.y = fireRateUpgradeButton.y + fireRateUpgradeButton.height + 20; 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 fireRateUpgradeButton = game.addChild(new FireRateUpgradeButton()); fireRateUpgradeButton.x = 100; fireRateUpgradeButton.y = 2732 / 2; 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, and fire rate var bullets = []; var enemies = []; var coins = []; // Array to store coin instances var diamonds = []; // Array to store diamond instances var fireRate = 30; // Initialize fire rate to 30 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 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 () { // 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--) { enemies[j].move(); if (enemies[j].y > 2732 || hero.intersects(enemies[j])) { LK.showGameOver(); } } // Check for bullet-enemy collisions for (var b = bullets.length - 1; b >= 0; b--) { for (var e = enemies.length - 1; e >= 0; e--) { if (bullets[b].intersects(enemies[e])) { // Increase score and update display score++; scoreTxt.setText(score.toString()); bullets[b].destroy(); bullets.splice(b, 1); // Spawn a coin or diamond when an enemy is destroyed if (Math.random() < 0.2) { // 20% chance to drop a diamond if (diamonds.length < 5) { // Limit the number of diamonds on screen var newDiamond = new Diamond(); newDiamond.x = enemies[e].x; newDiamond.y = enemies[e].y; diamonds.push(newDiamond); game.addChild(newDiamond); } } else if (coins.length < 10) { // 80% chance to drop a coin var newCoin = new Coin(); newCoin.x = enemies[e].x; newCoin.y = enemies[e].y; coins.push(newCoin); game.addChild(newCoin); } enemies[e].destroy(); enemies.splice(e, 1); break; } } } // Move and collect diamonds for (var d = diamonds.length - 1; d >= 0; d--) { diamonds[d].move(); if (hero.intersects(diamonds[d])) { // Increment total diamonds collected totalDiamonds += 1; // Update the total diamonds display diamondsDisplay.updateDiamonds(totalDiamonds); // Increment total coins collected by diamond value totalCoins += diamonds[d].value; // Update the total coins display coinsDisplay.updateCoins(totalCoins); 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 coins for (var c = coins.length - 1; c >= 0; c--) { coins[c].move(); if (hero.intersects(coins[c])) { // 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 enemies var enemySpawnRate = frenzyButton.isFrenzyActive ? 30 : 120; // Halve the spawn rate during frenzy mode if (LK.ticks % enemySpawnRate == 0) { var newEnemy = new Enemy(); newEnemy.x = Math.random() * 2048; newEnemy.y = -50; enemies.push(newEnemy); game.addChild(newEnemy); } // Update hero hero.update(); });
/****
* Classes
****/
// ShootButton class
var ShootButton = Container.expand(function () {
var self = Container.call(this);
var shootButtonGraphics = self.createAsset('shootButton', 'Shoot Button', 0.5, 0.5);
self.on('down', function () {
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 ? 2048 / (hero.bulletCount + 1) : 0;
newBullet.x = hero.x + (i - Math.floor(hero.bulletCount / 2)) * bulletSpacing;
newBullet.y = hero.y;
if (bullets.length < 50) {
bullets.push(newBullet);
game.addChild(newBullet);
} else {
newBullet.destroy();
}
}
});
});
// Hero class
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.createAsset('hero', 'Hero character', 0.5, 0.5);
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
};
});
// 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 () {
// Collection logic will be implemented in the game logic section
};
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.createAsset('enemy', 'Enemy character', 0.5, 0.5);
self.speed = 2;
self.move = function () {
self.y += self.speed;
};
});
// 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());
};
});
//{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());
};
});
// FireRateUpgradeButton class
var FireRateUpgradeButton = Container.expand(function () {
var self = Container.call(this);
var upgradeButtonGraphics = self.createAsset('fireRateUpgradeButton', 'Fire Rate Upgrade Button', 0.5, 0.5);
self.cost = 5;
self.pressCount = 0;
self.on('down', function () {
if (totalCoins >= self.cost && fireRate > 5 && self.pressCount < 4) {
fireRate = Math.max(5, fireRate - 5);
totalCoins -= self.cost;
coinsDisplay.updateCoins(totalCoins);
self.pressCount++;
}
if (self.pressCount >= 4) {
self.interactive = false;
self.alpha = 0.5; // Visually indicate that the button is disabled
self.visible = false; // Remove the button from the screen
}
});
});
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;
}, 30000); // 30-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 () {
// Collection logic will be implemented in the game logic section
};
});
// Bomb class
var Bomb = Container.expand(function () {
var self = Container.call(this);
var bombGraphics = self.createAsset('bomb', 'Bomb', 0.5, 0.5);
self.explode = function () {
enemies.forEach(function (enemy) {
// Determine whether to drop a coin or a diamond
var dropChance = Math.random();
if (dropChance < 0.2) {
// 20% chance to drop a diamond
var newDiamond = new Diamond();
newDiamond.x = enemy.x;
newDiamond.y = enemy.y;
diamonds.push(newDiamond);
game.addChild(newDiamond);
} else {
// 80% chance to drop a coin
var newCoin = new Coin();
newCoin.x = enemy.x;
newCoin.y = enemy.y;
coins.push(newCoin);
game.addChild(newCoin);
}
// Increase score for each enemy destroyed by the bomb
score++;
scoreTxt.setText(score.toString());
enemy.destroy();
});
enemies = []; // Clear the enemies array
self.destroy(); // Destroy the bomb immediately after explosion
};
// Set a timeout to remove the bullet from the game after 0.5 seconds
LK.setTimeout(function () {
if (self.parent) {
self.parent.removeChild(self);
}
}, 500);
});
// 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 bomb = new Bomb();
bomb.x = 2048 / 2;
bomb.y = 2732 / 2;
game.addChild(bomb);
bomb.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
totalDiamonds += 1;
// Update the total diamonds display
diamondsDisplay.updateDiamonds(totalDiamonds);
// Increment total coins collected by diamond value
totalCoins += diamond.value;
// Update the total coins display
coinsDisplay.updateCoins(totalCoins);
diamond.destroy();
});
diamonds = []; // Clear the diamonds array
LK.setTimeout(function () {
self.cooldown = false;
}, 3000); // 3-second cooldown
}
});
});
// MultiBulletUpgradeButton class
var MultiBulletUpgradeButton = Container.expand(function () {
var self = Container.call(this);
var upgradeButtonGraphics = self.createAsset('multiBulletUpgradeButton', 'Multi Bullet Upgrade Button', 0.5, 0.5);
self.cost = 5;
self.on('down', function () {
if (totalDiamonds >= self.cost) {
hero.bulletCount = Math.min(5, hero.bulletCount + 1);
totalDiamonds -= self.cost;
diamondsDisplay.updateDiamonds(totalDiamonds);
}
});
});
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);
});
});
/****
* Initialize Game
****/
// Create frenzy button instance
var game = new LK.Game({
backgroundColor: 0xFFFFFF //Init game with white background
});
/****
* Game Code
****/
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 multiBulletUpgradeButton = game.addChild(new MultiBulletUpgradeButton());
multiBulletUpgradeButton.x = 100;
var fireRateUpgradeButton = game.addChild(new FireRateUpgradeButton());
fireRateUpgradeButton.x = 100;
fireRateUpgradeButton.y = 2732 / 2;
var multiBulletUpgradeButton = game.addChild(new MultiBulletUpgradeButton());
multiBulletUpgradeButton.x = 100;
multiBulletUpgradeButton.y = fireRateUpgradeButton.y + fireRateUpgradeButton.height + 20;
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 fireRateUpgradeButton = game.addChild(new FireRateUpgradeButton());
fireRateUpgradeButton.x = 100;
fireRateUpgradeButton.y = 2732 / 2;
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, and fire rate
var bullets = [];
var enemies = [];
var coins = []; // Array to store coin instances
var diamonds = []; // Array to store diamond instances
var fireRate = 30; // Initialize fire rate to 30
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 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 () {
// 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--) {
enemies[j].move();
if (enemies[j].y > 2732 || hero.intersects(enemies[j])) {
LK.showGameOver();
}
}
// Check for bullet-enemy collisions
for (var b = bullets.length - 1; b >= 0; b--) {
for (var e = enemies.length - 1; e >= 0; e--) {
if (bullets[b].intersects(enemies[e])) {
// Increase score and update display
score++;
scoreTxt.setText(score.toString());
bullets[b].destroy();
bullets.splice(b, 1);
// Spawn a coin or diamond when an enemy is destroyed
if (Math.random() < 0.2) {
// 20% chance to drop a diamond
if (diamonds.length < 5) {
// Limit the number of diamonds on screen
var newDiamond = new Diamond();
newDiamond.x = enemies[e].x;
newDiamond.y = enemies[e].y;
diamonds.push(newDiamond);
game.addChild(newDiamond);
}
} else if (coins.length < 10) {
// 80% chance to drop a coin
var newCoin = new Coin();
newCoin.x = enemies[e].x;
newCoin.y = enemies[e].y;
coins.push(newCoin);
game.addChild(newCoin);
}
enemies[e].destroy();
enemies.splice(e, 1);
break;
}
}
}
// Move and collect diamonds
for (var d = diamonds.length - 1; d >= 0; d--) {
diamonds[d].move();
if (hero.intersects(diamonds[d])) {
// Increment total diamonds collected
totalDiamonds += 1;
// Update the total diamonds display
diamondsDisplay.updateDiamonds(totalDiamonds);
// Increment total coins collected by diamond value
totalCoins += diamonds[d].value;
// Update the total coins display
coinsDisplay.updateCoins(totalCoins);
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 coins
for (var c = coins.length - 1; c >= 0; c--) {
coins[c].move();
if (hero.intersects(coins[c])) {
// 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 enemies
var enemySpawnRate = frenzyButton.isFrenzyActive ? 30 : 120; // Halve the spawn rate during frenzy mode
if (LK.ticks % enemySpawnRate == 0) {
var newEnemy = new Enemy();
newEnemy.x = Math.random() * 2048;
newEnemy.y = -50;
enemies.push(newEnemy);
game.addChild(newEnemy);
}
// Update hero
hero.update();
});
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.