User prompt
Create a special space where we can fill our souls
User prompt
Create a beautiful background.
User prompt
Enemies only come from above
User prompt
Please fix the bug: 'TypeError: taskTexts[i].setColor is not a function' in or related to this line: 'taskTexts[i].setColor(color);' Line Number: 334
User prompt
Put the character's health bar under
User prompt
give us some tasks and show these tasks on top
User prompt
Reduces enemies' health and range
Code edit (1 edits merged)
Please save this source code
User prompt
Top Cop: Police Pursuit
Initial prompt
make a gun game and um top top camera and then uh and then and then uh sound effects and uh police and uh and
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12; self.direction = { x: 0, y: -1 }; // Default upward self.lifespan = 120; // 2 seconds at 60fps self.age = 0; self.damage = 1; self.update = function () { self.x += self.direction.x * self.speed; self.y += self.direction.y * self.speed; self.age++; if (self.age > self.lifespan) { self.markForDeletion = true; } }; return self; }); var Criminal = Container.expand(function () { var self = Container.call(this); var criminalGraphics = self.attachAsset('criminal', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.health = 3; self.shootCooldown = 0; self.shootDelay = 120; // Frames between shots self.attackRange = 500; self.movePattern = Math.floor(Math.random() * 3); // 0: direct, 1: zigzag, 2: circle self.moveTimer = 0; self.update = function () { // Target the player var dx = player.x - self.x; var dy = player.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); // Movement based on pattern if (distance > 100) { // Keep some distance var moveX = 0; var moveY = 0; switch (self.movePattern) { case 0: // Direct moveX = dx / distance; moveY = dy / distance; break; case 1: // Zigzag self.moveTimer++; moveX = dx / distance + Math.sin(self.moveTimer * 0.1) * 0.5; moveY = dy / distance; break; case 2: // Circle self.moveTimer++; moveX = dx / distance + Math.sin(self.moveTimer * 0.05) * 0.8; moveY = dy / distance + Math.cos(self.moveTimer * 0.05) * 0.8; break; } self.x += moveX * self.speed; self.y += moveY * self.speed; } // Shooting logic if (distance < self.attackRange) { if (self.shootCooldown <= 0) { // Create enemy bullet var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; // Calculate direction toward player var dirX = dx / distance; var dirY = dy / distance; bullet.direction = { x: dirX, y: dirY }; // Mark as enemy bullet bullet.isEnemyBullet = true; // Add to game's bullets array bullets.push(bullet); game.addChild(bullet); // Reset cooldown with some randomness self.shootCooldown = self.shootDelay + Math.random() * 60; } } if (self.shootCooldown > 0) { self.shootCooldown--; } }; self.takeDamage = function () { self.health--; LK.effects.flashObject(self, 0xFF0000, 300); if (self.health <= 0) { LK.getSound('criminal_down').play(); LK.setScore(LK.getScore() + 1); self.markForDeletion = true; } }; return self; }); var EmergencyCall = Container.expand(function () { var self = Container.call(this); var callGraphics = self.attachAsset('emergencyCall', { anchorX: 0.5, anchorY: 0.5 }); self.lifetime = 600; // 10 seconds at 60fps self.age = 0; self.flashInterval = 30; self.update = function () { self.age++; // Flash effect if (self.age % self.flashInterval === 0) { if (callGraphics.alpha === 1) { tween(callGraphics, { alpha: 0.3 }, { duration: 500 }); } else { tween(callGraphics, { alpha: 1 }, { duration: 500 }); } } // Expire after lifetime if (self.age > self.lifetime) { self.markForDeletion = true; } }; self.down = function () { // Responding to call LK.getSound('radiochatter').play(); spawnCriminals(self.x, self.y, 2 + Math.floor(Math.random() * 3)); self.markForDeletion = true; // Increase score for responding LK.setScore(LK.getScore() + 2); }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.health = 100; self.maxHealth = 100; self.shootCooldown = 0; self.shootDelay = 15; // Frames between shots self.canMove = true; // Health bar setup var healthBarBg = self.attachAsset('healthBarBackground', { anchorX: 0.5, anchorY: 0, y: -70 }); var healthBarFill = self.attachAsset('healthBar', { anchorX: 0.5, anchorY: 0, y: -68 }); self.updateHealthBar = function () { var healthPercentage = self.health / self.maxHealth; healthBarFill.scale.x = healthPercentage; // Center the health bar healthBarFill.x = -100 * (1 - healthPercentage); }; self.takeDamage = function (amount) { self.health -= amount; if (self.health <= 0) { self.health = 0; LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } self.updateHealthBar(); }; self.shoot = function () { if (self.shootCooldown <= 0) { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y - 40; // Add to game's bullets array bullets.push(bullet); game.addChild(bullet); // Play gun sound LK.getSound('gunshot').play(); // Reset cooldown self.shootCooldown = self.shootDelay; } }; self.update = function () { if (self.shootCooldown > 0) { self.shootCooldown--; } }; self.down = function (x, y, obj) { self.shoot(); }; // Initialize health bar self.updateHealthBar(); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x333333 }); /**** * Game Code ****/ // Game variables var player; var bullets = []; var criminals = []; var emergencyCalls = []; var gameActive = true; var dragOffset = { x: 0, y: 0 }; var gameLevel = 1; var spawnTimer = 0; var maxCriminals = 10; var emergencyCallTimer = 0; // Setup UI var scoreTxt = new Text2('Score: 0', { size: 70, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var levelTxt = new Text2('Level: 1', { size: 70, fill: 0xFFFFFF }); levelTxt.anchor.set(0.5, 0); levelTxt.y = 80; LK.gui.top.addChild(levelTxt); // Initialize player player = new Player(); player.x = 2048 / 2; player.y = 2732 / 2; game.addChild(player); // Play background music LK.playMusic('background_music'); // Spawn criminals at a position function spawnCriminals(x, y, count) { for (var i = 0; i < count; i++) { if (criminals.length < maxCriminals) { var criminal = new Criminal(); // Randomize spawn position around the target var angle = Math.random() * Math.PI * 2; var distance = 300 + Math.random() * 200; criminal.x = x + Math.cos(angle) * distance; criminal.y = y + Math.sin(angle) * distance; // Adjust spawn if out of bounds criminal.x = Math.max(50, Math.min(2048 - 50, criminal.x)); criminal.y = Math.max(50, Math.min(2732 - 50, criminal.y)); criminals.push(criminal); game.addChild(criminal); } } } // Create an emergency call at a random position function createEmergencyCall() { var call = new EmergencyCall(); call.x = Math.random() * (2048 - 200) + 100; // Keep away from edges call.y = Math.random() * (2732 - 200) + 100; // Keep away from edges emergencyCalls.push(call); game.addChild(call); // Play siren sound LK.getSound('siren').play(); } // Check if a level up should occur function checkLevelUp() { var score = LK.getScore(); var newLevel = Math.floor(score / 10) + 1; if (newLevel > gameLevel) { gameLevel = newLevel; levelTxt.setText('Level: ' + gameLevel); // Increase difficulty maxCriminals = 10 + gameLevel * 2; // Bonus for reaching new level player.health = Math.min(player.maxHealth, player.health + 20); player.updateHealthBar(); // Visual feedback LK.effects.flashScreen(0x00FF00, 500); } } // Game drag handling game.down = function (x, y, obj) { if (!player.canMove) return; // Calculate offset for dragging dragOffset.x = player.x - x; dragOffset.y = player.y - y; player.shoot(); }; game.move = function (x, y, obj) { if (!player.canMove) return; // Move player with drag player.x = x + dragOffset.x; player.y = y + dragOffset.y; // Keep player in bounds player.x = Math.max(50, Math.min(2048 - 50, player.x)); player.y = Math.max(50, Math.min(2732 - 50, player.y)); }; game.up = function () { // Add any logic needed when touch/click is released }; // Game update loop game.update = function () { if (!gameActive) return; // Update score display scoreTxt.setText('Score: ' + LK.getScore()); // Update player player.update(); // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; bullet.update(); // Check for off-screen bullets if (bullet.x < 0 || bullet.x > 2048 || bullet.y < 0 || bullet.y > 2732 || bullet.markForDeletion) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check for bullet collisions if (bullet.isEnemyBullet) { // Enemy bullets hit player if (bullet.intersects(player)) { player.takeDamage(10); bullet.destroy(); bullets.splice(i, 1); continue; } } else { // Player bullets hit criminals for (var j = criminals.length - 1; j >= 0; j--) { if (bullet.intersects(criminals[j])) { criminals[j].takeDamage(); bullet.destroy(); bullets.splice(i, 1); break; } } } } // Update criminals for (var k = criminals.length - 1; k >= 0; k--) { var criminal = criminals[k]; criminal.update(); // Check for criminal-player collision if (criminal.intersects(player)) { player.takeDamage(5); LK.effects.flashObject(player, 0xFF0000, 500); // Push player away from criminal var dx = player.x - criminal.x; var dy = player.y - criminal.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist > 0) { player.x += dx / dist * 30; player.y += dy / dist * 30; } } // Remove dead criminals if (criminal.markForDeletion) { criminal.destroy(); criminals.splice(k, 1); } } // Update emergency calls for (var m = emergencyCalls.length - 1; m >= 0; m--) { emergencyCalls[m].update(); if (emergencyCalls[m].markForDeletion) { emergencyCalls[m].destroy(); emergencyCalls.splice(m, 1); } } // Spawn logic spawnTimer++; if (spawnTimer > 180 && criminals.length < maxCriminals) { // Every 3 seconds spawnCriminals(Math.random() * 2048, Math.random() * 2732, 1 + Math.floor(Math.random() * gameLevel)); spawnTimer = 0; } // Emergency call logic emergencyCallTimer++; if (emergencyCallTimer > 600 && emergencyCalls.length < 3) { // Every 10 seconds createEmergencyCall(); emergencyCallTimer = 0; } // Check for level up checkLevelUp(); };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,418 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 12;
+ self.direction = {
+ x: 0,
+ y: -1
+ }; // Default upward
+ self.lifespan = 120; // 2 seconds at 60fps
+ self.age = 0;
+ self.damage = 1;
+ self.update = function () {
+ self.x += self.direction.x * self.speed;
+ self.y += self.direction.y * self.speed;
+ self.age++;
+ if (self.age > self.lifespan) {
+ self.markForDeletion = true;
+ }
+ };
+ return self;
+});
+var Criminal = Container.expand(function () {
+ var self = Container.call(this);
+ var criminalGraphics = self.attachAsset('criminal', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 2;
+ self.health = 3;
+ self.shootCooldown = 0;
+ self.shootDelay = 120; // Frames between shots
+ self.attackRange = 500;
+ self.movePattern = Math.floor(Math.random() * 3); // 0: direct, 1: zigzag, 2: circle
+ self.moveTimer = 0;
+ self.update = function () {
+ // Target the player
+ var dx = player.x - self.x;
+ var dy = player.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ // Movement based on pattern
+ if (distance > 100) {
+ // Keep some distance
+ var moveX = 0;
+ var moveY = 0;
+ switch (self.movePattern) {
+ case 0:
+ // Direct
+ moveX = dx / distance;
+ moveY = dy / distance;
+ break;
+ case 1:
+ // Zigzag
+ self.moveTimer++;
+ moveX = dx / distance + Math.sin(self.moveTimer * 0.1) * 0.5;
+ moveY = dy / distance;
+ break;
+ case 2:
+ // Circle
+ self.moveTimer++;
+ moveX = dx / distance + Math.sin(self.moveTimer * 0.05) * 0.8;
+ moveY = dy / distance + Math.cos(self.moveTimer * 0.05) * 0.8;
+ break;
+ }
+ self.x += moveX * self.speed;
+ self.y += moveY * self.speed;
+ }
+ // Shooting logic
+ if (distance < self.attackRange) {
+ if (self.shootCooldown <= 0) {
+ // Create enemy bullet
+ var bullet = new Bullet();
+ bullet.x = self.x;
+ bullet.y = self.y;
+ // Calculate direction toward player
+ var dirX = dx / distance;
+ var dirY = dy / distance;
+ bullet.direction = {
+ x: dirX,
+ y: dirY
+ };
+ // Mark as enemy bullet
+ bullet.isEnemyBullet = true;
+ // Add to game's bullets array
+ bullets.push(bullet);
+ game.addChild(bullet);
+ // Reset cooldown with some randomness
+ self.shootCooldown = self.shootDelay + Math.random() * 60;
+ }
+ }
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ };
+ self.takeDamage = function () {
+ self.health--;
+ LK.effects.flashObject(self, 0xFF0000, 300);
+ if (self.health <= 0) {
+ LK.getSound('criminal_down').play();
+ LK.setScore(LK.getScore() + 1);
+ self.markForDeletion = true;
+ }
+ };
+ return self;
+});
+var EmergencyCall = Container.expand(function () {
+ var self = Container.call(this);
+ var callGraphics = self.attachAsset('emergencyCall', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.lifetime = 600; // 10 seconds at 60fps
+ self.age = 0;
+ self.flashInterval = 30;
+ self.update = function () {
+ self.age++;
+ // Flash effect
+ if (self.age % self.flashInterval === 0) {
+ if (callGraphics.alpha === 1) {
+ tween(callGraphics, {
+ alpha: 0.3
+ }, {
+ duration: 500
+ });
+ } else {
+ tween(callGraphics, {
+ alpha: 1
+ }, {
+ duration: 500
+ });
+ }
+ }
+ // Expire after lifetime
+ if (self.age > self.lifetime) {
+ self.markForDeletion = true;
+ }
+ };
+ self.down = function () {
+ // Responding to call
+ LK.getSound('radiochatter').play();
+ spawnCriminals(self.x, self.y, 2 + Math.floor(Math.random() * 3));
+ self.markForDeletion = true;
+ // Increase score for responding
+ LK.setScore(LK.getScore() + 2);
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 5;
+ self.health = 100;
+ self.maxHealth = 100;
+ self.shootCooldown = 0;
+ self.shootDelay = 15; // Frames between shots
+ self.canMove = true;
+ // Health bar setup
+ var healthBarBg = self.attachAsset('healthBarBackground', {
+ anchorX: 0.5,
+ anchorY: 0,
+ y: -70
+ });
+ var healthBarFill = self.attachAsset('healthBar', {
+ anchorX: 0.5,
+ anchorY: 0,
+ y: -68
+ });
+ self.updateHealthBar = function () {
+ var healthPercentage = self.health / self.maxHealth;
+ healthBarFill.scale.x = healthPercentage;
+ // Center the health bar
+ healthBarFill.x = -100 * (1 - healthPercentage);
+ };
+ self.takeDamage = function (amount) {
+ self.health -= amount;
+ if (self.health <= 0) {
+ self.health = 0;
+ LK.effects.flashScreen(0xFF0000, 1000);
+ LK.showGameOver();
+ }
+ self.updateHealthBar();
+ };
+ self.shoot = function () {
+ if (self.shootCooldown <= 0) {
+ var bullet = new Bullet();
+ bullet.x = self.x;
+ bullet.y = self.y - 40;
+ // Add to game's bullets array
+ bullets.push(bullet);
+ game.addChild(bullet);
+ // Play gun sound
+ LK.getSound('gunshot').play();
+ // Reset cooldown
+ self.shootCooldown = self.shootDelay;
+ }
+ };
+ self.update = function () {
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ };
+ self.down = function (x, y, obj) {
+ self.shoot();
+ };
+ // Initialize health bar
+ self.updateHealthBar();
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x333333
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var bullets = [];
+var criminals = [];
+var emergencyCalls = [];
+var gameActive = true;
+var dragOffset = {
+ x: 0,
+ y: 0
+};
+var gameLevel = 1;
+var spawnTimer = 0;
+var maxCriminals = 10;
+var emergencyCallTimer = 0;
+// Setup UI
+var scoreTxt = new Text2('Score: 0', {
+ size: 70,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var levelTxt = new Text2('Level: 1', {
+ size: 70,
+ fill: 0xFFFFFF
+});
+levelTxt.anchor.set(0.5, 0);
+levelTxt.y = 80;
+LK.gui.top.addChild(levelTxt);
+// Initialize player
+player = new Player();
+player.x = 2048 / 2;
+player.y = 2732 / 2;
+game.addChild(player);
+// Play background music
+LK.playMusic('background_music');
+// Spawn criminals at a position
+function spawnCriminals(x, y, count) {
+ for (var i = 0; i < count; i++) {
+ if (criminals.length < maxCriminals) {
+ var criminal = new Criminal();
+ // Randomize spawn position around the target
+ var angle = Math.random() * Math.PI * 2;
+ var distance = 300 + Math.random() * 200;
+ criminal.x = x + Math.cos(angle) * distance;
+ criminal.y = y + Math.sin(angle) * distance;
+ // Adjust spawn if out of bounds
+ criminal.x = Math.max(50, Math.min(2048 - 50, criminal.x));
+ criminal.y = Math.max(50, Math.min(2732 - 50, criminal.y));
+ criminals.push(criminal);
+ game.addChild(criminal);
+ }
+ }
+}
+// Create an emergency call at a random position
+function createEmergencyCall() {
+ var call = new EmergencyCall();
+ call.x = Math.random() * (2048 - 200) + 100; // Keep away from edges
+ call.y = Math.random() * (2732 - 200) + 100; // Keep away from edges
+ emergencyCalls.push(call);
+ game.addChild(call);
+ // Play siren sound
+ LK.getSound('siren').play();
+}
+// Check if a level up should occur
+function checkLevelUp() {
+ var score = LK.getScore();
+ var newLevel = Math.floor(score / 10) + 1;
+ if (newLevel > gameLevel) {
+ gameLevel = newLevel;
+ levelTxt.setText('Level: ' + gameLevel);
+ // Increase difficulty
+ maxCriminals = 10 + gameLevel * 2;
+ // Bonus for reaching new level
+ player.health = Math.min(player.maxHealth, player.health + 20);
+ player.updateHealthBar();
+ // Visual feedback
+ LK.effects.flashScreen(0x00FF00, 500);
+ }
+}
+// Game drag handling
+game.down = function (x, y, obj) {
+ if (!player.canMove) return;
+ // Calculate offset for dragging
+ dragOffset.x = player.x - x;
+ dragOffset.y = player.y - y;
+ player.shoot();
+};
+game.move = function (x, y, obj) {
+ if (!player.canMove) return;
+ // Move player with drag
+ player.x = x + dragOffset.x;
+ player.y = y + dragOffset.y;
+ // Keep player in bounds
+ player.x = Math.max(50, Math.min(2048 - 50, player.x));
+ player.y = Math.max(50, Math.min(2732 - 50, player.y));
+};
+game.up = function () {
+ // Add any logic needed when touch/click is released
+};
+// Game update loop
+game.update = function () {
+ if (!gameActive) return;
+ // Update score display
+ scoreTxt.setText('Score: ' + LK.getScore());
+ // Update player
+ player.update();
+ // Update bullets
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ bullet.update();
+ // Check for off-screen bullets
+ if (bullet.x < 0 || bullet.x > 2048 || bullet.y < 0 || bullet.y > 2732 || bullet.markForDeletion) {
+ bullet.destroy();
+ bullets.splice(i, 1);
+ continue;
+ }
+ // Check for bullet collisions
+ if (bullet.isEnemyBullet) {
+ // Enemy bullets hit player
+ if (bullet.intersects(player)) {
+ player.takeDamage(10);
+ bullet.destroy();
+ bullets.splice(i, 1);
+ continue;
+ }
+ } else {
+ // Player bullets hit criminals
+ for (var j = criminals.length - 1; j >= 0; j--) {
+ if (bullet.intersects(criminals[j])) {
+ criminals[j].takeDamage();
+ bullet.destroy();
+ bullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ }
+ // Update criminals
+ for (var k = criminals.length - 1; k >= 0; k--) {
+ var criminal = criminals[k];
+ criminal.update();
+ // Check for criminal-player collision
+ if (criminal.intersects(player)) {
+ player.takeDamage(5);
+ LK.effects.flashObject(player, 0xFF0000, 500);
+ // Push player away from criminal
+ var dx = player.x - criminal.x;
+ var dy = player.y - criminal.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist > 0) {
+ player.x += dx / dist * 30;
+ player.y += dy / dist * 30;
+ }
+ }
+ // Remove dead criminals
+ if (criminal.markForDeletion) {
+ criminal.destroy();
+ criminals.splice(k, 1);
+ }
+ }
+ // Update emergency calls
+ for (var m = emergencyCalls.length - 1; m >= 0; m--) {
+ emergencyCalls[m].update();
+ if (emergencyCalls[m].markForDeletion) {
+ emergencyCalls[m].destroy();
+ emergencyCalls.splice(m, 1);
+ }
+ }
+ // Spawn logic
+ spawnTimer++;
+ if (spawnTimer > 180 && criminals.length < maxCriminals) {
+ // Every 3 seconds
+ spawnCriminals(Math.random() * 2048, Math.random() * 2732, 1 + Math.floor(Math.random() * gameLevel));
+ spawnTimer = 0;
+ }
+ // Emergency call logic
+ emergencyCallTimer++;
+ if (emergencyCallTimer > 600 && emergencyCalls.length < 3) {
+ // Every 10 seconds
+ createEmergencyCall();
+ emergencyCallTimer = 0;
+ }
+ // Check for level up
+ checkLevelUp();
+};
\ No newline at end of file