User prompt
no it need to follow the player needs to follow mouse
User prompt
fix the player when the mouse moves the player needs to follow
User prompt
fix the line map and the player is under the map
User prompt
fix the player is hiding in the map
User prompt
the play is not showing
Code edit (1 edits merged)
Please save this source code
User prompt
Pixel Shooter Arena
Initial prompt
Make a Fps Shooting Game Online
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0, currentLevel: 1, weaponPower: 1 }); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 15; self.damage = 1; self.range = 2000; self.distanceTraveled = 0; self.setDamage = function (value) { self.damage = value; // Increase bullet size with damage bulletGraphics.scale.set(1 + value * 0.2, 1 + value * 0.2); }; self.update = function () { self.y -= self.speed; self.distanceTraveled += self.speed; // Remove bullet if it traveled beyond its range if (self.distanceTraveled > self.range) { self.shouldRemove = true; } }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.health = 3; self.maxHealth = 3; self.speed = 2; self.pointValue = 10; self.attackCooldown = 0; self.attackRate = 120; // Frames between attacks self.setType = function (type) { switch (type) { case 'basic': enemyGraphics.tint = 0xe74c3c; // Red self.health = 3; self.maxHealth = 3; self.speed = 2; self.pointValue = 10; break; case 'fast': enemyGraphics.tint = 0xf39c12; // Orange self.health = 2; self.maxHealth = 2; self.speed = 4; self.pointValue = 15; break; case 'tank': enemyGraphics.tint = 0x8e44ad; // Purple enemyGraphics.scale.set(1.3, 1.3); self.health = 8; self.maxHealth = 8; self.speed = 1; self.pointValue = 25; break; } }; self.takeDamage = function (amount) { self.health -= amount; // Flash effect when taking damage LK.effects.flashObject(enemyGraphics, 0xffffff, 200); if (self.health <= 0) { return true; // Enemy died } return false; }; self.update = function () { // Move toward player with some randomness var targetX = playerX + (Math.random() * 100 - 50); var dx = targetX - self.x; self.x += dx * 0.02; self.y += self.speed; // Attacking logic if (self.attackCooldown <= 0) { // Check if in attack range if (self.y > 2000) { self.attack(); self.attackCooldown = self.attackRate; } } else { self.attackCooldown--; } }; self.attack = function () { // Deal damage to player when in range if (playerHealth > 0) { playerHealth -= 1; LK.getSound('playerHit').play(); LK.effects.flashScreen(0xff0000, 200); } }; return self; }); var GroundTile = Container.expand(function () { var self = Container.call(this); var tileGraphics = self.attachAsset('groundTile', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.update = function () { self.y += self.speed; // Reset position when off screen if (self.y > 2732 + tileGraphics.height) { self.y = -tileGraphics.height; } }; return self; }); var Pickup = Container.expand(function () { var self = Container.call(this); var pickupGraphics = self.attachAsset('upgradePickup', { anchorX: 0.5, anchorY: 0.5 }); self.type = 'weapon'; self.speed = 3; self.setType = function (type) { self.type = type; switch (type) { case 'weapon': pickupGraphics.tint = 0x9b59b6; // Purple break; case 'health': pickupGraphics.tint = 0x2ecc71; // Green break; case 'ammo': pickupGraphics.tint = 0xf1c40f; // Yellow break; } }; self.update = function () { self.y += self.speed; // Add a floating effect pickupGraphics.y = Math.sin(LK.ticks * 0.05) * 10; // Spin effect pickupGraphics.rotation += 0.02; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x34495e }); /**** * Game Code ****/ // Player state variables var playerX = 2048 / 2; var playerHealth = 10; var playerMaxHealth = 10; var playerAmmo = 30; var playerMaxAmmo = 30; var weaponLevel = storage.weaponPower || 1; var currentLevel = storage.currentLevel || 1; var score = 0; var highScore = storage.highScore || 0; var isGameOver = false; // Game state variables var bullets = []; var enemies = []; var pickups = []; var groundTiles = []; var enemySpawnTimer = 0; var enemySpawnRate = 60; // Frames between enemy spawns var pickupSpawnTimer = 0; var pickupSpawnRate = 300; // Frames between pickups var wavesCompleted = 0; var enemiesInWave = 10; var enemiesSpawned = 0; var fireRate = 15; // Frames between shots var fireCooldown = 0; // Create player var player = game.addChild(LK.getAsset('player', { anchorX: 0.5, anchorY: 0.5, x: playerX, y: 2300 })); // Create moving ground tiles for parallax effect function setupGround() { var tileSize = 256; var tilesNeeded = Math.ceil(2048 / tileSize) + 1; for (var x = 0; x < tilesNeeded; x++) { for (var y = 0; y < 12; y++) { var tile = new GroundTile(); tile.x = x * tileSize; tile.y = y * tileSize - tileSize; // Alternate colors for grid effect if ((x + y) % 2 === 0) { tile.getChildAt(0).tint = 0x95a5a6; // Light grey } else { tile.getChildAt(0).tint = 0x7f8c8d; // Darker grey } game.addChild(tile); groundTiles.push(tile); } } } // Setup UI elements function setupUI() { // Score Text var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); LK.gui.topRight.addChild(scoreText); scoreText.x = -250; scoreText.y = 30; // Level Text var levelText = new Text2('Level: 1', { size: 60, fill: 0xFFFFFF }); levelText.anchor.set(0, 0); LK.gui.topRight.addChild(levelText); levelText.x = -250; levelText.y = 100; // Weapon Level Text var weaponText = new Text2('Weapon: 1', { size: 50, fill: 0xFFFFFF }); weaponText.anchor.set(0, 0); LK.gui.topRight.addChild(weaponText); weaponText.x = -250; weaponText.y = 170; // Health Bar Background var healthBarBg = LK.getAsset('healthBarBackground', { anchorX: 0, anchorY: 0, x: 30, y: 30 }); LK.gui.topLeft.addChild(healthBarBg); healthBarBg.x = 100; // Move away from top left corner // Health Bar var healthBarFg = LK.getAsset('healthBar', { anchorX: 0, anchorY: 0, x: 30, y: 30 }); LK.gui.topLeft.addChild(healthBarFg); healthBarFg.x = 100; // Move away from top left corner // Ammo Bar Background var ammoBarBg = LK.getAsset('ammoBarBackground', { anchorX: 0, anchorY: 0, x: 30, y: 80 }); LK.gui.topLeft.addChild(ammoBarBg); ammoBarBg.x = 100; // Move away from top left corner // Ammo Bar var ammoBarFg = LK.getAsset('ammoBar', { anchorX: 0, anchorY: 0, x: 30, y: 80 }); LK.gui.topLeft.addChild(ammoBarFg); ammoBarFg.x = 100; // Move away from top left corner // Update UI function function updateUI() { scoreText.setText('Score: ' + score); levelText.setText('Level: ' + currentLevel); weaponText.setText('Weapon: ' + weaponLevel); // Update health bar var healthPercent = Math.max(0, playerHealth / playerMaxHealth); healthBarFg.scale.x = healthPercent; // Update ammo bar var ammoPercent = Math.max(0, playerAmmo / playerMaxAmmo); ammoBarFg.scale.x = ammoPercent; // Change health bar color based on health if (healthPercent < 0.3) { healthBarFg.tint = 0xe74c3c; // Red } else if (healthPercent < 0.6) { healthBarFg.tint = 0xf39c12; // Orange } else { healthBarFg.tint = 0x2ecc71; // Green } } return updateUI; } // Function to fire a bullet function fireBullet() { if (playerAmmo <= 0 || fireCooldown > 0) return; var bullet = new Bullet(); bullet.x = playerX; bullet.y = 2200; bullet.setDamage(weaponLevel); game.addChild(bullet); bullets.push(bullet); // Play sound LK.getSound('shoot').play(); // Reduce ammo playerAmmo--; // Set cooldown fireCooldown = fireRate; } // Function to spawn an enemy function spawnEnemy() { if (enemiesSpawned >= enemiesInWave) return; var enemy = new Enemy(); // Random X position enemy.x = Math.random() * (2048 - 200) + 100; enemy.y = -200; // Determine enemy type based on level and randomness var typeRoll = Math.random(); if (currentLevel >= 3 && typeRoll < 0.2) { enemy.setType('tank'); } else if (currentLevel >= 2 && typeRoll < 0.4) { enemy.setType('fast'); } else { enemy.setType('basic'); } // Scale difficulty with level enemy.health += Math.floor(currentLevel / 2); enemy.maxHealth += Math.floor(currentLevel / 2); game.addChild(enemy); enemies.push(enemy); enemiesSpawned++; } // Function to spawn a pickup function spawnPickup() { var pickup = new Pickup(); pickup.x = Math.random() * (2048 - 200) + 100; pickup.y = -100; // Determine pickup type var typeRoll = Math.random(); if (typeRoll < 0.3) { pickup.setType('weapon'); } else if (typeRoll < 0.7) { pickup.setType('health'); } else { pickup.setType('ammo'); } game.addChild(pickup); pickups.push(pickup); } // Function to start next level function startNextLevel() { currentLevel++; // Update difficulty enemiesInWave = 10 + currentLevel * 5; enemiesSpawned = 0; enemySpawnRate = Math.max(20, 60 - currentLevel * 5); // Store progress storage.currentLevel = currentLevel; // Reset pickups for (var i = pickups.length - 1; i >= 0; i--) { pickups[i].destroy(); } pickups = []; // Play level complete sound LK.getSound('levelComplete').play(); } // Function to handle collisions function checkCollisions() { // Check bullet-enemy collisions for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { // Enemy takes damage var isDead = enemy.takeDamage(bullet.damage); if (isDead) { // Add score score += enemy.pointValue; // Check for high score if (score > highScore) { highScore = score; storage.highScore = highScore; } // Remove enemy enemy.destroy(); enemies.splice(j, 1); // Small chance to spawn pickup when enemy dies if (Math.random() < 0.2) { var pickup = new Pickup(); pickup.x = enemy.x; pickup.y = enemy.y; var typeRoll = Math.random(); if (typeRoll < 0.3) { pickup.setType('weapon'); } else if (typeRoll < 0.7) { pickup.setType('health'); } else { pickup.setType('ammo'); } game.addChild(pickup); pickups.push(pickup); } // Check if wave is completed if (enemies.length === 0 && enemiesSpawned >= enemiesInWave) { startNextLevel(); } } // Play hit sound LK.getSound('enemyHit').play(); // Remove bullet bullet.destroy(); bullets.splice(i, 1); break; } } } // Check player-pickup collisions for (var k = pickups.length - 1; k >= 0; k--) { var pickup = pickups[k]; // Simple distance check (approximation of player pickup range) var dx = pickup.x - playerX; var dy = pickup.y - 2300; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 150) { // Process pickup switch (pickup.type) { case 'weapon': weaponLevel = Math.min(5, weaponLevel + 1); storage.weaponPower = weaponLevel; break; case 'health': playerHealth = Math.min(playerMaxHealth, playerHealth + 3); break; case 'ammo': playerAmmo = playerMaxAmmo; break; } // Play pickup sound LK.getSound('pickup').play(); // Remove pickup pickup.destroy(); pickups.splice(k, 1); } } } // Initialize game setupGround(); var updateUI = setupUI(); // Play background music LK.playMusic('gameMusic', { loop: true }); // Touch controls for player movement var touching = false; var touchTarget = playerX; game.down = function (x, y) { touching = true; touchTarget = x; // Fire bullet on tap fireBullet(); }; game.move = function (x, y) { if (touching) { touchTarget = x; } }; game.up = function (x, y) { touching = false; }; // Main game update loop game.update = function () { // Skip updates if game is over if (isGameOver) return; // Update player position var dx = touchTarget - playerX; playerX += dx * 0.1; player.x = playerX; // Clamp player to screen playerX = Math.max(100, Math.min(2048 - 100, playerX)); // Update ground tiles for (var i = 0; i < groundTiles.length; i++) { groundTiles[i].update(); } // Update bullets for (var j = bullets.length - 1; j >= 0; j--) { bullets[j].update(); // Remove bullets that have traveled their full range if (bullets[j].shouldRemove) { bullets[j].destroy(); bullets.splice(j, 1); } } // Update enemies for (var k = 0; k < enemies.length; k++) { enemies[k].update(); // Remove enemies that are offscreen if (enemies[k].y > 2732 + 200) { enemies[k].destroy(); enemies.splice(k, 1); k--; } } // Update pickups for (var l = pickups.length - 1; l >= 0; l--) { pickups[l].update(); // Remove pickups that are offscreen if (pickups[l].y > 2732 + 100) { pickups[l].destroy(); pickups.splice(l, 1); } } // Spawn enemies if (enemySpawnTimer <= 0 && enemiesSpawned < enemiesInWave) { spawnEnemy(); enemySpawnTimer = enemySpawnRate; } else { enemySpawnTimer--; } // Spawn pickups if (pickupSpawnTimer <= 0) { if (Math.random() < 0.3) { // 30% chance to spawn a pickup spawnPickup(); } pickupSpawnTimer = pickupSpawnRate; } else { pickupSpawnTimer--; } // Regenerate ammo over time if (LK.ticks % 60 === 0 && playerAmmo < playerMaxAmmo) { playerAmmo++; } // Handle collisions checkCollisions(); // Update weapon cooldown if (fireCooldown > 0) { fireCooldown--; } // Auto-fire if holding touch if (touching && fireCooldown <= 0) { fireBullet(); } // Update UI updateUI(); // Check game over condition if (playerHealth <= 0 && !isGameOver) { isGameOver = true; LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,568 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ highScore: 0,
+ currentLevel: 1,
+ weaponPower: 1
+});
+
+/****
+* Classes
+****/
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 15;
+ self.damage = 1;
+ self.range = 2000;
+ self.distanceTraveled = 0;
+ self.setDamage = function (value) {
+ self.damage = value;
+ // Increase bullet size with damage
+ bulletGraphics.scale.set(1 + value * 0.2, 1 + value * 0.2);
+ };
+ self.update = function () {
+ self.y -= self.speed;
+ self.distanceTraveled += self.speed;
+ // Remove bullet if it traveled beyond its range
+ if (self.distanceTraveled > self.range) {
+ self.shouldRemove = true;
+ }
+ };
+ return self;
+});
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 3;
+ self.maxHealth = 3;
+ self.speed = 2;
+ self.pointValue = 10;
+ self.attackCooldown = 0;
+ self.attackRate = 120; // Frames between attacks
+ self.setType = function (type) {
+ switch (type) {
+ case 'basic':
+ enemyGraphics.tint = 0xe74c3c; // Red
+ self.health = 3;
+ self.maxHealth = 3;
+ self.speed = 2;
+ self.pointValue = 10;
+ break;
+ case 'fast':
+ enemyGraphics.tint = 0xf39c12; // Orange
+ self.health = 2;
+ self.maxHealth = 2;
+ self.speed = 4;
+ self.pointValue = 15;
+ break;
+ case 'tank':
+ enemyGraphics.tint = 0x8e44ad; // Purple
+ enemyGraphics.scale.set(1.3, 1.3);
+ self.health = 8;
+ self.maxHealth = 8;
+ self.speed = 1;
+ self.pointValue = 25;
+ break;
+ }
+ };
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ // Flash effect when taking damage
+ LK.effects.flashObject(enemyGraphics, 0xffffff, 200);
+ if (self.health <= 0) {
+ return true; // Enemy died
+ }
+ return false;
+ };
+ self.update = function () {
+ // Move toward player with some randomness
+ var targetX = playerX + (Math.random() * 100 - 50);
+ var dx = targetX - self.x;
+ self.x += dx * 0.02;
+ self.y += self.speed;
+ // Attacking logic
+ if (self.attackCooldown <= 0) {
+ // Check if in attack range
+ if (self.y > 2000) {
+ self.attack();
+ self.attackCooldown = self.attackRate;
+ }
+ } else {
+ self.attackCooldown--;
+ }
+ };
+ self.attack = function () {
+ // Deal damage to player when in range
+ if (playerHealth > 0) {
+ playerHealth -= 1;
+ LK.getSound('playerHit').play();
+ LK.effects.flashScreen(0xff0000, 200);
+ }
+ };
+ return self;
+});
+var GroundTile = Container.expand(function () {
+ var self = Container.call(this);
+ var tileGraphics = self.attachAsset('groundTile', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 2;
+ self.update = function () {
+ self.y += self.speed;
+ // Reset position when off screen
+ if (self.y > 2732 + tileGraphics.height) {
+ self.y = -tileGraphics.height;
+ }
+ };
+ return self;
+});
+var Pickup = Container.expand(function () {
+ var self = Container.call(this);
+ var pickupGraphics = self.attachAsset('upgradePickup', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'weapon';
+ self.speed = 3;
+ self.setType = function (type) {
+ self.type = type;
+ switch (type) {
+ case 'weapon':
+ pickupGraphics.tint = 0x9b59b6; // Purple
+ break;
+ case 'health':
+ pickupGraphics.tint = 0x2ecc71; // Green
+ break;
+ case 'ammo':
+ pickupGraphics.tint = 0xf1c40f; // Yellow
+ break;
+ }
+ };
+ self.update = function () {
+ self.y += self.speed;
+ // Add a floating effect
+ pickupGraphics.y = Math.sin(LK.ticks * 0.05) * 10;
+ // Spin effect
+ pickupGraphics.rotation += 0.02;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x34495e
+});
+
+/****
+* Game Code
+****/
+// Player state variables
+var playerX = 2048 / 2;
+var playerHealth = 10;
+var playerMaxHealth = 10;
+var playerAmmo = 30;
+var playerMaxAmmo = 30;
+var weaponLevel = storage.weaponPower || 1;
+var currentLevel = storage.currentLevel || 1;
+var score = 0;
+var highScore = storage.highScore || 0;
+var isGameOver = false;
+// Game state variables
+var bullets = [];
+var enemies = [];
+var pickups = [];
+var groundTiles = [];
+var enemySpawnTimer = 0;
+var enemySpawnRate = 60; // Frames between enemy spawns
+var pickupSpawnTimer = 0;
+var pickupSpawnRate = 300; // Frames between pickups
+var wavesCompleted = 0;
+var enemiesInWave = 10;
+var enemiesSpawned = 0;
+var fireRate = 15; // Frames between shots
+var fireCooldown = 0;
+// Create player
+var player = game.addChild(LK.getAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: playerX,
+ y: 2300
+}));
+// Create moving ground tiles for parallax effect
+function setupGround() {
+ var tileSize = 256;
+ var tilesNeeded = Math.ceil(2048 / tileSize) + 1;
+ for (var x = 0; x < tilesNeeded; x++) {
+ for (var y = 0; y < 12; y++) {
+ var tile = new GroundTile();
+ tile.x = x * tileSize;
+ tile.y = y * tileSize - tileSize;
+ // Alternate colors for grid effect
+ if ((x + y) % 2 === 0) {
+ tile.getChildAt(0).tint = 0x95a5a6; // Light grey
+ } else {
+ tile.getChildAt(0).tint = 0x7f8c8d; // Darker grey
+ }
+ game.addChild(tile);
+ groundTiles.push(tile);
+ }
+ }
+}
+// Setup UI elements
+function setupUI() {
+ // Score Text
+ var scoreText = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ scoreText.anchor.set(0, 0);
+ LK.gui.topRight.addChild(scoreText);
+ scoreText.x = -250;
+ scoreText.y = 30;
+ // Level Text
+ var levelText = new Text2('Level: 1', {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ levelText.anchor.set(0, 0);
+ LK.gui.topRight.addChild(levelText);
+ levelText.x = -250;
+ levelText.y = 100;
+ // Weapon Level Text
+ var weaponText = new Text2('Weapon: 1', {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ weaponText.anchor.set(0, 0);
+ LK.gui.topRight.addChild(weaponText);
+ weaponText.x = -250;
+ weaponText.y = 170;
+ // Health Bar Background
+ var healthBarBg = LK.getAsset('healthBarBackground', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 30,
+ y: 30
+ });
+ LK.gui.topLeft.addChild(healthBarBg);
+ healthBarBg.x = 100; // Move away from top left corner
+ // Health Bar
+ var healthBarFg = LK.getAsset('healthBar', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 30,
+ y: 30
+ });
+ LK.gui.topLeft.addChild(healthBarFg);
+ healthBarFg.x = 100; // Move away from top left corner
+ // Ammo Bar Background
+ var ammoBarBg = LK.getAsset('ammoBarBackground', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 30,
+ y: 80
+ });
+ LK.gui.topLeft.addChild(ammoBarBg);
+ ammoBarBg.x = 100; // Move away from top left corner
+ // Ammo Bar
+ var ammoBarFg = LK.getAsset('ammoBar', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 30,
+ y: 80
+ });
+ LK.gui.topLeft.addChild(ammoBarFg);
+ ammoBarFg.x = 100; // Move away from top left corner
+ // Update UI function
+ function updateUI() {
+ scoreText.setText('Score: ' + score);
+ levelText.setText('Level: ' + currentLevel);
+ weaponText.setText('Weapon: ' + weaponLevel);
+ // Update health bar
+ var healthPercent = Math.max(0, playerHealth / playerMaxHealth);
+ healthBarFg.scale.x = healthPercent;
+ // Update ammo bar
+ var ammoPercent = Math.max(0, playerAmmo / playerMaxAmmo);
+ ammoBarFg.scale.x = ammoPercent;
+ // Change health bar color based on health
+ if (healthPercent < 0.3) {
+ healthBarFg.tint = 0xe74c3c; // Red
+ } else if (healthPercent < 0.6) {
+ healthBarFg.tint = 0xf39c12; // Orange
+ } else {
+ healthBarFg.tint = 0x2ecc71; // Green
+ }
+ }
+ return updateUI;
+}
+// Function to fire a bullet
+function fireBullet() {
+ if (playerAmmo <= 0 || fireCooldown > 0) return;
+ var bullet = new Bullet();
+ bullet.x = playerX;
+ bullet.y = 2200;
+ bullet.setDamage(weaponLevel);
+ game.addChild(bullet);
+ bullets.push(bullet);
+ // Play sound
+ LK.getSound('shoot').play();
+ // Reduce ammo
+ playerAmmo--;
+ // Set cooldown
+ fireCooldown = fireRate;
+}
+// Function to spawn an enemy
+function spawnEnemy() {
+ if (enemiesSpawned >= enemiesInWave) return;
+ var enemy = new Enemy();
+ // Random X position
+ enemy.x = Math.random() * (2048 - 200) + 100;
+ enemy.y = -200;
+ // Determine enemy type based on level and randomness
+ var typeRoll = Math.random();
+ if (currentLevel >= 3 && typeRoll < 0.2) {
+ enemy.setType('tank');
+ } else if (currentLevel >= 2 && typeRoll < 0.4) {
+ enemy.setType('fast');
+ } else {
+ enemy.setType('basic');
+ }
+ // Scale difficulty with level
+ enemy.health += Math.floor(currentLevel / 2);
+ enemy.maxHealth += Math.floor(currentLevel / 2);
+ game.addChild(enemy);
+ enemies.push(enemy);
+ enemiesSpawned++;
+}
+// Function to spawn a pickup
+function spawnPickup() {
+ var pickup = new Pickup();
+ pickup.x = Math.random() * (2048 - 200) + 100;
+ pickup.y = -100;
+ // Determine pickup type
+ var typeRoll = Math.random();
+ if (typeRoll < 0.3) {
+ pickup.setType('weapon');
+ } else if (typeRoll < 0.7) {
+ pickup.setType('health');
+ } else {
+ pickup.setType('ammo');
+ }
+ game.addChild(pickup);
+ pickups.push(pickup);
+}
+// Function to start next level
+function startNextLevel() {
+ currentLevel++;
+ // Update difficulty
+ enemiesInWave = 10 + currentLevel * 5;
+ enemiesSpawned = 0;
+ enemySpawnRate = Math.max(20, 60 - currentLevel * 5);
+ // Store progress
+ storage.currentLevel = currentLevel;
+ // Reset pickups
+ for (var i = pickups.length - 1; i >= 0; i--) {
+ pickups[i].destroy();
+ }
+ pickups = [];
+ // Play level complete sound
+ LK.getSound('levelComplete').play();
+}
+// Function to handle collisions
+function checkCollisions() {
+ // Check bullet-enemy collisions
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var enemy = enemies[j];
+ if (bullet.intersects(enemy)) {
+ // Enemy takes damage
+ var isDead = enemy.takeDamage(bullet.damage);
+ if (isDead) {
+ // Add score
+ score += enemy.pointValue;
+ // Check for high score
+ if (score > highScore) {
+ highScore = score;
+ storage.highScore = highScore;
+ }
+ // Remove enemy
+ enemy.destroy();
+ enemies.splice(j, 1);
+ // Small chance to spawn pickup when enemy dies
+ if (Math.random() < 0.2) {
+ var pickup = new Pickup();
+ pickup.x = enemy.x;
+ pickup.y = enemy.y;
+ var typeRoll = Math.random();
+ if (typeRoll < 0.3) {
+ pickup.setType('weapon');
+ } else if (typeRoll < 0.7) {
+ pickup.setType('health');
+ } else {
+ pickup.setType('ammo');
+ }
+ game.addChild(pickup);
+ pickups.push(pickup);
+ }
+ // Check if wave is completed
+ if (enemies.length === 0 && enemiesSpawned >= enemiesInWave) {
+ startNextLevel();
+ }
+ }
+ // Play hit sound
+ LK.getSound('enemyHit').play();
+ // Remove bullet
+ bullet.destroy();
+ bullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ // Check player-pickup collisions
+ for (var k = pickups.length - 1; k >= 0; k--) {
+ var pickup = pickups[k];
+ // Simple distance check (approximation of player pickup range)
+ var dx = pickup.x - playerX;
+ var dy = pickup.y - 2300;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 150) {
+ // Process pickup
+ switch (pickup.type) {
+ case 'weapon':
+ weaponLevel = Math.min(5, weaponLevel + 1);
+ storage.weaponPower = weaponLevel;
+ break;
+ case 'health':
+ playerHealth = Math.min(playerMaxHealth, playerHealth + 3);
+ break;
+ case 'ammo':
+ playerAmmo = playerMaxAmmo;
+ break;
+ }
+ // Play pickup sound
+ LK.getSound('pickup').play();
+ // Remove pickup
+ pickup.destroy();
+ pickups.splice(k, 1);
+ }
+ }
+}
+// Initialize game
+setupGround();
+var updateUI = setupUI();
+// Play background music
+LK.playMusic('gameMusic', {
+ loop: true
+});
+// Touch controls for player movement
+var touching = false;
+var touchTarget = playerX;
+game.down = function (x, y) {
+ touching = true;
+ touchTarget = x;
+ // Fire bullet on tap
+ fireBullet();
+};
+game.move = function (x, y) {
+ if (touching) {
+ touchTarget = x;
+ }
+};
+game.up = function (x, y) {
+ touching = false;
+};
+// Main game update loop
+game.update = function () {
+ // Skip updates if game is over
+ if (isGameOver) return;
+ // Update player position
+ var dx = touchTarget - playerX;
+ playerX += dx * 0.1;
+ player.x = playerX;
+ // Clamp player to screen
+ playerX = Math.max(100, Math.min(2048 - 100, playerX));
+ // Update ground tiles
+ for (var i = 0; i < groundTiles.length; i++) {
+ groundTiles[i].update();
+ }
+ // Update bullets
+ for (var j = bullets.length - 1; j >= 0; j--) {
+ bullets[j].update();
+ // Remove bullets that have traveled their full range
+ if (bullets[j].shouldRemove) {
+ bullets[j].destroy();
+ bullets.splice(j, 1);
+ }
+ }
+ // Update enemies
+ for (var k = 0; k < enemies.length; k++) {
+ enemies[k].update();
+ // Remove enemies that are offscreen
+ if (enemies[k].y > 2732 + 200) {
+ enemies[k].destroy();
+ enemies.splice(k, 1);
+ k--;
+ }
+ }
+ // Update pickups
+ for (var l = pickups.length - 1; l >= 0; l--) {
+ pickups[l].update();
+ // Remove pickups that are offscreen
+ if (pickups[l].y > 2732 + 100) {
+ pickups[l].destroy();
+ pickups.splice(l, 1);
+ }
+ }
+ // Spawn enemies
+ if (enemySpawnTimer <= 0 && enemiesSpawned < enemiesInWave) {
+ spawnEnemy();
+ enemySpawnTimer = enemySpawnRate;
+ } else {
+ enemySpawnTimer--;
+ }
+ // Spawn pickups
+ if (pickupSpawnTimer <= 0) {
+ if (Math.random() < 0.3) {
+ // 30% chance to spawn a pickup
+ spawnPickup();
+ }
+ pickupSpawnTimer = pickupSpawnRate;
+ } else {
+ pickupSpawnTimer--;
+ }
+ // Regenerate ammo over time
+ if (LK.ticks % 60 === 0 && playerAmmo < playerMaxAmmo) {
+ playerAmmo++;
+ }
+ // Handle collisions
+ checkCollisions();
+ // Update weapon cooldown
+ if (fireCooldown > 0) {
+ fireCooldown--;
+ }
+ // Auto-fire if holding touch
+ if (touching && fireCooldown <= 0) {
+ fireBullet();
+ }
+ // Update UI
+ updateUI();
+ // Check game over condition
+ if (playerHealth <= 0 && !isGameOver) {
+ isGameOver = true;
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ }
+};
\ No newline at end of file
Bullet . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Bullet Ammo. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
bullet with bar ammo . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a health Bar. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a bad guy . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a good guy with weapons
Grass