/****
* Classes
****/
var Alien = Container.expand(function () {
var self = Container.call(this);
var alienGraphics = self.attachAsset('alien', {
anchorX: 0.5,
anchorY: 0.5,
tint: Math.floor(Math.random() * (0xFFFFFF - 0x808080)) + 0x808080
});
self.baseSpeed = 2;
self.speedMultiplier = 1;
self._move_migrated = function () {
var dy = earth.y - self.y;
var dx = earth.x - self.x;
var angle = Math.atan2(dy, dx);
var speed = self.baseSpeed * self.speedMultiplier;
self.x += speed * Math.cos(angle);
self.y += speed * Math.sin(angle);
// Emit engine particles
var particleAngle = angle + Math.PI; // Opposite direction of movement
if (Math.random() < 0.5) {
var particleSpeed = Math.random() * 2 + 2;
var particle = ParticlePool.get(self.children[0].tint, particleSpeed, particleAngle);
particle.x = self.x + 50 * Math.cos(particleAngle);
particle.y = self.y + 50 * Math.sin(particleAngle);
game.addChild(particle);
}
};
});
var Explosion = Container.expand(function (colorTint) {
var self = Container.call(this);
self.particles = [];
for (var i = 0; i < 20; i++) {
var particle = self.attachAsset('alien', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.2,
scaleY: 0.2,
alpha: 0.8,
tint: colorTint
});
particle.vx = (Math.random() - 0.5) * 10;
particle.vy = (Math.random() - 0.5) * 10;
self.particles.push(particle);
}
self._update_migrated = function () {
for (var i = self.particles.length - 1; i >= 0; i--) {
var p = self.particles[i];
p.x += p.vx;
p.y += p.vy;
p.alpha -= 0.02;
if (p.alpha <= 0) {
p.destroy();
self.particles.splice(i, 1);
}
}
};
});
var Particle = Container.expand(function (colorTint, speed, angle) {
var self = Container.call(this);
var particleGraphics = self.attachAsset('alien', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.3,
scaleY: 0.3,
alpha: 0.8,
tint: colorTint
});
self.vx = speed * Math.cos(angle);
self.vy = speed * Math.sin(angle);
self.lifeSpan = 60;
self.reset = function (colorTint, speed, angle) {
self.vx = speed * Math.cos(angle);
self.vy = speed * Math.sin(angle);
self.alpha = 0.8;
particleGraphics.tint = colorTint;
self.lifeSpan = 60;
};
self._update_migrated = function () {
self.x += self.vx;
self.y += self.vy;
self.alpha -= 1 / self.lifeSpan;
if (self.alpha <= 0) {
self.visible = false;
}
};
return self;
});
// Shield class
var Shield = Container.expand(function () {
var self = Container.call(this);
self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5
});
self.orbitRadius = 200;
self.orbitSpeed = 0.04;
self.orbitAngle = 0;
self._update_migrated = function () {
self.orbitAngle += self.orbitSpeed;
self.x = earth.x + self.orbitRadius * Math.cos(self.orbitAngle);
self.y = earth.y + self.orbitRadius * Math.sin(self.orbitAngle);
var angleToEarth = Math.atan2(earth.y - self.y, earth.x - self.x);
self.rotation = angleToEarth + Math.PI / 2;
};
});
// Star class
var Star = Container.expand(function () {
var self = Container.call(this);
self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self._update_migrated = function () {
var dy = game.height / 2 - self.y;
var dx = game.width / 2 - self.x;
var angle = Math.atan2(dy, dx);
var distanceToCenter = Math.sqrt(dx * dx + dy * dy);
// Make stars move faster as they get closer to earth
var speedMultiplier = 1 + (1 - distanceToCenter / (Math.sqrt(game.height * game.height + game.width * game.width) / 2));
self.x += self.speed * speedMultiplier * Math.cos(angle);
self.y += self.speed * speedMultiplier * Math.sin(angle);
// Make stars transparent as they get closer to earth
self.alpha = distanceToCenter / (Math.sqrt(game.height * game.height + game.width * game.width) / 2);
// Check if star has reached the center of the screen
if (distanceToCenter <= 10) {
// 10 is a small threshold to consider the star at the center
// Destroy and respawn the star
self.x = Math.random() * game.width;
self.y = Math.random() * game.height;
self.alpha = 1; // Reset transparency
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Game variables
var lives = 3;
// Initialize assets used in the game.
// Missile class
// Alien class
// Explosion class
// Particle class
var ParticlePool = function () {
var particles = [];
return {
get: function get(colorTint, speed, angle) {
var particle = particles.find(function (p) {
return !p.visible;
});
if (!particle) {
particle = new Particle(colorTint, speed, angle);
particles.push(particle);
} else {
particle.reset(colorTint, speed, angle);
}
particle.visible = true;
return particle;
},
updateAll: function updateAll() {
particles.forEach(function (particle) {
if (particle.visible) {
particle._update_migrated();
}
});
}
};
}();
var aliens = [];
var earth;
var scoreTxt;
var particles = []; // Array to keep track of particles
var waveNumber = 1;
var aliensPerWave = 5;
var aliensSpawned = 0;
var spawnAlienInterval = 60; // Frames until a new alien spawns
var nextAlienSpawn = spawnAlienInterval;
var waveInterval = 600; // Frames between waves
var nextWaveInterval = waveInterval;
var alienSpeedMultiplier = 1; // Speed multiplier for aliens
// Initialize Earth
function initEarth() {
earth = game.addChild(LK.getAsset('earth', {
anchorX: 0.5,
anchorY: 0.5,
x: game.width / 2,
y: game.height / 2
}));
window.shield = game.addChild(new Shield());
window.shield.x = earth.x;
window.shield.y = earth.y - window.shield.orbitRadius;
}
// Initialize score display
function initScore() {
scoreTxt = new Text2('', {
size: 150,
fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
livesIcons = [];
for (var i = 0; i < lives; i++) {
var lifeIcon = LK.getAsset('earth', {
anchorX: 1,
anchorY: 0,
scaleX: 0.5,
scaleY: 0.5,
x: -i * 60
});
LK.gui.topRight.addChild(lifeIcon);
livesIcons.push(lifeIcon);
}
}
// Spawn an alien
function spawnAlien() {
var alien = new Alien();
alien.baseSpeed = 2 * alienSpeedMultiplier;
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// top
alien.x = Math.random() * game.width;
alien.y = -alien.height;
break;
case 1:
// right
alien.x = game.width + alien.width;
alien.y = Math.random() * game.height;
break;
case 2:
// bottom
alien.x = Math.random() * game.width;
alien.y = game.height + alien.height;
break;
case 3:
// left
alien.x = -alien.width;
alien.y = Math.random() * game.height;
break;
}
aliens.push(alien);
game.addChild(alien);
}
// Check for collisions
function checkCollisions() {
for (var i = 0; i < aliens.length; i++) {
if (window.shield.intersects(aliens[i])) {
var alienColor = aliens[i].children[0].tint;
var explosion = new Explosion(alienColor);
explosion.x = aliens[i].x;
explosion.y = aliens[i].y;
game.addChild(explosion);
aliens[i].destroy();
LK.getSound('Destroy').play();
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore().toString());
aliens.splice(i, 1);
}
}
}
// Game over check
function checkGameOver() {
for (var i = 0; i < aliens.length; i++) {
if (aliens[i].intersects(earth)) {
var alienColor = aliens[i].children[0].tint;
LK.effects.flashScreen(alienColor, 2000);
lives--;
livesIcons[lives].destroy();
livesIcons.pop();
if (lives <= 0) {
LK.showGameOver();
} else {
aliens[i].destroy();
aliens.splice(i, 1);
LK.getSound('Hit').play();
}
break;
}
}
}
// Touch event to move shield
game.on('down', function (x, y, obj) {
window.shield.orbitSpeed *= -1;
LK.getSound('Move').play();
});
// Game tick event
LK.on('tick', function () {
// Update explosions and particles
game.children.forEach(function (child) {
if (child instanceof Explosion) {
child._update_migrated();
}
});
ParticlePool.updateAll();
// Move aliens
for (var j = aliens.length - 1; j >= 0; j--) {
aliens[j]._move_migrated();
if (aliens[j].y > game.height + aliens[j].height) {
aliens[j].destroy();
aliens.splice(j, 1);
}
}
// Spawn aliens and update spawn interval
if (aliensSpawned < aliensPerWave) {
nextAlienSpawn--;
if (nextAlienSpawn <= 0) {
spawnAlien();
aliensSpawned++;
nextAlienSpawn = spawnAlienInterval;
}
} else {
nextWaveInterval--;
if (nextWaveInterval <= 0) {
waveNumber++;
aliensPerWave += 2; // Increase the number of aliens per wave
aliensSpawned = 0;
nextWaveInterval = waveInterval;
alienSpeedMultiplier *= 1.1; // Increase alien speed by 10%
}
}
// Shield speed remains constant
// Update shield position
window.shield._update_migrated();
// Update stars
game.children.forEach(function (child) {
if (child instanceof Star) {
child._update_migrated();
}
});
// Check for collisions and game over
checkCollisions();
checkGameOver();
});
// Initialize game elements
initScore();
// Create stars
for (var i = 0; i < 50; i++) {
var star = new Star();
star.x = Math.random() * game.width;
star.y = Math.random() * game.height;
game.addChild(star);
}
initEarth();
; /****
* Classes
****/
var Alien = Container.expand(function () {
var self = Container.call(this);
var alienGraphics = self.attachAsset('alien', {
anchorX: 0.5,
anchorY: 0.5,
tint: Math.floor(Math.random() * (0xFFFFFF - 0x808080)) + 0x808080
});
self.baseSpeed = 2;
self.speedMultiplier = 1;
self._move_migrated = function () {
var dy = earth.y - self.y;
var dx = earth.x - self.x;
var angle = Math.atan2(dy, dx);
var speed = self.baseSpeed * self.speedMultiplier;
self.x += speed * Math.cos(angle);
self.y += speed * Math.sin(angle);
// Emit engine particles
var particleAngle = angle + Math.PI; // Opposite direction of movement
if (Math.random() < 0.5) {
var particleSpeed = Math.random() * 2 + 2;
var particle = ParticlePool.get(self.children[0].tint, particleSpeed, particleAngle);
particle.x = self.x + 50 * Math.cos(particleAngle);
particle.y = self.y + 50 * Math.sin(particleAngle);
game.addChild(particle);
}
};
});
var Explosion = Container.expand(function (colorTint) {
var self = Container.call(this);
self.particles = [];
for (var i = 0; i < 20; i++) {
var particle = self.attachAsset('alien', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.2,
scaleY: 0.2,
alpha: 0.8,
tint: colorTint
});
particle.vx = (Math.random() - 0.5) * 10;
particle.vy = (Math.random() - 0.5) * 10;
self.particles.push(particle);
}
self._update_migrated = function () {
for (var i = self.particles.length - 1; i >= 0; i--) {
var p = self.particles[i];
p.x += p.vx;
p.y += p.vy;
p.alpha -= 0.02;
if (p.alpha <= 0) {
p.destroy();
self.particles.splice(i, 1);
}
}
};
});
var Particle = Container.expand(function (colorTint, speed, angle) {
var self = Container.call(this);
var particleGraphics = self.attachAsset('alien', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.3,
scaleY: 0.3,
alpha: 0.8,
tint: colorTint
});
self.vx = speed * Math.cos(angle);
self.vy = speed * Math.sin(angle);
self.lifeSpan = 60;
self.reset = function (colorTint, speed, angle) {
self.vx = speed * Math.cos(angle);
self.vy = speed * Math.sin(angle);
self.alpha = 0.8;
particleGraphics.tint = colorTint;
self.lifeSpan = 60;
};
self._update_migrated = function () {
self.x += self.vx;
self.y += self.vy;
self.alpha -= 1 / self.lifeSpan;
if (self.alpha <= 0) {
self.visible = false;
}
};
return self;
});
// Shield class
var Shield = Container.expand(function () {
var self = Container.call(this);
self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5
});
self.orbitRadius = 200;
self.orbitSpeed = 0.04;
self.orbitAngle = 0;
self._update_migrated = function () {
self.orbitAngle += self.orbitSpeed;
self.x = earth.x + self.orbitRadius * Math.cos(self.orbitAngle);
self.y = earth.y + self.orbitRadius * Math.sin(self.orbitAngle);
var angleToEarth = Math.atan2(earth.y - self.y, earth.x - self.x);
self.rotation = angleToEarth + Math.PI / 2;
};
});
// Star class
var Star = Container.expand(function () {
var self = Container.call(this);
self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self._update_migrated = function () {
var dy = game.height / 2 - self.y;
var dx = game.width / 2 - self.x;
var angle = Math.atan2(dy, dx);
var distanceToCenter = Math.sqrt(dx * dx + dy * dy);
// Make stars move faster as they get closer to earth
var speedMultiplier = 1 + (1 - distanceToCenter / (Math.sqrt(game.height * game.height + game.width * game.width) / 2));
self.x += self.speed * speedMultiplier * Math.cos(angle);
self.y += self.speed * speedMultiplier * Math.sin(angle);
// Make stars transparent as they get closer to earth
self.alpha = distanceToCenter / (Math.sqrt(game.height * game.height + game.width * game.width) / 2);
// Check if star has reached the center of the screen
if (distanceToCenter <= 10) {
// 10 is a small threshold to consider the star at the center
// Destroy and respawn the star
self.x = Math.random() * game.width;
self.y = Math.random() * game.height;
self.alpha = 1; // Reset transparency
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Game variables
var lives = 3;
// Initialize assets used in the game.
// Missile class
// Alien class
// Explosion class
// Particle class
var ParticlePool = function () {
var particles = [];
return {
get: function get(colorTint, speed, angle) {
var particle = particles.find(function (p) {
return !p.visible;
});
if (!particle) {
particle = new Particle(colorTint, speed, angle);
particles.push(particle);
} else {
particle.reset(colorTint, speed, angle);
}
particle.visible = true;
return particle;
},
updateAll: function updateAll() {
particles.forEach(function (particle) {
if (particle.visible) {
particle._update_migrated();
}
});
}
};
}();
var aliens = [];
var earth;
var scoreTxt;
var particles = []; // Array to keep track of particles
var waveNumber = 1;
var aliensPerWave = 5;
var aliensSpawned = 0;
var spawnAlienInterval = 60; // Frames until a new alien spawns
var nextAlienSpawn = spawnAlienInterval;
var waveInterval = 600; // Frames between waves
var nextWaveInterval = waveInterval;
var alienSpeedMultiplier = 1; // Speed multiplier for aliens
// Initialize Earth
function initEarth() {
earth = game.addChild(LK.getAsset('earth', {
anchorX: 0.5,
anchorY: 0.5,
x: game.width / 2,
y: game.height / 2
}));
window.shield = game.addChild(new Shield());
window.shield.x = earth.x;
window.shield.y = earth.y - window.shield.orbitRadius;
}
// Initialize score display
function initScore() {
scoreTxt = new Text2('', {
size: 150,
fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
livesIcons = [];
for (var i = 0; i < lives; i++) {
var lifeIcon = LK.getAsset('earth', {
anchorX: 1,
anchorY: 0,
scaleX: 0.5,
scaleY: 0.5,
x: -i * 60
});
LK.gui.topRight.addChild(lifeIcon);
livesIcons.push(lifeIcon);
}
}
// Spawn an alien
function spawnAlien() {
var alien = new Alien();
alien.baseSpeed = 2 * alienSpeedMultiplier;
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// top
alien.x = Math.random() * game.width;
alien.y = -alien.height;
break;
case 1:
// right
alien.x = game.width + alien.width;
alien.y = Math.random() * game.height;
break;
case 2:
// bottom
alien.x = Math.random() * game.width;
alien.y = game.height + alien.height;
break;
case 3:
// left
alien.x = -alien.width;
alien.y = Math.random() * game.height;
break;
}
aliens.push(alien);
game.addChild(alien);
}
// Check for collisions
function checkCollisions() {
for (var i = 0; i < aliens.length; i++) {
if (window.shield.intersects(aliens[i])) {
var alienColor = aliens[i].children[0].tint;
var explosion = new Explosion(alienColor);
explosion.x = aliens[i].x;
explosion.y = aliens[i].y;
game.addChild(explosion);
aliens[i].destroy();
LK.getSound('Destroy').play();
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore().toString());
aliens.splice(i, 1);
}
}
}
// Game over check
function checkGameOver() {
for (var i = 0; i < aliens.length; i++) {
if (aliens[i].intersects(earth)) {
var alienColor = aliens[i].children[0].tint;
LK.effects.flashScreen(alienColor, 2000);
lives--;
livesIcons[lives].destroy();
livesIcons.pop();
if (lives <= 0) {
LK.showGameOver();
} else {
aliens[i].destroy();
aliens.splice(i, 1);
LK.getSound('Hit').play();
}
break;
}
}
}
// Touch event to move shield
game.on('down', function (x, y, obj) {
window.shield.orbitSpeed *= -1;
LK.getSound('Move').play();
});
// Game tick event
LK.on('tick', function () {
// Update explosions and particles
game.children.forEach(function (child) {
if (child instanceof Explosion) {
child._update_migrated();
}
});
ParticlePool.updateAll();
// Move aliens
for (var j = aliens.length - 1; j >= 0; j--) {
aliens[j]._move_migrated();
if (aliens[j].y > game.height + aliens[j].height) {
aliens[j].destroy();
aliens.splice(j, 1);
}
}
// Spawn aliens and update spawn interval
if (aliensSpawned < aliensPerWave) {
nextAlienSpawn--;
if (nextAlienSpawn <= 0) {
spawnAlien();
aliensSpawned++;
nextAlienSpawn = spawnAlienInterval;
}
} else {
nextWaveInterval--;
if (nextWaveInterval <= 0) {
waveNumber++;
aliensPerWave += 2; // Increase the number of aliens per wave
aliensSpawned = 0;
nextWaveInterval = waveInterval;
alienSpeedMultiplier *= 1.1; // Increase alien speed by 10%
}
}
// Shield speed remains constant
// Update shield position
window.shield._update_migrated();
// Update stars
game.children.forEach(function (child) {
if (child instanceof Star) {
child._update_migrated();
}
});
// Check for collisions and game over
checkCollisions();
checkGameOver();
});
// Initialize game elements
initScore();
// Create stars
for (var i = 0; i < 50; i++) {
var star = new Star();
star.x = Math.random() * game.width;
star.y = Math.random() * game.height;
game.addChild(star);
}
initEarth();
;