User prompt
100 levelden oluşsun 100 leveli bitireni sonda tebrik et
User prompt
Metotlar arenanın içine düşsün
User prompt
Havadan meteor gelsin bize gelirse canımız gitsin
User prompt
Uzaylılar bize daha hızlı vursun
User prompt
10 levelden oluśsun her 200 skor aldığımızda level atlası
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'healthBar.style.fill = "#00FF00";' Line Number: 203
Code edit (1 edits merged)
Please save this source code
User prompt
Battle Arena
Initial prompt
Sawaş oyunu olsun
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); self.speed = 12; self.damage = 1; self.directionX = 0; self.directionY = 0; var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { self.x += self.directionX * self.speed; self.y += self.directionY * self.speed; }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); self.health = 2; self.speed = 2; self.fireRate = 60; // Fire every 60 ticks (faster shooting) self.lastFire = 0; self.damage = 10; var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xFFFFFF, 100); if (self.health <= 0) { return true; // Enemy died } return false; }; self.canFire = function () { return LK.ticks - self.lastFire >= self.fireRate; }; self.fire = function () { if (self.canFire()) { self.lastFire = LK.ticks; return true; } return false; }; self.update = function () { if (warrior) { // Move towards warrior var dx = warrior.x - self.x; var dy = warrior.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); self.speed = 12; self.damage = 15; self.directionX = 0; self.directionY = 0; var bulletGraphics = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { self.x += self.directionX * self.speed; self.y += self.directionY * self.speed; }; return self; }); var Meteor = Container.expand(function () { var self = Container.call(this); self.speed = 8; self.damage = 20; self.rotationSpeed = 0.1; var meteorGraphics = self.attachAsset('meteor', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { self.y += self.speed; self.rotation += self.rotationSpeed; }; return self; }); var Warrior = Container.expand(function () { var self = Container.call(this); self.maxHealth = 100; self.health = self.maxHealth; self.fireRate = 30; // Fire every 30 ticks self.lastFire = 0; self.speed = 8; var warriorGraphics = self.attachAsset('warrior', { anchorX: 0.5, anchorY: 0.5 }); self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0) { self.health = 0; LK.effects.flashObject(self, 0xFF0000, 500); } else { LK.effects.flashObject(self, 0xFF0000, 200); } updateHealthBar(); }; self.canFire = function () { return LK.ticks - self.lastFire >= self.fireRate; }; self.fire = function () { if (self.canFire()) { self.lastFire = LK.ticks; return true; } return false; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1A1A1A }); /**** * Game Code ****/ var warrior; var enemies = []; var bullets = []; var enemyBullets = []; var arenaRadius = 700; var arenaCenter = { x: 2048 / 2, y: 2732 / 2 }; var waveNumber = 1; var enemiesPerWave = 3; var nextWaveTimer = 0; var waveSpawnTimer = 0; var arenaShrintTimer = 0; var minArenaRadius = 200; var dragNode = null; var currentLevel = 1; var maxLevel = 100; var pointsPerLevel = 200; var meteors = []; var meteorSpawnTimer = 0; var meteorSpawnRate = 180; // Spawn meteor every 3 seconds initially // Create arena background var arenaBackground = game.addChild(LK.getAsset('arenaBackground', { anchorX: 0.5, anchorY: 0.5, x: arenaCenter.x, y: arenaCenter.y })); // Create arena var arena = game.addChild(LK.getAsset('arena', { anchorX: 0.5, anchorY: 0.5, x: arenaCenter.x, y: arenaCenter.y })); // Create warrior warrior = game.addChild(new Warrior()); warrior.x = arenaCenter.x; warrior.y = arenaCenter.y; // UI Elements var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); scoreText.x = 120; scoreText.y = 50; LK.gui.topLeft.addChild(scoreText); var waveText = new Text2('Wave: 1', { size: 50, fill: 0xFFFFFF }); waveText.anchor.set(0.5, 0); LK.gui.top.addChild(waveText); var levelText = new Text2('Level: 1', { size: 55, fill: 0xFFD700 }); levelText.anchor.set(1, 0); levelText.x = -120; levelText.y = 50; LK.gui.topRight.addChild(levelText); var healthBar = new Text2('Health: 100', { size: 40, fill: 0x00FF00 }); healthBar.anchor.set(0.5, 1); LK.gui.bottom.addChild(healthBar); function updateHealthBar() { healthBar.setText('Health: ' + warrior.health); if (warrior.health <= 30) { healthBar.fill = "#FF0000"; } else if (warrior.health <= 60) { healthBar.fill = "#FFFF00"; } else { healthBar.fill = "#00FF00"; } } function checkLevelUp() { var newLevel = Math.min(Math.floor(LK.getScore() / pointsPerLevel) + 1, maxLevel); if (newLevel > currentLevel) { currentLevel = newLevel; levelText.setText('Level: ' + currentLevel); LK.effects.flashScreen(0x00FF00, 800); // Check if player reached max level if (currentLevel >= maxLevel) { LK.showYouWin(); return; } } } function isInsideArena(x, y) { var dx = x - arenaCenter.x; var dy = y - arenaCenter.y; return Math.sqrt(dx * dx + dy * dy) <= arenaRadius; } function constrainToArena(obj) { var dx = obj.x - arenaCenter.x; var dy = obj.y - arenaCenter.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > arenaRadius) { obj.x = arenaCenter.x + dx / distance * arenaRadius; obj.y = arenaCenter.y + dy / distance * arenaRadius; } } function spawnEnemy() { var enemy = new Enemy(); // Spawn at random position on arena edge var angle = Math.random() * Math.PI * 2; var spawnRadius = arenaRadius + 100; enemy.x = arenaCenter.x + Math.cos(angle) * spawnRadius; enemy.y = arenaCenter.y + Math.sin(angle) * spawnRadius; enemies.push(enemy); game.addChild(enemy); } function fireBullet(fromX, fromY, toX, toY, isEnemy) { var bullet = isEnemy ? new EnemyBullet() : new Bullet(); bullet.x = fromX; bullet.y = fromY; var dx = toX - fromX; var dy = toY - fromY; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { bullet.directionX = dx / distance; bullet.directionY = dy / distance; } if (isEnemy) { enemyBullets.push(bullet); } else { bullets.push(bullet); LK.getSound('shoot').play(); } game.addChild(bullet); } function spawnMeteor() { var meteor = new Meteor(); // Spawn meteor from random position above the screen, but within arena bounds var arenaLeftBound = arenaCenter.x - arenaRadius; var arenaRightBound = arenaCenter.x + arenaRadius; meteor.x = arenaLeftBound + Math.random() * (arenaRightBound - arenaLeftBound); meteor.y = -100; meteors.push(meteor); game.addChild(meteor); } function findNearestEnemy(x, y) { var nearest = null; var minDistance = Infinity; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - x; var dy = enemy.y - y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < minDistance) { minDistance = distance; nearest = enemy; } } return nearest; } function handleMove(x, y, obj) { if (dragNode) { dragNode.x = x; dragNode.y = y; constrainToArena(dragNode); } } game.move = handleMove; game.down = function (x, y, obj) { dragNode = warrior; handleMove(x, y, obj); }; game.up = function (x, y, obj) { dragNode = null; }; game.update = function () { // Check if warrior is dead if (warrior.health <= 0) { LK.showGameOver(); return; } // Spawn enemies for current wave if (waveSpawnTimer <= 0) { if (enemies.length < enemiesPerWave) { spawnEnemy(); waveSpawnTimer = 60; // Spawn every 60 ticks } } else { waveSpawnTimer--; } // Start next wave if (enemies.length === 0 && nextWaveTimer <= 0) { waveNumber++; enemiesPerWave = Math.min(waveNumber * 2 + 1, 15); nextWaveTimer = 180; // 3 seconds between waves waveText.setText('Wave: ' + waveNumber); } else if (nextWaveTimer > 0) { nextWaveTimer--; } // Shrink arena every 10 waves if (waveNumber % 10 === 0 && arenaShrintTimer <= 0 && arenaRadius > minArenaRadius) { arenaRadius -= 50; arena.width = arenaRadius * 2; arena.height = arenaRadius * 2; arenaShrintTimer = 600; // 10 seconds LK.effects.flashScreen(0xFF0000, 500); } else if (arenaShrintTimer > 0) { arenaShrintTimer--; } // Spawn meteors if (meteorSpawnTimer <= 0) { spawnMeteor(); // Increase meteor spawn rate based on current level meteorSpawnRate = Math.max(60, 180 - currentLevel * 15); meteorSpawnTimer = meteorSpawnRate; } else { meteorSpawnTimer--; } // Update meteors for (var i = meteors.length - 1; i >= 0; i--) { var meteor = meteors[i]; // Remove meteors that have fallen off screen if (meteor.y > 2832) { meteor.destroy(); meteors.splice(i, 1); continue; } // Check collision with warrior if (meteor.intersects(warrior)) { warrior.takeDamage(meteor.damage); LK.getSound('hit').play(); meteor.destroy(); meteors.splice(i, 1); } } // Warrior auto-fire if (warrior.canFire()) { var target = findNearestEnemy(warrior.x, warrior.y); if (target) { var dx = target.x - warrior.x; var dy = target.y - warrior.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 400) { // Only fire if enemy is close enough warrior.fire(); fireBullet(warrior.x, warrior.y, target.x, target.y, false); } } } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; // Constrain enemy to arena constrainToArena(enemy); // Enemy firing if (enemy.canFire()) { var dx = warrior.x - enemy.x; var dy = warrior.y - enemy.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 300) { // Only fire if warrior is close enough enemy.fire(); fireBullet(enemy.x, enemy.y, warrior.x, warrior.y, true); } } // Check collision with warrior if (enemy.intersects(warrior)) { warrior.takeDamage(enemy.damage); LK.getSound('hit').play(); enemy.destroy(); enemies.splice(i, 1); } } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; // Remove bullets outside arena if (!isInsideArena(bullet.x, bullet.y)) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check collision with enemies for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { var enemyDied = enemy.takeDamage(bullet.damage); if (enemyDied) { LK.setScore(LK.getScore() + 10); scoreText.setText('Score: ' + LK.getScore()); checkLevelUp(); LK.getSound('enemyHit').play(); enemy.destroy(); enemies.splice(j, 1); } bullet.destroy(); bullets.splice(i, 1); break; } } } // Update enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var bullet = enemyBullets[i]; // Remove bullets outside arena if (!isInsideArena(bullet.x, bullet.y)) { bullet.destroy(); enemyBullets.splice(i, 1); continue; } // Check collision with warrior if (bullet.intersects(warrior)) { warrior.takeDamage(bullet.damage); LK.getSound('hit').play(); bullet.destroy(); enemyBullets.splice(i, 1); } } // Constrain warrior to arena constrainToArena(warrior); };
===================================================================
--- original.js
+++ change.js
@@ -156,9 +156,9 @@
var arenaShrintTimer = 0;
var minArenaRadius = 200;
var dragNode = null;
var currentLevel = 1;
-var maxLevel = 10;
+var maxLevel = 100;
var pointsPerLevel = 200;
var meteors = [];
var meteorSpawnTimer = 0;
var meteorSpawnRate = 180; // Spawn meteor every 3 seconds initially
Mermi. In-Game asset. 2d. High contrast. No shadows
Uzay aracı. In-Game asset. 2d. High contrast. No shadows
Uzaylı. In-Game asset. 2d. High contrast. No shadows
Ateşli yuvarlak. In-Game asset. 2d. High contrast. No shadows
Mermi. In-Game asset. 2d. High contrast. No shadows
Meteor. In-Game asset. 2d. High contrast. No shadows