var BombCountdown = Container.expand(function (initialTime) {
var self = Container.call(this);
self.timeRemaining = initialTime;
self.countdownText = new Text2(self.timeRemaining.toString(), {
size: 100,
fill: '#ffffff'
});
self.countdownText.anchor.set(0.5);
self.addChild(self.countdownText);
self.update = function (delta) {
self.timeRemaining -= delta;
if (self.timeRemaining < 0) self.timeRemaining = 0;
self.countdownText.setText('Next bomb in: ' + Math.ceil(self.timeRemaining).toString());
};
});
var BombPickup = Container.expand(function () {
var self = Container.call(this);
self.bombGraphics = self.createAsset('bombPickup', 'Bomb Pickup', 0.5, 0.5);
self.bombGraphics.scale.set(1.3);
});
var Star = Container.expand(function (speed) {
var self = Container.call(this);
self.starGraphics = self.createAsset('star', 'White Round Star', 0.5, 0.5);
self.speed = speed;
self.move = function () {
self.y += self.speed;
if (self.y > 2732) {
self.y = -self.starGraphics.height;
self.x = Math.random() * 2048;
}
};
});
var HealthPickup = Container.expand(function () {
var self = Container.call(this);
self.pickupGraphics = self.createAsset('healthPickup', 'Health Pickup', 0.5, 0.5);
self.pickupGraphics.scale.set(1.3);
});
var HealthBar = Container.expand(function (maxHealth, currentHealth) {
var self = Container.call(this);
self.maxHealth = maxHealth;
self.currentHealth = currentHealth;
self.background = self.createAsset('healthBarBackground', 'Health Bar Background', 0, 0.5);
self.background.scale.set(2, 0.125);
self.foreground = self.createAsset('healthBarForeground', 'Health Bar Foreground', 0, 0.5);
self.foreground.scale.set(2, 0.125);
self.updateHealth = function (newHealth) {
self.currentHealth = newHealth;
self.foreground.scale.x = self.currentHealth / self.maxHealth;
};
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
self.bulletGraphics = self.createAsset('bullet', 'Bullet Graphics', .5, .5);
self.bulletGraphics.scale.set(0.2);
var speed = 20;
self.direction = 0;
self.move = function () {
self.x += Math.cos(self.direction) * speed;
self.y += Math.sin(self.direction) * speed;
if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
if (self.parent && self.parent.bullets && self.parent.bullets.includes(self)) {
self.parent.bullets.splice(self.parent.bullets.indexOf(self), 1);
self.destroy();
}
}
};
self.hit = function (enemy) {
if (self.parent && self.parent.enemies && self.parent.enemies.includes(enemy)) {
enemy.enemyGraphics.scale.x /= 1.2;
enemy.enemyGraphics.scale.y /= 1.2;
if (enemy.enemyGraphics.scale.x < 0.8 || enemy.enemyGraphics.scale.y < 0.8) {
self.parent.enemies.splice(self.parent.enemies.indexOf(enemy), 1);
self.parent.score += 10;
self.parent.scoreText.setText('Score: ' + self.parent.score.toString());
enemy.destroy();
if (self.parent) {
self.parent.score += 10;
self.parent.scoreText.setText('Score: ' + self.parent.score.toString());
}
if (self.parent && self.parent.bullets && self.parent.bullets.includes(self)) {
self.parent.bullets.splice(self.parent.bullets.indexOf(self), 1);
self.destroy();
}
}
}
};
});
var Hero = Container.expand(function () {
var self = Container.call(this);
self.health = 100;
var heroGraphics = self.createAsset('hero', 'Hero character', .5, .5);
heroGraphics.scale.set(1);
heroGraphics.rotation = Math.PI / 2;
self.bullets = [];
self.move = function () {
for (var i = 0; i < self.bullets.length; i++) {
self.bullets[i].move();
}
};
self.lastDamageTime = 0;
self.reduceHealth = function (amount) {
var currentTime = LK.ticks;
if (currentTime - self.lastDamageTime >= 15) {
self.health -= amount * 2;
if (self.health < 0) self.health = 0;
self.healthBar.updateHealth(self.health);
self.lastDamageTime = currentTime;
}
};
self.lastShootTime = 0;
self.shoot = function () {
var currentTime = LK.ticks;
if (currentTime - self.lastShootTime >= 6) {
var nearestEnemy = self.parent.findNearestEnemy(self.x, self.y);
if (nearestEnemy) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.direction = Math.atan2(nearestEnemy.y - self.y, nearestEnemy.x - self.x);
self.rotation = bullet.direction;
self.bullets.push(bullet);
self.parent.addChild(bullet);
bullet.move();
self.lastShootTime = currentTime;
}
}
};
self.trackMovement = function (event) {
var pos = event.getLocalPosition(self.parent);
self.x = pos.x;
self.y = pos.y;
self.healthBar.x = self.x - self.healthBar.width / 2;
self.healthBar.y = self.y - heroGraphics.height / 2 - 10;
};
});
var YellowEnemy = Container.expand(function () {
var self = Container.call(this);
self.enemyGraphics = self.createAsset('yellowEnemy', 'Yellow Enemy character', .5, .5);
var direction = Math.random() * Math.PI * 2;
var speed = 2 * (0.8 + Math.random() * 1);
self.move = function () {
if (self.parent && self.parent.hero && self.parent.hero.x === self.parent.hero.lastX && self.parent.hero.y === self.parent.hero.lastY) {
direction = Math.atan2(self.parent.hero.y - self.y, self.parent.hero.x - self.x);
}
if (direction < 0) direction += 2 * Math.PI;
if (direction > 2 * Math.PI) direction -= 2 * Math.PI;
self.x += Math.cos(direction) * speed;
self.y += Math.sin(direction) * speed;
direction += (Math.random() - 0.5) * 0.1;
self.enemyGraphics.rotation = direction;
var margin = 100;
if (self.x < margin) {
self.x = margin;
direction = 0;
} else if (self.x > 2048 - margin) {
self.x = 2048 - margin;
direction = Math.PI;
}
if (self.y < margin) {
self.y = margin;
direction = Math.PI / 2;
} else if (self.y > 2732 - margin) {
self.y = 2732 - margin;
direction = 3 * Math.PI / 2;
}
if (self.enemyGraphics.scale.x < 0.8 || self.enemyGraphics.scale.y < 0.8) {
self.destroy();
}
};
self.grow = function () {
if (self.enemyGraphics.scale.x < 5 && self.enemyGraphics.scale.y < 5) {
self.enemyGraphics.scale.x *= 1.2;
self.enemyGraphics.scale.y *= 1.2;
}
};
LK.setInterval(self.grow, 1500);
});
var Game = Container.expand(function () {
var self = Container.call(this);
self.spawnBombPickup = function () {
var bombPickup = new BombPickup();
bombPickup.x = Math.random() * (2048 - bombPickup.bombGraphics.width) + bombPickup.bombGraphics.width / 2;
bombPickup.y = Math.random() * (2732 - bombPickup.bombGraphics.height) + bombPickup.bombGraphics.height / 2;
self.bombPickups.push(bombPickup);
self.addChild(bombPickup);
};
self.bombCountdown = new BombCountdown(30);
self.bombCountdown.x = 2048 / 2 - 100 - 400 - 200 + 100;
self.bombCountdown.y = 50;
self.bombCountdown.countdownText.anchor.set(0.5, 0);
self.addChild(self.bombCountdown);
LK.setInterval(self.spawnBombPickup, 30000);
self.checkForBombPickup = function (hero, bombPickups) {
for (var i = bombPickups.length - 1; i >= 0; i--) {
var pickup = bombPickups[i];
if (hero.intersects(pickup)) {
while (self.enemies.length > 0) {
var enemy = self.enemies.pop();
self.score += 10;
self.scoreText.setText('Score: ' + self.score.toString());
enemy.destroy();
}
self.bombCountdown.timeRemaining = 30;
self.bombCountdown.update(0);
pickup.destroy();
bombPickups.splice(i, 1);
}
}
};
self.checkForHealthPickup = function (hero, healthPickups) {
for (var i = healthPickups.length - 1; i >= 0; i--) {
var pickup = healthPickups[i];
if (hero.intersects(pickup)) {
hero.health = hero.healthBar.maxHealth * 2;
hero.healthBar.updateHealth(hero.health);
pickup.destroy();
healthPickups.splice(i, 1);
}
}
};
self.spawnHealthPickup = function () {
var healthPickup = new HealthPickup();
healthPickup.x = Math.random() * (2048 - healthPickup.pickupGraphics.width) + healthPickup.pickupGraphics.width / 2;
healthPickup.y = Math.random() * (2732 - healthPickup.pickupGraphics.height) + healthPickup.pickupGraphics.height / 2;
self.healthPickups.push(healthPickup);
self.addChild(healthPickup);
};
self.findNearestEnemy = function (x, y) {
var nearestEnemy = null;
var nearestDistance = Infinity;
for (var i = 0; i < self.enemies.length; i++) {
var dx = x - self.enemies[i].x;
var dy = y - self.enemies[i].y;
var distanceSquared = dx * dx + dy * dy;
if (distanceSquared < nearestDistance * nearestDistance) {
nearestDistance = Math.sqrt(distanceSquared);
nearestEnemy = self.enemies[i];
}
}
return nearestEnemy;
};
LK.on('tick', function () {
self.bombCountdown.update(1 / 60);
hero.move();
for (var i = 0; i < self.enemies.length; i++) {
self.enemies[i].move();
}
for (var i = 0; i < self.enemies.length; i++) {
if (hero.intersects(self.enemies[i]) && LK.ticks - hero.lastDamageTime >= 15) {
hero.reduceHealth(10);
if (hero.health <= 0) {
LK.showGameOver();
return;
}
}
}
self.checkForHealthPickup(hero, self.healthPickups);
self.checkForBombPickup(hero, self.bombPickups);
if (hero.health <= hero.healthBar.maxHealth * 0.40 && self.healthPickups.length === 0) {
self.spawnHealthPickup();
}
hero.shoot();
for (var i = 0; i < hero.bullets.length; i++) {
for (var j = 0; j < self.enemies.length; j++) {
if (hero.bullets[i] && hero.bullets[i].intersects(self.enemies[j])) {
hero.bullets[i].hit(self.enemies[j]);
hero.bullets[i].destroy();
hero.bullets.splice(i, 1);
i--;
}
}
if (hero.bullets[i] && (hero.bullets[i].x < 0 || hero.bullets[i].x > 2048 || hero.bullets[i].y < 0 || hero.bullets[i].y > 2732)) {
hero.bullets[i].destroy();
hero.bullets.splice(i, 1);
i--;
}
}
});
self.stars = [];
for (var i = 0; i < 100; i++) {
var starSpeed = 0.5 + Math.random() * 2;
var star = new Star(starSpeed);
star.x = Math.random() * 2048;
star.y = Math.random() * 2732;
self.stars.push(star);
self.addChild(star);
}
var hero = self.addChild(new Hero());
self.score = 0;
self.scoreText = new Text2('Score: ' + self.score.toString(), {
size: 100,
fill: '#ffffff'
});
self.scoreText.anchor.set(0.5, 0);
self.scoreText.x = 2048 / 2 + 700;
self.scoreText.y = 50;
self.addChild(self.scoreText);
hero.healthBar = self.addChild(new HealthBar(hero.health, hero.health));
self.enemies = [];
self.score = 0;
self.healthPickups = [];
self.bombPickups = [];
hero.x = 2048 / 2;
hero.y = 2732 / 2;
LK.on('tick', function () {
for (var i = 0; i < self.stars.length; i++) {
self.stars[i].move();
}
hero.move();
for (var i = 0; i < self.enemies.length; i++) {
self.enemies[i].move();
}
});
LK.stage.on('move', function (obj) {
hero.trackMovement(obj.event);
});
var enemySpawnCounter = 0;
var spawnEnemy = LK.setInterval(function () {
if (self.enemies.length < 50) {
var enemy = new YellowEnemy();
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
enemy.x = Math.random() * 2048;
enemy.y = -enemy.enemyGraphics.height;
break;
case 1:
enemy.x = 2048 + enemy.enemyGraphics.width;
enemy.y = Math.random() * 2732;
break;
case 2:
enemy.x = Math.random() * 2048;
enemy.y = 2732 + enemy.enemyGraphics.height;
break;
case 3:
enemy.x = -enemy.enemyGraphics.width;
enemy.y = Math.random() * 2732;
break;
}
self.enemies.push(enemy);
self.addChild(enemy);
enemySpawnCounter++;
}
}, 325);
});
amoeba Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Green equilateral triangle, fills the entire picture space in width and height Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
square box viewed from above. White with a large Red Cross Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Purple bomb Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
space image stylised gas clouds, black and white image, low contrast