/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var AlienBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('alienBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var AlienEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('alienEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.canShoot = Math.random() > 0.6;
self.shootCounter = 0;
self.shootInterval = 120 + Math.floor(Math.random() * 120);
self.update = function () {
self.y += self.speed;
if (self.canShoot) {
self.shootCounter++;
}
};
return self;
});
var Meteorite = Container.expand(function () {
var self = Container.call(this);
var meteorGraphics = self.attachAsset('meteorite', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.rotationSpeed = 0.02;
self.update = function () {
self.y += self.speed;
self.rotation += self.rotationSpeed;
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PlayerShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.shootCounter = 0;
self.shootInterval = 8;
self.update = function () {
self.shootCounter++;
};
return self;
});
var Spectre = Container.expand(function () {
var self = Container.call(this);
var spectreGraphics = self.attachAsset('alienEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
spectreGraphics.tint = 0x9900ff;
self.phaseActive = true;
self.phaseCounter = 0;
self.phaseDuration = 70 + Math.floor(Math.random() * 70);
self.shotCount = 0;
self.maxShots = 2 + Math.floor(Math.random() * 3);
self.shotDelay = 20;
self.shotCounter = 0;
self.transitionDelay = 180;
self.transitionCounter = 0;
self.update = function () {
if (self.phaseActive) {
self.phaseCounter++;
if (self.phaseCounter >= self.phaseDuration) {
self.vanish();
}
} else {
self.transitionCounter++;
if (self.transitionCounter >= self.transitionDelay) {
self.materialize();
}
}
if (self.phaseActive && self.shotCount < self.maxShots) {
self.shotCounter++;
}
};
self.vanish = function () {
self.phaseActive = false;
self.phaseCounter = 0;
self.transitionCounter = 0;
self.shotCount = 0;
self.shotCounter = 0;
spectreGraphics.alpha = 0.15;
};
self.materialize = function () {
self.phaseActive = true;
self.phaseCounter = 0;
self.shotCount = 0;
self.shotCounter = 0;
self.x = 150 + Math.random() * 1748;
self.y = 250 + Math.random() * 700;
self.phaseDuration = 70 + Math.floor(Math.random() * 70);
spectreGraphics.alpha = 1;
};
return self;
});
var Star = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self.update = function () {
self.y += self.speed;
if (self.y > 2732) {
self.y = -10;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000011
});
/****
* Game Code
****/
var playerShip = game.addChild(new PlayerShip());
playerShip.x = 1024;
playerShip.y = 2600;
var playerBullets = [];
var alienBullets = [];
var aliens = [];
var spectres = [];
var meteorites = [];
var stars = [];
var lives = 3;
var score = 0;
var enemiesDestroyed = 0;
var gameTime = 60;
var gameActive = true;
var ENEMIES_TO_WIN = 35;
var livesText = new Text2('Lives: 3', {
size: 80,
fill: '#00ff00'
});
livesText.anchor.set(0, 0);
LK.gui.topLeft.addChild(livesText);
var scoreText = new Text2('Score: 0', {
size: 80,
fill: '#00ffff'
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var timerText = new Text2('Time: 60', {
size: 100,
fill: '#ffff00'
});
timerText.anchor.set(1, 0);
LK.gui.topRight.addChild(timerText);
// Initialize starfield
var starInitTimer = 0;
function createStarfield() {
for (var i = 0; i < 100; i++) {
var newStar = game.addChild(new Star());
newStar.x = Math.random() * 2048;
newStar.y = Math.random() * 2732;
stars.push(newStar);
}
}
createStarfield();
var spawnAlienTimer = 0;
var spawnMeteoriteTimer = 0;
var spawnSpectreTimer = 0;
function updateUI() {
livesText.setText('Lives: ' + lives);
scoreText.setText('Score: ' + score);
timerText.setText('Time: ' + Math.max(0, Math.ceil(gameTime)));
}
function playerHit() {
lives--;
LK.getSound('playerHit').play();
LK.effects.flashScreen(0xff0000, 300);
updateUI();
if (lives <= 0) {
gameActive = false;
LK.showGameOver();
}
}
function enemyDestroyed() {
score++;
enemiesDestroyed++;
LK.getSound('enemyDestroyed').play();
LK.setScore(score);
updateUI();
}
function handleMove(x, y, obj) {
playerShip.x = x;
playerShip.y = y;
if (playerShip.x < 40) playerShip.x = 40;
if (playerShip.x > 2008) playerShip.x = 2008;
if (playerShip.y < 40) playerShip.y = 40;
if (playerShip.y > 2700) playerShip.y = 2700;
}
game.move = handleMove;
LK.playMusic('bgMusic', {
loop: true
});
game.update = function () {
if (!gameActive) return;
// Update timer
gameTime -= 1 / 60;
updateUI();
if (gameTime <= 0) {
gameActive = false;
if (enemiesDestroyed >= ENEMIES_TO_WIN) {
LK.showYouWin();
} else {
LK.showGameOver();
}
return;
}
// Player shooting
playerShip.shootCounter++;
if (playerShip.shootCounter >= playerShip.shootInterval) {
var newBullet = new PlayerBullet();
newBullet.x = playerShip.x;
newBullet.y = playerShip.y - 40;
playerBullets.push(newBullet);
game.addChild(newBullet);
LK.getSound('playerShoot').play();
playerShip.shootCounter = 0;
}
// Spawn aliens
spawnAlienTimer++;
if (spawnAlienTimer > 90) {
var newAlien = new AlienEnemy();
newAlien.x = Math.random() * 2048;
newAlien.y = -50;
aliens.push(newAlien);
game.addChild(newAlien);
spawnAlienTimer = 0;
}
// Spawn meteorites
spawnMeteoriteTimer++;
if (spawnMeteoriteTimer > 120) {
var newMeteorite = new Meteorite();
newMeteorite.x = Math.random() * 2048;
newMeteorite.y = -50;
meteorites.push(newMeteorite);
game.addChild(newMeteorite);
spawnMeteoriteTimer = 0;
}
// Spawn spectres
spawnSpectreTimer++;
if (spawnSpectreTimer > 180) {
var newSpectre = new Spectre();
newSpectre.x = Math.random() * 2048;
newSpectre.y = 300;
spectres.push(newSpectre);
game.addChild(newSpectre);
spawnSpectreTimer = 0;
}
// Update stars
for (var s = stars.length - 1; s >= 0; s--) {
stars[s].update();
}
// Update and check player bullets
for (var p = playerBullets.length - 1; p >= 0; p--) {
var bullet = playerBullets[p];
bullet.update();
if (bullet.y < -30) {
bullet.destroy();
playerBullets.splice(p, 1);
continue;
}
// Check collision with spectres
for (var sp = spectres.length - 1; sp >= 0; sp--) {
var spectre = spectres[sp];
if (spectre.phaseActive && bullet.intersects(spectre)) {
LK.effects.flashObject(spectre, 0xff0000, 200);
bullet.destroy();
playerBullets.splice(p, 1);
spectre.destroy();
spectres.splice(sp, 1);
enemyDestroyed();
break;
}
}
// Check collision with aliens
for (var a = aliens.length - 1; a >= 0; a--) {
if (bullet.intersects(aliens[a])) {
LK.effects.flashObject(aliens[a], 0xff0000, 200);
bullet.destroy();
playerBullets.splice(p, 1);
aliens[a].destroy();
aliens.splice(a, 1);
enemyDestroyed();
break;
}
}
// Check collision with meteorites
if (p >= 0 && p < playerBullets.length) {
for (var m = meteorites.length - 1; m >= 0; m--) {
if (bullet.intersects(meteorites[m])) {
bullet.destroy();
playerBullets.splice(p, 1);
meteorites[m].destroy();
meteorites.splice(m, 1);
break;
}
}
}
}
// Update spectres and their burst fire
for (var sp = spectres.length - 1; sp >= 0; sp--) {
var spectre = spectres[sp];
spectre.update();
if (spectre.y > 2800) {
spectre.destroy();
spectres.splice(sp, 1);
continue;
}
// Spectre burst fire
if (spectre.phaseActive && spectre.shotCount < spectre.maxShots && spectre.shotCounter >= spectre.shotDelay) {
var newAlienBullet = new AlienBullet();
newAlienBullet.x = spectre.x;
newAlienBullet.y = spectre.y + 30;
alienBullets.push(newAlienBullet);
game.addChild(newAlienBullet);
spectre.shotCount++;
spectre.shotCounter = 0;
}
// Check collision with player
if (spectre.phaseActive && spectre.intersects(playerShip)) {
spectre.destroy();
spectres.splice(sp, 1);
playerHit();
}
}
// Update aliens and their shooting
for (var a = aliens.length - 1; a >= 0; a--) {
var alien = aliens[a];
alien.update();
if (alien.y > 2800) {
alien.destroy();
aliens.splice(a, 1);
continue;
}
// Alien shoots
if (alien.canShoot && alien.shootCounter >= alien.shootInterval) {
var newAlienBullet = new AlienBullet();
newAlienBullet.x = alien.x;
newAlienBullet.y = alien.y + 30;
alienBullets.push(newAlienBullet);
game.addChild(newAlienBullet);
alien.shootCounter = 0;
}
// Check collision with player
if (alien.intersects(playerShip)) {
alien.destroy();
aliens.splice(a, 1);
playerHit();
}
}
// Update meteorites
for (var m = meteorites.length - 1; m >= 0; m--) {
var meteorite = meteorites[m];
meteorite.update();
if (meteorite.y > 2800) {
meteorite.destroy();
meteorites.splice(m, 1);
continue;
}
// Check collision with player
if (meteorite.intersects(playerShip)) {
meteorite.destroy();
meteorites.splice(m, 1);
playerHit();
}
}
// Update alien bullets
for (var ab = alienBullets.length - 1; ab >= 0; ab--) {
var aBullet = alienBullets[ab];
aBullet.update();
if (aBullet.y > 2800) {
aBullet.destroy();
alienBullets.splice(ab, 1);
continue;
}
// Check collision with player
if (aBullet.intersects(playerShip)) {
aBullet.destroy();
alienBullets.splice(ab, 1);
playerHit();
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var AlienBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('alienBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var AlienEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('alienEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.canShoot = Math.random() > 0.6;
self.shootCounter = 0;
self.shootInterval = 120 + Math.floor(Math.random() * 120);
self.update = function () {
self.y += self.speed;
if (self.canShoot) {
self.shootCounter++;
}
};
return self;
});
var Meteorite = Container.expand(function () {
var self = Container.call(this);
var meteorGraphics = self.attachAsset('meteorite', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.rotationSpeed = 0.02;
self.update = function () {
self.y += self.speed;
self.rotation += self.rotationSpeed;
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PlayerShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.shootCounter = 0;
self.shootInterval = 8;
self.update = function () {
self.shootCounter++;
};
return self;
});
var Spectre = Container.expand(function () {
var self = Container.call(this);
var spectreGraphics = self.attachAsset('alienEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
spectreGraphics.tint = 0x9900ff;
self.phaseActive = true;
self.phaseCounter = 0;
self.phaseDuration = 70 + Math.floor(Math.random() * 70);
self.shotCount = 0;
self.maxShots = 2 + Math.floor(Math.random() * 3);
self.shotDelay = 20;
self.shotCounter = 0;
self.transitionDelay = 180;
self.transitionCounter = 0;
self.update = function () {
if (self.phaseActive) {
self.phaseCounter++;
if (self.phaseCounter >= self.phaseDuration) {
self.vanish();
}
} else {
self.transitionCounter++;
if (self.transitionCounter >= self.transitionDelay) {
self.materialize();
}
}
if (self.phaseActive && self.shotCount < self.maxShots) {
self.shotCounter++;
}
};
self.vanish = function () {
self.phaseActive = false;
self.phaseCounter = 0;
self.transitionCounter = 0;
self.shotCount = 0;
self.shotCounter = 0;
spectreGraphics.alpha = 0.15;
};
self.materialize = function () {
self.phaseActive = true;
self.phaseCounter = 0;
self.shotCount = 0;
self.shotCounter = 0;
self.x = 150 + Math.random() * 1748;
self.y = 250 + Math.random() * 700;
self.phaseDuration = 70 + Math.floor(Math.random() * 70);
spectreGraphics.alpha = 1;
};
return self;
});
var Star = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 1;
self.update = function () {
self.y += self.speed;
if (self.y > 2732) {
self.y = -10;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000011
});
/****
* Game Code
****/
var playerShip = game.addChild(new PlayerShip());
playerShip.x = 1024;
playerShip.y = 2600;
var playerBullets = [];
var alienBullets = [];
var aliens = [];
var spectres = [];
var meteorites = [];
var stars = [];
var lives = 3;
var score = 0;
var enemiesDestroyed = 0;
var gameTime = 60;
var gameActive = true;
var ENEMIES_TO_WIN = 35;
var livesText = new Text2('Lives: 3', {
size: 80,
fill: '#00ff00'
});
livesText.anchor.set(0, 0);
LK.gui.topLeft.addChild(livesText);
var scoreText = new Text2('Score: 0', {
size: 80,
fill: '#00ffff'
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var timerText = new Text2('Time: 60', {
size: 100,
fill: '#ffff00'
});
timerText.anchor.set(1, 0);
LK.gui.topRight.addChild(timerText);
// Initialize starfield
var starInitTimer = 0;
function createStarfield() {
for (var i = 0; i < 100; i++) {
var newStar = game.addChild(new Star());
newStar.x = Math.random() * 2048;
newStar.y = Math.random() * 2732;
stars.push(newStar);
}
}
createStarfield();
var spawnAlienTimer = 0;
var spawnMeteoriteTimer = 0;
var spawnSpectreTimer = 0;
function updateUI() {
livesText.setText('Lives: ' + lives);
scoreText.setText('Score: ' + score);
timerText.setText('Time: ' + Math.max(0, Math.ceil(gameTime)));
}
function playerHit() {
lives--;
LK.getSound('playerHit').play();
LK.effects.flashScreen(0xff0000, 300);
updateUI();
if (lives <= 0) {
gameActive = false;
LK.showGameOver();
}
}
function enemyDestroyed() {
score++;
enemiesDestroyed++;
LK.getSound('enemyDestroyed').play();
LK.setScore(score);
updateUI();
}
function handleMove(x, y, obj) {
playerShip.x = x;
playerShip.y = y;
if (playerShip.x < 40) playerShip.x = 40;
if (playerShip.x > 2008) playerShip.x = 2008;
if (playerShip.y < 40) playerShip.y = 40;
if (playerShip.y > 2700) playerShip.y = 2700;
}
game.move = handleMove;
LK.playMusic('bgMusic', {
loop: true
});
game.update = function () {
if (!gameActive) return;
// Update timer
gameTime -= 1 / 60;
updateUI();
if (gameTime <= 0) {
gameActive = false;
if (enemiesDestroyed >= ENEMIES_TO_WIN) {
LK.showYouWin();
} else {
LK.showGameOver();
}
return;
}
// Player shooting
playerShip.shootCounter++;
if (playerShip.shootCounter >= playerShip.shootInterval) {
var newBullet = new PlayerBullet();
newBullet.x = playerShip.x;
newBullet.y = playerShip.y - 40;
playerBullets.push(newBullet);
game.addChild(newBullet);
LK.getSound('playerShoot').play();
playerShip.shootCounter = 0;
}
// Spawn aliens
spawnAlienTimer++;
if (spawnAlienTimer > 90) {
var newAlien = new AlienEnemy();
newAlien.x = Math.random() * 2048;
newAlien.y = -50;
aliens.push(newAlien);
game.addChild(newAlien);
spawnAlienTimer = 0;
}
// Spawn meteorites
spawnMeteoriteTimer++;
if (spawnMeteoriteTimer > 120) {
var newMeteorite = new Meteorite();
newMeteorite.x = Math.random() * 2048;
newMeteorite.y = -50;
meteorites.push(newMeteorite);
game.addChild(newMeteorite);
spawnMeteoriteTimer = 0;
}
// Spawn spectres
spawnSpectreTimer++;
if (spawnSpectreTimer > 180) {
var newSpectre = new Spectre();
newSpectre.x = Math.random() * 2048;
newSpectre.y = 300;
spectres.push(newSpectre);
game.addChild(newSpectre);
spawnSpectreTimer = 0;
}
// Update stars
for (var s = stars.length - 1; s >= 0; s--) {
stars[s].update();
}
// Update and check player bullets
for (var p = playerBullets.length - 1; p >= 0; p--) {
var bullet = playerBullets[p];
bullet.update();
if (bullet.y < -30) {
bullet.destroy();
playerBullets.splice(p, 1);
continue;
}
// Check collision with spectres
for (var sp = spectres.length - 1; sp >= 0; sp--) {
var spectre = spectres[sp];
if (spectre.phaseActive && bullet.intersects(spectre)) {
LK.effects.flashObject(spectre, 0xff0000, 200);
bullet.destroy();
playerBullets.splice(p, 1);
spectre.destroy();
spectres.splice(sp, 1);
enemyDestroyed();
break;
}
}
// Check collision with aliens
for (var a = aliens.length - 1; a >= 0; a--) {
if (bullet.intersects(aliens[a])) {
LK.effects.flashObject(aliens[a], 0xff0000, 200);
bullet.destroy();
playerBullets.splice(p, 1);
aliens[a].destroy();
aliens.splice(a, 1);
enemyDestroyed();
break;
}
}
// Check collision with meteorites
if (p >= 0 && p < playerBullets.length) {
for (var m = meteorites.length - 1; m >= 0; m--) {
if (bullet.intersects(meteorites[m])) {
bullet.destroy();
playerBullets.splice(p, 1);
meteorites[m].destroy();
meteorites.splice(m, 1);
break;
}
}
}
}
// Update spectres and their burst fire
for (var sp = spectres.length - 1; sp >= 0; sp--) {
var spectre = spectres[sp];
spectre.update();
if (spectre.y > 2800) {
spectre.destroy();
spectres.splice(sp, 1);
continue;
}
// Spectre burst fire
if (spectre.phaseActive && spectre.shotCount < spectre.maxShots && spectre.shotCounter >= spectre.shotDelay) {
var newAlienBullet = new AlienBullet();
newAlienBullet.x = spectre.x;
newAlienBullet.y = spectre.y + 30;
alienBullets.push(newAlienBullet);
game.addChild(newAlienBullet);
spectre.shotCount++;
spectre.shotCounter = 0;
}
// Check collision with player
if (spectre.phaseActive && spectre.intersects(playerShip)) {
spectre.destroy();
spectres.splice(sp, 1);
playerHit();
}
}
// Update aliens and their shooting
for (var a = aliens.length - 1; a >= 0; a--) {
var alien = aliens[a];
alien.update();
if (alien.y > 2800) {
alien.destroy();
aliens.splice(a, 1);
continue;
}
// Alien shoots
if (alien.canShoot && alien.shootCounter >= alien.shootInterval) {
var newAlienBullet = new AlienBullet();
newAlienBullet.x = alien.x;
newAlienBullet.y = alien.y + 30;
alienBullets.push(newAlienBullet);
game.addChild(newAlienBullet);
alien.shootCounter = 0;
}
// Check collision with player
if (alien.intersects(playerShip)) {
alien.destroy();
aliens.splice(a, 1);
playerHit();
}
}
// Update meteorites
for (var m = meteorites.length - 1; m >= 0; m--) {
var meteorite = meteorites[m];
meteorite.update();
if (meteorite.y > 2800) {
meteorite.destroy();
meteorites.splice(m, 1);
continue;
}
// Check collision with player
if (meteorite.intersects(playerShip)) {
meteorite.destroy();
meteorites.splice(m, 1);
playerHit();
}
}
// Update alien bullets
for (var ab = alienBullets.length - 1; ab >= 0; ab--) {
var aBullet = alienBullets[ab];
aBullet.update();
if (aBullet.y > 2800) {
aBullet.destroy();
alienBullets.splice(ab, 1);
continue;
}
// Check collision with player
if (aBullet.intersects(playerShip)) {
aBullet.destroy();
alienBullets.splice(ab, 1);
playerHit();
}
}
};