User prompt
karakterin de maksimum canını 100 yap
User prompt
300 de fazla
User prompt
ana karakterin canını azalt çok fazla
User prompt
düşmanların %25 can azaltmasını %50 yap
User prompt
düşmanlar birbirine hala çok yakın öldüğünü anlayamıyorum
User prompt
öldürülen her 10 düşmanda bir 3 saniyeliğine mermilerin atış hızı çok artısn ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
düşmanlar birbirinin üstüne çıkmasınlar
User prompt
düşmanlar kovalarken aynı yönde kovalamasın farklı farklı yönlerde kovalasınlar
User prompt
TypeError: Cannot read properties of undefined (reading 'destroyed')' in or related to this line: 'if (bullet.destroyed) {' Line Number: 754
User prompt
mermilerin atış hızı az az artacak her 100 öldürmede az az olacak şekilde
User prompt
karakter her öldüğünde map resetlenecek
User prompt
düşmanlar bir garip ölüyor bir mermiyle tek düşmana odaklanacak o ölmeden başka düşamana saldırmayacak
User prompt
düşmanlar ölünce izleri kalmasın lütfen
User prompt
düşmanlar mermiler sonucu tek tek ölecek aynı anda ölmasinler
User prompt
mermilerin hızlanma seviyesini azalt çok hızlı hızlanıyor
User prompt
mermiler çok hızlı ateşleniyor düşmanlar yanımıza gelmeden ölüyorlar
User prompt
düşmanlar öldükten sonra iz bırakmasın
User prompt
düşmanlar patlamasın
User prompt
hala çok çabuk ölüyoruz her düşman isabetinde bizim de canımız az az düşsün 1000 canla başayalım
User prompt
canımız çok çabuk sıfırlanıyor yanımızda düşman doğduğu anda ölüyoruz olmasın o
User prompt
bu can alma şeyini biraz da mermi hızlanacak şekilde ayarla düşman sayısını biraz azalt ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
karakterin canı azaldığında alanın random yerlerinde canını fulleyecek ve 2 saniye boyunca hasar almayacak bir sistem kur ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
düşman sayısını biraz daha artırabilir misin
User prompt
uzaklığa bakılmaksızın mermi isabet eden her düşmanın canı azalacak
User prompt
düşmanları gitgide hızlandır oyun izlerledikçe hız seviyesi ve zorluğu artsın her 25 puanda zorluk biraz daha artacak ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('attackEffect', { anchorX: 0.5, anchorY: 0.5 }); bulletGraphics.scaleX = 0.5; bulletGraphics.scaleY = 0.5; self.speed = 15; self.targetX = 0; self.targetY = 0; self.damage = 0; self.isPlayerBullet = true; self.update = function () { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < self.speed) { // Hit target - check for direct collision with enemies/player if (self.isPlayerBullet) { // Check collision with all enemies for (var i = 0; i < enemies.length; i++) { if (!enemies[i].isRespawning && self.intersects(enemies[i])) { enemies[i].takeDamage(self.damage); self.destroy(); return; } } } else { // Enemy bullet hitting player if (!player.isRespawning && self.intersects(player)) { player.takeDamage(self.damage); self.destroy(); return; } } // If no collision but reached target, destroy bullet self.destroy(); return; } // Move towards target var moveX = dx / distance * self.speed; var moveY = dy / distance * self.speed; self.x += moveX; self.y += moveY; // Remove if out of bounds if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) { self.destroy(); } }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); var healthBarBg = self.attachAsset('healthBarBg', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -60 }); var healthBar = self.attachAsset('healthBar', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -60 }); self.maxHealth = 100; self.health = 100; self.speed = 2; self.attackRange = 100; self.attackDamage = 20; self.attackCooldown = 0; self.isRespawning = false; self.respawnTimer = 0; self.aiTimer = 0; self.targetX = 0; self.targetY = 0; self.takeDamage = function (damage) { if (self.isRespawning) return; // Each bullet hit reduces health by 25% of max health self.health -= self.maxHealth * 0.25; if (self.health < 0) self.health = 0; self.updateHealthBar(); // Flash red when taking damage tween(enemyGraphics, { tint: 0xFF0000 }, { duration: 200, onFinish: function onFinish() { tween(enemyGraphics, { tint: 0xFFFFFF }, { duration: 200 }); } }); if (self.health <= 0) { self.die(); } LK.getSound('hit').play(); }; self.updateHealthBar = function () { var healthPercent = self.health / self.maxHealth; healthBar.scaleX = healthPercent; if (healthPercent > 0.6) { healthBar.tint = 0x00FF00; } else if (healthPercent > 0.3) { healthBar.tint = 0xFFFF00; } else { healthBar.tint = 0xFF0000; } }; self.die = function () { // Random chance for explosion (30% chance) var shouldExplode = Math.random() < 0.3; if (shouldExplode) { // Create explosion effect var explosion = LK.getAsset('attackEffect', { anchorX: 0.5, anchorY: 0.5 }); explosion.x = self.x; explosion.y = self.y; explosion.tint = 0xFF4400; explosion.scaleX = 2; explosion.scaleY = 2; explosion.alpha = 0.8; game.addChild(explosion); // Animate explosion tween(explosion, { scaleX: 4, scaleY: 4, alpha: 0 }, { duration: 500, onFinish: function onFinish() { explosion.destroy(); } }); // Check for chain explosions - damage nearby enemies only var explosionDamage = 50; // Damage nearby enemies for (var i = 0; i < enemies.length; i++) { var otherEnemy = enemies[i]; if (otherEnemy !== self && !otherEnemy.isRespawning) { var dx = otherEnemy.x - self.x; var dy = otherEnemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= explosionRadius) { otherEnemy.takeDamage(explosionDamage, 'explosion'); } } } } self.isRespawning = true; self.respawnTimer = 180; // 3 seconds at 60fps enemyGraphics.alpha = 0.3; healthBar.visible = false; healthBarBg.visible = false; // Increment killed count and spawn new enemy only if under limit enemiesKilled++; score++; scoreText.setText('Score: ' + score); if (enemies.length < maxEnemies) { spawnNewEnemy(); } }; self.respawn = function () { self.health = self.maxHealth; self.isRespawning = false; self.respawnTimer = 0; enemyGraphics.alpha = 1; healthBar.visible = true; healthBarBg.visible = true; self.updateHealthBar(); // Respawn at random position self.x = 300 + Math.random() * 1400; self.y = 400 + Math.random() * 1800; LK.getSound('respawn').play(); }; self.attack = function () { if (self.attackCooldown > 0 || self.isRespawning) return; self.attackCooldown = 90; // 1.5 second cooldown if (!player.isRespawning) { // Create bullet projectile towards player var bullet = game.addChild(new Bullet()); bullet.x = self.x; bullet.y = self.y; bullet.targetX = player.x; bullet.targetY = player.y; bullet.damage = self.attackDamage; bullet.isPlayerBullet = false; bullets.push(bullet); } // Create attack effect var attackEffect = LK.getAsset('attackEffect', { anchorX: 0.5, anchorY: 0.5 }); attackEffect.x = self.x; attackEffect.y = self.y; attackEffect.alpha = 0.7; attackEffect.tint = 0xFF4444; attackEffect.scaleX = 0.8; attackEffect.scaleY = 0.8; game.addChild(attackEffect); // Scale and fade out attack effect tween(attackEffect, { scaleX: 1.2, scaleY: 1.2, alpha: 0 }, { duration: 200, onFinish: function onFinish() { attackEffect.destroy(); } }); LK.getSound('attack').play(); }; self.update = function () { if (self.attackCooldown > 0) { self.attackCooldown--; } if (self.isRespawning) { self.respawnTimer--; if (self.respawnTimer <= 0) { self.respawn(); } return; } // Chase player AI - move towards player and attack when close if (!player.isRespawning) { var dx = player.x - self.x; var dy = player.y - self.y; var playerDistance = Math.sqrt(dx * dx + dy * dy); // Move towards player with speed multiplier var currentSpeed = self.speed * enemySpeedMultiplier; if (playerDistance > currentSpeed) { var moveX = dx / playerDistance * currentSpeed; var moveY = dy / playerDistance * currentSpeed; self.x += moveX; self.y += moveY; } // Attack if close enough to player if (playerDistance <= self.attackRange) { self.attack(); } } // Keep enemy in bounds if (self.x < 150) self.x = 150; if (self.x > 1898) self.x = 1898; if (self.y < 150) self.y = 150; if (self.y > 2582) self.y = 2582; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); var healthBarBg = self.attachAsset('healthBarBg', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -60 }); var healthBar = self.attachAsset('healthBar', { anchorX: 0.5, anchorY: 0.5, x: 0, y: -60 }); self.maxHealth = 300; self.health = 300; self.speed = 8; self.attackRange = 100; self.attackDamage = 25; self.attackCooldown = 0; self.isRespawning = false; self.respawnTimer = 0; self.immunityTimer = 0; // Immunity period after respawn self.takeDamage = function (damage, source) { if (self.isRespawning || self.immunityTimer > 0) return; // Prevent damage from explosions and enemy spawning if (source === 'explosion' || source === 'spawn') { return; } self.health -= damage; if (self.health < 0) self.health = 0; self.updateHealthBar(); // Flash red when taking damage tween(playerGraphics, { tint: 0xFF0000 }, { duration: 200, onFinish: function onFinish() { tween(playerGraphics, { tint: 0xFFFFFF }, { duration: 200 }); } }); if (self.health <= 0) { self.die(); } LK.getSound('hit').play(); }; self.updateHealthBar = function () { var healthPercent = self.health / self.maxHealth; healthBar.scaleX = healthPercent; if (healthPercent > 0.6) { healthBar.tint = 0x00FF00; } else if (healthPercent > 0.3) { healthBar.tint = 0xFFFF00; } else { healthBar.tint = 0xFF0000; } }; self.die = function () { self.isRespawning = true; self.respawnTimer = 180; // 3 seconds at 60fps playerGraphics.alpha = 0.3; healthBar.visible = false; healthBarBg.visible = false; // Reset score when player dies score = 0; scoreText.setText('Score: ' + score); // Reset difficulty scaling difficultyLevel = 0; lastDifficultyScore = 0; enemySpeedMultiplier = 1.0; // Reset speed multiplier }; self.respawn = function () { self.health = self.maxHealth; self.isRespawning = false; self.respawnTimer = 0; playerGraphics.alpha = 1; healthBar.visible = true; healthBarBg.visible = true; self.updateHealthBar(); // Respawn at safe position away from enemies var safeX, safeY; var attempts = 0; var maxAttempts = 20; var minSafeDistance = 300; do { safeX = 300 + Math.random() * 1400; safeY = 400 + Math.random() * 1800; var isSafe = true; for (var e = 0; e < enemies.length; e++) { if (!enemies[e].isRespawning) { var dx = safeX - enemies[e].x; var dy = safeY - enemies[e].y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < minSafeDistance) { isSafe = false; break; } } } attempts++; } while (!isSafe && attempts < maxAttempts); self.x = safeX; self.y = safeY; // Add brief immunity period after respawn self.immunityTimer = 120; // 2 seconds of immunity LK.getSound('respawn').play(); }; self.attack = function () { if (self.attackCooldown > 0 || self.isRespawning) return; // Fire rate proportional to enemy count - more enemies = faster firing var activeEnemies = 0; for (var e = 0; e < enemies.length; e++) { if (!enemies[e].isRespawning) activeEnemies++; } var dynamicFireRate = Math.max(15, baseFireRate - activeEnemies * 8); // Faster with more enemies self.attackCooldown = dynamicFireRate; // Find closest enemy var closestEnemy = null; var closestDistance = Infinity; for (var i = 0; i < enemies.length; i++) { if (!enemies[i].isRespawning) { var distance = Math.sqrt(Math.pow(enemies[i].x - self.x, 2) + Math.pow(enemies[i].y - self.y, 2)); if (distance < closestDistance) { closestDistance = distance; closestEnemy = enemies[i]; } } } if (closestEnemy) { // Create bullet projectile var bullet = game.addChild(new Bullet()); bullet.x = self.x; bullet.y = self.y; bullet.targetX = closestEnemy.x; bullet.targetY = closestEnemy.y; bullet.damage = self.attackDamage; bullet.isPlayerBullet = true; bullets.push(bullet); // Create muzzle flash effect var attackEffect = LK.getAsset('attackEffect', { anchorX: 0.5, anchorY: 0.5 }); attackEffect.x = self.x; attackEffect.y = self.y; attackEffect.alpha = 0.7; attackEffect.tint = 0x4499FF; attackEffect.scaleX = 0.8; attackEffect.scaleY = 0.8; game.addChild(attackEffect); // Scale and fade out attack effect tween(attackEffect, { scaleX: 1.2, scaleY: 1.2, alpha: 0 }, { duration: 200, onFinish: function onFinish() { attackEffect.destroy(); } }); LK.getSound('attack').play(); } }; self.update = function () { if (self.attackCooldown > 0) { self.attackCooldown--; } if (self.immunityTimer > 0) { self.immunityTimer--; // Flash during immunity period if (self.immunityTimer % 10 < 5) { playerGraphics.alpha = 0.5; } else { playerGraphics.alpha = 1; } } if (self.isRespawning) { self.respawnTimer--; if (self.respawnTimer <= 0) { self.respawn(); } return; } // Auto-attack enemies regardless of distance if (self.attackCooldown <= 0) { for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; if (!enemy.isRespawning) { self.attack(); break; // Only attack one enemy per frame } } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2C3E50 }); /**** * Game Code ****/ // Create arena background var arena = game.addChild(LK.getAsset('arena', { anchorX: 0.5, anchorY: 0.5 })); arena.x = 2048 / 2; arena.y = 2732 / 2; // Game variables var player; var enemies = []; var bullets = []; var moveUp = false; var moveDown = false; var moveLeft = false; var moveRight = false; var targetX = 0; var targetY = 0; var isMovingToTarget = false; var enemiesKilled = 0; var score = 0; var baseFireRate = 60; // Base attack cooldown var currentFireRate = 60; var maxEnemies = 8; // Base maximum number of enemies allowed var enemySpeedMultiplier = 1.0; // Gradually increases enemy speed var explosionRadius = 150; // Radius for chain explosions var difficultyLevel = 0; // Current difficulty level var lastDifficultyScore = 0; // Score at last difficulty increase // Create player player = game.addChild(new Player()); player.x = 500; player.y = 1000; // Function to spawn new enemy from random edge function spawnNewEnemy() { var enemy = game.addChild(new Enemy()); var attempts = 0; var maxAttempts = 20; var safeDistance = 400; // Increased minimum safe distance from player do { // Spawn from random edge var edge = Math.floor(Math.random() * 4); if (edge === 0) { // Top edge enemy.x = 150 + Math.random() * 1748; enemy.y = 150; } else if (edge === 1) { // Right edge enemy.x = 1898; enemy.y = 150 + Math.random() * 2432; } else if (edge === 2) { // Bottom edge enemy.x = 150 + Math.random() * 1748; enemy.y = 2582; } else { // Left edge enemy.x = 150; enemy.y = 150 + Math.random() * 2432; } // Check distance from player var dx = enemy.x - player.x; var dy = enemy.y - player.y; var distanceFromPlayer = Math.sqrt(dx * dx + dy * dy); attempts++; } while (distanceFromPlayer < safeDistance && attempts < maxAttempts); enemy.targetX = enemy.x; enemy.targetY = enemy.y; enemies.push(enemy); } // Create initial enemies from random edge positions for (var i = 0; i < 2; i++) { spawnNewEnemy(); } // UI Elements var instructionText = new Text2('Tap to move - Auto attack enemies nearby', { size: 40, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0); LK.gui.top.addChild(instructionText); instructionText.y = 100; // Score display var scoreText = new Text2('Score: 0', { size: 50, fill: 0xFFD700 }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); scoreText.y = 150; var dragNode = null; var lastTouchTime = 0; // Touch controls game.down = function (x, y, obj) { if (player.isRespawning) return; // Keep target position in bounds targetX = Math.max(150, Math.min(1898, x)); targetY = Math.max(150, Math.min(2582, y)); // Stop any current movement tween tween.stop(player, { x: true, y: true }); // Calculate distance for duration (closer = faster) var distance = Math.sqrt(Math.pow(targetX - player.x, 2) + Math.pow(targetY - player.y, 2)); var duration = Math.max(200, Math.min(1000, distance * 2)); // 200ms to 1000ms based on distance isMovingToTarget = true; // Tween player to target position tween(player, { x: targetX, y: targetY }, { duration: duration, easing: tween.easeOut, onFinish: function onFinish() { isMovingToTarget = false; } }); }; game.move = function (x, y, obj) { // No drag movement needed - player moves via tween to clicked position }; game.up = function (x, y, obj) { // No action needed - player auto-attacks when moving }; // Main game loop game.update = function () { // Check for difficulty increase every 25 points if (score - lastDifficultyScore >= 25) { difficultyLevel++; lastDifficultyScore = score; // Increase enemy speed more significantly with each difficulty level enemySpeedMultiplier += 0.3; // More noticeable speed increase per difficulty level // Spawn additional enemies based on difficulty level var enemiesToSpawn = Math.min(2, difficultyLevel); // Spawn 1-2 enemies per difficulty increase for (var d = 0; d < enemiesToSpawn && enemies.length < maxEnemies + difficultyLevel; d++) { spawnNewEnemy(); } // Visual feedback for difficulty increase LK.effects.flashScreen(0x00FF00, 500); // Green flash to indicate difficulty increase } // Gradually increase enemy speed over time (reduced base increase since we have difficulty scaling) enemySpeedMultiplier += 0.0002; // Slower base increase, main increases come from difficulty levels // Update all game objects player.update(); for (var i = 0; i < enemies.length; i++) { enemies[i].update(); } // Update bullets and clean up destroyed ones for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; if (bullet.destroyed) { bullets.splice(i, 1); } else { bullet.update(); } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('attackEffect', {
anchorX: 0.5,
anchorY: 0.5
});
bulletGraphics.scaleX = 0.5;
bulletGraphics.scaleY = 0.5;
self.speed = 15;
self.targetX = 0;
self.targetY = 0;
self.damage = 0;
self.isPlayerBullet = true;
self.update = function () {
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < self.speed) {
// Hit target - check for direct collision with enemies/player
if (self.isPlayerBullet) {
// Check collision with all enemies
for (var i = 0; i < enemies.length; i++) {
if (!enemies[i].isRespawning && self.intersects(enemies[i])) {
enemies[i].takeDamage(self.damage);
self.destroy();
return;
}
}
} else {
// Enemy bullet hitting player
if (!player.isRespawning && self.intersects(player)) {
player.takeDamage(self.damage);
self.destroy();
return;
}
}
// If no collision but reached target, destroy bullet
self.destroy();
return;
}
// Move towards target
var moveX = dx / distance * self.speed;
var moveY = dy / distance * self.speed;
self.x += moveX;
self.y += moveY;
// Remove if out of bounds
if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
self.destroy();
}
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
var healthBarBg = self.attachAsset('healthBarBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -60
});
var healthBar = self.attachAsset('healthBar', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -60
});
self.maxHealth = 100;
self.health = 100;
self.speed = 2;
self.attackRange = 100;
self.attackDamage = 20;
self.attackCooldown = 0;
self.isRespawning = false;
self.respawnTimer = 0;
self.aiTimer = 0;
self.targetX = 0;
self.targetY = 0;
self.takeDamage = function (damage) {
if (self.isRespawning) return;
// Each bullet hit reduces health by 25% of max health
self.health -= self.maxHealth * 0.25;
if (self.health < 0) self.health = 0;
self.updateHealthBar();
// Flash red when taking damage
tween(enemyGraphics, {
tint: 0xFF0000
}, {
duration: 200,
onFinish: function onFinish() {
tween(enemyGraphics, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
if (self.health <= 0) {
self.die();
}
LK.getSound('hit').play();
};
self.updateHealthBar = function () {
var healthPercent = self.health / self.maxHealth;
healthBar.scaleX = healthPercent;
if (healthPercent > 0.6) {
healthBar.tint = 0x00FF00;
} else if (healthPercent > 0.3) {
healthBar.tint = 0xFFFF00;
} else {
healthBar.tint = 0xFF0000;
}
};
self.die = function () {
// Random chance for explosion (30% chance)
var shouldExplode = Math.random() < 0.3;
if (shouldExplode) {
// Create explosion effect
var explosion = LK.getAsset('attackEffect', {
anchorX: 0.5,
anchorY: 0.5
});
explosion.x = self.x;
explosion.y = self.y;
explosion.tint = 0xFF4400;
explosion.scaleX = 2;
explosion.scaleY = 2;
explosion.alpha = 0.8;
game.addChild(explosion);
// Animate explosion
tween(explosion, {
scaleX: 4,
scaleY: 4,
alpha: 0
}, {
duration: 500,
onFinish: function onFinish() {
explosion.destroy();
}
});
// Check for chain explosions - damage nearby enemies only
var explosionDamage = 50;
// Damage nearby enemies
for (var i = 0; i < enemies.length; i++) {
var otherEnemy = enemies[i];
if (otherEnemy !== self && !otherEnemy.isRespawning) {
var dx = otherEnemy.x - self.x;
var dy = otherEnemy.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance <= explosionRadius) {
otherEnemy.takeDamage(explosionDamage, 'explosion');
}
}
}
}
self.isRespawning = true;
self.respawnTimer = 180; // 3 seconds at 60fps
enemyGraphics.alpha = 0.3;
healthBar.visible = false;
healthBarBg.visible = false;
// Increment killed count and spawn new enemy only if under limit
enemiesKilled++;
score++;
scoreText.setText('Score: ' + score);
if (enemies.length < maxEnemies) {
spawnNewEnemy();
}
};
self.respawn = function () {
self.health = self.maxHealth;
self.isRespawning = false;
self.respawnTimer = 0;
enemyGraphics.alpha = 1;
healthBar.visible = true;
healthBarBg.visible = true;
self.updateHealthBar();
// Respawn at random position
self.x = 300 + Math.random() * 1400;
self.y = 400 + Math.random() * 1800;
LK.getSound('respawn').play();
};
self.attack = function () {
if (self.attackCooldown > 0 || self.isRespawning) return;
self.attackCooldown = 90; // 1.5 second cooldown
if (!player.isRespawning) {
// Create bullet projectile towards player
var bullet = game.addChild(new Bullet());
bullet.x = self.x;
bullet.y = self.y;
bullet.targetX = player.x;
bullet.targetY = player.y;
bullet.damage = self.attackDamage;
bullet.isPlayerBullet = false;
bullets.push(bullet);
}
// Create attack effect
var attackEffect = LK.getAsset('attackEffect', {
anchorX: 0.5,
anchorY: 0.5
});
attackEffect.x = self.x;
attackEffect.y = self.y;
attackEffect.alpha = 0.7;
attackEffect.tint = 0xFF4444;
attackEffect.scaleX = 0.8;
attackEffect.scaleY = 0.8;
game.addChild(attackEffect);
// Scale and fade out attack effect
tween(attackEffect, {
scaleX: 1.2,
scaleY: 1.2,
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
attackEffect.destroy();
}
});
LK.getSound('attack').play();
};
self.update = function () {
if (self.attackCooldown > 0) {
self.attackCooldown--;
}
if (self.isRespawning) {
self.respawnTimer--;
if (self.respawnTimer <= 0) {
self.respawn();
}
return;
}
// Chase player AI - move towards player and attack when close
if (!player.isRespawning) {
var dx = player.x - self.x;
var dy = player.y - self.y;
var playerDistance = Math.sqrt(dx * dx + dy * dy);
// Move towards player with speed multiplier
var currentSpeed = self.speed * enemySpeedMultiplier;
if (playerDistance > currentSpeed) {
var moveX = dx / playerDistance * currentSpeed;
var moveY = dy / playerDistance * currentSpeed;
self.x += moveX;
self.y += moveY;
}
// Attack if close enough to player
if (playerDistance <= self.attackRange) {
self.attack();
}
}
// Keep enemy in bounds
if (self.x < 150) self.x = 150;
if (self.x > 1898) self.x = 1898;
if (self.y < 150) self.y = 150;
if (self.y > 2582) self.y = 2582;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
var healthBarBg = self.attachAsset('healthBarBg', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -60
});
var healthBar = self.attachAsset('healthBar', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: -60
});
self.maxHealth = 300;
self.health = 300;
self.speed = 8;
self.attackRange = 100;
self.attackDamage = 25;
self.attackCooldown = 0;
self.isRespawning = false;
self.respawnTimer = 0;
self.immunityTimer = 0; // Immunity period after respawn
self.takeDamage = function (damage, source) {
if (self.isRespawning || self.immunityTimer > 0) return;
// Prevent damage from explosions and enemy spawning
if (source === 'explosion' || source === 'spawn') {
return;
}
self.health -= damage;
if (self.health < 0) self.health = 0;
self.updateHealthBar();
// Flash red when taking damage
tween(playerGraphics, {
tint: 0xFF0000
}, {
duration: 200,
onFinish: function onFinish() {
tween(playerGraphics, {
tint: 0xFFFFFF
}, {
duration: 200
});
}
});
if (self.health <= 0) {
self.die();
}
LK.getSound('hit').play();
};
self.updateHealthBar = function () {
var healthPercent = self.health / self.maxHealth;
healthBar.scaleX = healthPercent;
if (healthPercent > 0.6) {
healthBar.tint = 0x00FF00;
} else if (healthPercent > 0.3) {
healthBar.tint = 0xFFFF00;
} else {
healthBar.tint = 0xFF0000;
}
};
self.die = function () {
self.isRespawning = true;
self.respawnTimer = 180; // 3 seconds at 60fps
playerGraphics.alpha = 0.3;
healthBar.visible = false;
healthBarBg.visible = false;
// Reset score when player dies
score = 0;
scoreText.setText('Score: ' + score);
// Reset difficulty scaling
difficultyLevel = 0;
lastDifficultyScore = 0;
enemySpeedMultiplier = 1.0; // Reset speed multiplier
};
self.respawn = function () {
self.health = self.maxHealth;
self.isRespawning = false;
self.respawnTimer = 0;
playerGraphics.alpha = 1;
healthBar.visible = true;
healthBarBg.visible = true;
self.updateHealthBar();
// Respawn at safe position away from enemies
var safeX, safeY;
var attempts = 0;
var maxAttempts = 20;
var minSafeDistance = 300;
do {
safeX = 300 + Math.random() * 1400;
safeY = 400 + Math.random() * 1800;
var isSafe = true;
for (var e = 0; e < enemies.length; e++) {
if (!enemies[e].isRespawning) {
var dx = safeX - enemies[e].x;
var dy = safeY - enemies[e].y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < minSafeDistance) {
isSafe = false;
break;
}
}
}
attempts++;
} while (!isSafe && attempts < maxAttempts);
self.x = safeX;
self.y = safeY;
// Add brief immunity period after respawn
self.immunityTimer = 120; // 2 seconds of immunity
LK.getSound('respawn').play();
};
self.attack = function () {
if (self.attackCooldown > 0 || self.isRespawning) return;
// Fire rate proportional to enemy count - more enemies = faster firing
var activeEnemies = 0;
for (var e = 0; e < enemies.length; e++) {
if (!enemies[e].isRespawning) activeEnemies++;
}
var dynamicFireRate = Math.max(15, baseFireRate - activeEnemies * 8); // Faster with more enemies
self.attackCooldown = dynamicFireRate;
// Find closest enemy
var closestEnemy = null;
var closestDistance = Infinity;
for (var i = 0; i < enemies.length; i++) {
if (!enemies[i].isRespawning) {
var distance = Math.sqrt(Math.pow(enemies[i].x - self.x, 2) + Math.pow(enemies[i].y - self.y, 2));
if (distance < closestDistance) {
closestDistance = distance;
closestEnemy = enemies[i];
}
}
}
if (closestEnemy) {
// Create bullet projectile
var bullet = game.addChild(new Bullet());
bullet.x = self.x;
bullet.y = self.y;
bullet.targetX = closestEnemy.x;
bullet.targetY = closestEnemy.y;
bullet.damage = self.attackDamage;
bullet.isPlayerBullet = true;
bullets.push(bullet);
// Create muzzle flash effect
var attackEffect = LK.getAsset('attackEffect', {
anchorX: 0.5,
anchorY: 0.5
});
attackEffect.x = self.x;
attackEffect.y = self.y;
attackEffect.alpha = 0.7;
attackEffect.tint = 0x4499FF;
attackEffect.scaleX = 0.8;
attackEffect.scaleY = 0.8;
game.addChild(attackEffect);
// Scale and fade out attack effect
tween(attackEffect, {
scaleX: 1.2,
scaleY: 1.2,
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
attackEffect.destroy();
}
});
LK.getSound('attack').play();
}
};
self.update = function () {
if (self.attackCooldown > 0) {
self.attackCooldown--;
}
if (self.immunityTimer > 0) {
self.immunityTimer--;
// Flash during immunity period
if (self.immunityTimer % 10 < 5) {
playerGraphics.alpha = 0.5;
} else {
playerGraphics.alpha = 1;
}
}
if (self.isRespawning) {
self.respawnTimer--;
if (self.respawnTimer <= 0) {
self.respawn();
}
return;
}
// Auto-attack enemies regardless of distance
if (self.attackCooldown <= 0) {
for (var i = 0; i < enemies.length; i++) {
var enemy = enemies[i];
if (!enemy.isRespawning) {
self.attack();
break; // Only attack one enemy per frame
}
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2C3E50
});
/****
* Game Code
****/
// Create arena background
var arena = game.addChild(LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5
}));
arena.x = 2048 / 2;
arena.y = 2732 / 2;
// Game variables
var player;
var enemies = [];
var bullets = [];
var moveUp = false;
var moveDown = false;
var moveLeft = false;
var moveRight = false;
var targetX = 0;
var targetY = 0;
var isMovingToTarget = false;
var enemiesKilled = 0;
var score = 0;
var baseFireRate = 60; // Base attack cooldown
var currentFireRate = 60;
var maxEnemies = 8; // Base maximum number of enemies allowed
var enemySpeedMultiplier = 1.0; // Gradually increases enemy speed
var explosionRadius = 150; // Radius for chain explosions
var difficultyLevel = 0; // Current difficulty level
var lastDifficultyScore = 0; // Score at last difficulty increase
// Create player
player = game.addChild(new Player());
player.x = 500;
player.y = 1000;
// Function to spawn new enemy from random edge
function spawnNewEnemy() {
var enemy = game.addChild(new Enemy());
var attempts = 0;
var maxAttempts = 20;
var safeDistance = 400; // Increased minimum safe distance from player
do {
// Spawn from random edge
var edge = Math.floor(Math.random() * 4);
if (edge === 0) {
// Top edge
enemy.x = 150 + Math.random() * 1748;
enemy.y = 150;
} else if (edge === 1) {
// Right edge
enemy.x = 1898;
enemy.y = 150 + Math.random() * 2432;
} else if (edge === 2) {
// Bottom edge
enemy.x = 150 + Math.random() * 1748;
enemy.y = 2582;
} else {
// Left edge
enemy.x = 150;
enemy.y = 150 + Math.random() * 2432;
}
// Check distance from player
var dx = enemy.x - player.x;
var dy = enemy.y - player.y;
var distanceFromPlayer = Math.sqrt(dx * dx + dy * dy);
attempts++;
} while (distanceFromPlayer < safeDistance && attempts < maxAttempts);
enemy.targetX = enemy.x;
enemy.targetY = enemy.y;
enemies.push(enemy);
}
// Create initial enemies from random edge positions
for (var i = 0; i < 2; i++) {
spawnNewEnemy();
}
// UI Elements
var instructionText = new Text2('Tap to move - Auto attack enemies nearby', {
size: 40,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0);
LK.gui.top.addChild(instructionText);
instructionText.y = 100;
// Score display
var scoreText = new Text2('Score: 0', {
size: 50,
fill: 0xFFD700
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
scoreText.y = 150;
var dragNode = null;
var lastTouchTime = 0;
// Touch controls
game.down = function (x, y, obj) {
if (player.isRespawning) return;
// Keep target position in bounds
targetX = Math.max(150, Math.min(1898, x));
targetY = Math.max(150, Math.min(2582, y));
// Stop any current movement tween
tween.stop(player, {
x: true,
y: true
});
// Calculate distance for duration (closer = faster)
var distance = Math.sqrt(Math.pow(targetX - player.x, 2) + Math.pow(targetY - player.y, 2));
var duration = Math.max(200, Math.min(1000, distance * 2)); // 200ms to 1000ms based on distance
isMovingToTarget = true;
// Tween player to target position
tween(player, {
x: targetX,
y: targetY
}, {
duration: duration,
easing: tween.easeOut,
onFinish: function onFinish() {
isMovingToTarget = false;
}
});
};
game.move = function (x, y, obj) {
// No drag movement needed - player moves via tween to clicked position
};
game.up = function (x, y, obj) {
// No action needed - player auto-attacks when moving
};
// Main game loop
game.update = function () {
// Check for difficulty increase every 25 points
if (score - lastDifficultyScore >= 25) {
difficultyLevel++;
lastDifficultyScore = score;
// Increase enemy speed more significantly with each difficulty level
enemySpeedMultiplier += 0.3; // More noticeable speed increase per difficulty level
// Spawn additional enemies based on difficulty level
var enemiesToSpawn = Math.min(2, difficultyLevel); // Spawn 1-2 enemies per difficulty increase
for (var d = 0; d < enemiesToSpawn && enemies.length < maxEnemies + difficultyLevel; d++) {
spawnNewEnemy();
}
// Visual feedback for difficulty increase
LK.effects.flashScreen(0x00FF00, 500); // Green flash to indicate difficulty increase
}
// Gradually increase enemy speed over time (reduced base increase since we have difficulty scaling)
enemySpeedMultiplier += 0.0002; // Slower base increase, main increases come from difficulty levels
// Update all game objects
player.update();
for (var i = 0; i < enemies.length; i++) {
enemies[i].update();
}
// Update bullets and clean up destroyed ones
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
if (bullet.destroyed) {
bullets.splice(i, 1);
} else {
bullet.update();
}
}
};
bullet. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Face. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
face. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
green hearth. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
Grey gound . No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat