/**** * 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); };
/****
* 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);
};
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