/****
* Classes
****/
// EnemyBullet class
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.update = function () {
self.y += self.speed;
if (self.y > 2732 + bulletGraphics.height) {
self.destroy();
enemyBullets.splice(enemyBullets.indexOf(self), 1);
}
};
});
// HealthItem class
var HealthItem = Container.expand(function () {
var self = Container.call(this);
var healthItemGraphics = self.attachAsset('healthItem', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.update = function () {
self.y += self.speed;
if (self.y > 2732 + healthItemGraphics.height) {
self.destroy();
healthItems.splice(healthItems.indexOf(self), 1);
}
};
});
// HeroBullet class
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('heroBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.update = function () {
self.y += self.speed;
if (self.y < -bulletGraphics.height) {
self.destroy();
heroBullets.splice(heroBullets.indexOf(self), 1);
}
};
});
//<Assets used in the game will automatically appear here>
// Jet class
var Jet = Container.expand(function () {
var self = Container.call(this);
var jetGraphics = self.attachAsset('jet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.health = 3;
self.update = function () {
// Jet update logic
if (LK.ticks % 30 == 0) {
self.shoot();
}
};
self.shoot = function () {
var bullet = new HeroBullet();
bullet.x = self.x;
bullet.y = self.y - jetGraphics.height / 2;
game.addChild(bullet);
heroBullets.push(bullet);
};
});
// UFO class
var UFO = Container.expand(function () {
var self = Container.call(this);
var ufoGraphics = self.attachAsset('ufo', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.shoot = function () {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + ufoGraphics.height / 2;
game.addChild(bullet);
enemyBullets.push(bullet);
LK.getSound('UFO').play();
};
self.update = function () {
self.y += self.speed;
if (self.y > 2732 + ufoGraphics.height) {
self.destroy();
ufos.splice(ufos.indexOf(self), 1);
enemiesCrossed++;
}
// UFO shoots every 120 ticks
if (LK.ticks % 120 == 0) {
self.shoot();
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 //Init game with black background
});
/****
* Game Code
****/
var background = game.attachAsset('background', {
anchorX: 0.0,
anchorY: 0.0,
x: 0,
y: 0
});
var jet;
var heroBullets = [];
var ufos = [];
var enemyBullets = [];
var healthItems = [];
var score = 0;
var enemiesCrossed = 0;
var scoreTxt = new Text2('0', {
size: 150,
fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
function spawnUFO() {
var ufo = new UFO();
ufo.x = Math.random() * 2048;
ufo.y = -ufo.height;
game.addChild(ufo);
ufos.push(ufo);
}
game.update = function () {
jet.update();
heroBullets.forEach(function (bullet) {
bullet.update();
});
ufos.forEach(function (ufo) {
ufo.update();
});
enemyBullets.forEach(function (bullet) {
bullet.update();
});
enemyBullets.forEach(function (bullet) {
bullet.update();
});
game.move = function (x, y, obj) {
jet.x = x;
};
for (var i = heroBullets.length - 1; i >= 0; i--) {
for (var j = ufos.length - 1; j >= 0; j--) {
if (heroBullets[i].intersects(ufos[j])) {
heroBullets[i].destroy();
heroBullets.splice(i, 1);
var ufoDestroyVFX = LK.getAsset('ufoDestroyVFX', {
anchorX: 0.5,
anchorY: 0.5,
x: ufos[j].x,
y: ufos[j].y
});
game.addChild(ufoDestroyVFX);
LK.setTimeout(function () {
ufoDestroyVFX.destroy();
}, 100);
ufos[j].destroy();
ufos.splice(j, 1);
score += 10;
scoreTxt.setText(score);
break;
}
}
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
if (enemyBullets[i].intersects(jet)) {
enemyBullets[i].destroy();
enemyBullets.splice(i, 1);
jet.destroy();
LK.showGameOver();
break;
}
// Check if enemy bullet intersects with hero bullet
for (var j = heroBullets.length - 1; j >= 0; j--) {
if (enemyBullets[i] && enemyBullets[i].intersects(heroBullets[j])) {
// Destroy both bullets
enemyBullets[i].destroy();
enemyBullets.splice(i, 1);
heroBullets[j].destroy();
heroBullets.splice(j, 1);
// Play bullet collision sound
LK.getSound('BulletCollision').play();
break;
}
}
// Check if jet intersects with a health item
for (var i = healthItems.length - 1; i >= 0; i--) {
if (healthItems[i].intersects(jet)) {
healthItems[i].destroy();
healthItems.splice(i, 1);
jet.health += 1;
break;
}
}
}
// Spawn UFOs and health items periodically
if (LK.ticks % 240 == 0) {
spawnUFO();
if (Math.random() < 0.1) {
// 10% chance to spawn a health item
var healthItem = new HealthItem();
healthItem.x = Math.random() * 2048;
healthItem.y = -healthItem.height;
game.addChild(healthItem);
healthItems.push(healthItem);
}
}
};
// Removed the code that makes the player shoot automatically
jet = game.addChild(new Jet());
jet.x = 2048 / 2;
jet.y = 2732 - 200;
jet.health = 3;
Fighter jet. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Ufo with green alien driving it. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Space with stars with earth background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Red round ball. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Green round ball. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Pixel smoke. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Red Heart with plus symbol at centre. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.