/****
* Classes
****/
// Asteroid class
var Asteroid = Container.expand(function () {
var self = Container.call(this);
var asteroidGraphics = self.attachAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.rotationSpeed = 0.02;
self.update = function () {
self.y += self.speed;
self.rotation += self.rotationSpeed;
if (self.y > 2732) {
self.destroy();
}
};
});
// Bullet class
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
rotation: 0.785398 // Rotate by 45 degrees to the right
});
self.speed = -30;
self.update = function () {
self.y += self.speed;
if (self.y < 0) {
self.destroy();
}
};
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
enemyGraphics.rotation = -0.785398; // Rotate by 90 degrees to the left
self.speed = 3;
self.horizontalSpeed = Math.random() * 4 - 2; // Random speed between -2 and 2
self.update = function () {
self.y += self.speed;
self.x += self.horizontalSpeed;
if (self.x < 0) {
self.x = 0;
self.horizontalSpeed = Math.random() * 4 - 2; // Random speed between -2 and 2
} else if (self.x > 2048) {
self.x = 2048;
self.horizontalSpeed = Math.random() * 4 - 2; // Random speed between -2 and 2
}
if (self.y > 2732) {
self.destroy();
}
for (var i = 0; i < enemies.length; i++) {
if (enemies[i] != self && enemies[i].intersects(self)) {
self.horizontalSpeed = -self.horizontalSpeed;
break;
}
}
for (var i = 0; i < asteroids.length; i++) {
if (asteroids[i].intersects(self)) {
self.horizontalSpeed = -self.horizontalSpeed;
break;
}
}
};
});
// Explosion class
var Explosion = Container.expand(function () {
var self = Container.call(this);
var explosionGraphics = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5
});
// Play explosion sound when an explosion is created
var explosionSound = LK.getSound('Explosion');
explosionSound.volume = 0.5; // Increase the volume
explosionSound.play();
self.update = function () {
self.scale.x -= 0.01;
self.scale.y -= 0.01;
if (self.scale.x <= 0 || self.scale.y <= 0) {
self.destroy();
}
};
});
//<Assets used in the game will automatically appear here>
// Hero class
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.bulletLimit = 10; // Limit of bullets that can be fired before reloading
self.bulletsFired = 0; // Number of bullets fired since last reload
self.reloadTime = 180; // Time to reload in ticks (3 seconds)
self.reloadCounter = 0; // Counter for reload time
self.canShoot = true; // Whether the hero can shoot or not
self.update = function () {
// If the hero has fired the maximum number of bullets, start the reload counter
if (self.bulletsFired >= self.bulletLimit) {
self.canShoot = false;
self.reloadCounter++;
// If the reload time has passed, reset the counter and the number of bullets fired
if (self.reloadCounter >= self.reloadTime) {
self.bulletsFired = 0;
self.reloadCounter = 0;
self.canShoot = true;
bulletCountTxt.setText('Bullets: ' + (self.bulletLimit - self.bulletsFired));
reloadTxt.visible = false; // Hide the reload sign
} else if (self.reloadCounter > 0) {
reloadTxt.visible = true; // Show the reload sign
}
}
};
});
// Star class
var Star = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
// Set a random brightness for each star
starGraphics.alpha = Math.random();
self.speed = 30;
self.update = function () {
self.y += self.speed;
if (self.y > 2732) {
self.destroy();
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 //Init game with black background
});
/****
* Game Code
****/
// Initialize hero
var hero = game.addChild(new Hero());
hero.x = 2048 / 2;
hero.y = 2732 - 400;
// Create a Text2 object to display the number of bullets left before reloading
var bulletCountTxt = new Text2('Bullets: ' + (hero.bulletLimit - hero.bulletsFired), {
size: 50,
fill: "#ffffff"
});
bulletCountTxt.anchor.set(1, 1); // Anchor to the bottom right corner
LK.gui.bottomRight.addChild(bulletCountTxt);
// Create a Text2 object to display the score at the top of the screen
var scoreTxt = new Text2('Score: 0', {
size: 100,
fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0); // Anchor to the top center
LK.gui.top.addChild(scoreTxt);
// Create a Text2 object to display the reload sign
var reloadTxt = new Text2('RELOADING...', {
size: 100,
fill: "#ff0000"
});
reloadTxt.anchor.set(0.5, 0.5); // Anchor to the center
reloadTxt.visible = false; // Initially hidden
LK.gui.center.addChild(reloadTxt);
// Initialize arrays for asteroids, enemies, bullets and stars
var asteroids = [];
var enemies = [];
var bullets = [];
var stars = [];
// Initialize a variable to keep track of the number of enemies in the current wave
var enemiesInWave = 0;
// Function to spawn stars
function spawnStar() {
var star = new Star();
star.x = Math.random() * 2048;
star.y = -50;
stars.push(star);
game.addChild(star);
}
// Function to handle hero movement
function handleMove(x, y, obj) {
hero.x = x;
}
// Function to shoot bullets
function shootBullet() {
var bullet = new Bullet();
bullet.x = hero.x;
bullet.y = hero.y - 50;
bullets.push(bullet);
game.addChild(bullet);
}
// Function to spawn asteroids
function spawnAsteroid() {
var asteroid = new Asteroid();
asteroid.x = Math.random() * 2048;
asteroid.y = -50;
asteroids.push(asteroid);
game.addChild(asteroid);
}
// Function to spawn enemies
function spawnEnemy() {
// Only spawn a new wave of enemies if all enemies from the previous wave have been destroyed
if (enemiesInWave == 0) {
for (var i = 0; i < 3; i++) {
var enemy = new Enemy();
enemy.x = Math.random() * 2048;
enemy.y = -50;
enemies.push(enemy);
game.addChild(enemy);
}
enemiesInWave = 3;
}
}
// Handle game move event
game.move = handleMove;
// Handle game down event to shoot bullets
game.down = function (x, y, obj) {
if (hero.canShoot) {
shootBullet();
hero.bulletsFired++;
bulletCountTxt.setText('Bullets: ' + (hero.bulletLimit - hero.bulletsFired));
}
};
// Update game logic
game.update = function () {
// Play the background sound and repeat it after it finishes
var backgroundSound = LK.getSound('Background');
if (!backgroundSound.isPlaying) {
backgroundSound.play();
}
// Update asteroids
for (var i = asteroids.length - 1; i >= 0; i--) {
asteroids[i].update();
if (asteroids[i].intersects(hero)) {
LK.effects.flashScreen(0xff0000, 1000);
// Create an explosion at the point of collision
var explosion = new Explosion();
explosion.x = hero.x;
explosion.y = hero.y;
game.addChild(explosion);
// Make the hero vanish off the screen
hero.x = -1000;
hero.y = -1000;
LK.setTimeout(function () {
LK.showGameOver();
}, 3000);
}
}
// Update enemies
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].update();
if (enemies[j].intersects(hero)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
} else if (enemies[j].y >= 2732) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
}
// Update bullets
for (var k = bullets.length - 1; k >= 0; k--) {
bullets[k].update();
for (var l = enemies.length - 1; l >= 0; l--) {
if (bullets[k].intersects(enemies[l])) {
// Create a smaller explosion at the point of collision
var smallExplosion = new Explosion();
smallExplosion.x = bullets[k].x;
smallExplosion.y = bullets[k].y;
smallExplosion.scale.x = 0.5;
smallExplosion.scale.y = 0.5;
game.addChild(smallExplosion);
bullets[k].destroy();
enemies[l].destroy();
bullets.splice(k, 1);
enemies.splice(l, 1);
// Decrease the number of enemies in the current wave
enemiesInWave--;
// Increase the score and update the score text
LK.setScore(LK.getScore() + 1);
scoreTxt.setText('Score: ' + LK.getScore());
break;
}
}
}
// Update stars
for (var m = stars.length - 1; m >= 0; m--) {
stars[m].update();
if (stars[m].y > 2732) {
stars[m].destroy();
stars.splice(m, 1);
}
}
// Spawn asteroids, enemies and stars periodically
if (LK.ticks % 30 == 0) {
spawnAsteroid();
}
if (LK.ticks % 120 == 0) {
spawnEnemy();
}
if (LK.ticks % 5 == 0) {
spawnStar();
}
}; /****
* Classes
****/
// Asteroid class
var Asteroid = Container.expand(function () {
var self = Container.call(this);
var asteroidGraphics = self.attachAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.rotationSpeed = 0.02;
self.update = function () {
self.y += self.speed;
self.rotation += self.rotationSpeed;
if (self.y > 2732) {
self.destroy();
}
};
});
// Bullet class
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
rotation: 0.785398 // Rotate by 45 degrees to the right
});
self.speed = -30;
self.update = function () {
self.y += self.speed;
if (self.y < 0) {
self.destroy();
}
};
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
enemyGraphics.rotation = -0.785398; // Rotate by 90 degrees to the left
self.speed = 3;
self.horizontalSpeed = Math.random() * 4 - 2; // Random speed between -2 and 2
self.update = function () {
self.y += self.speed;
self.x += self.horizontalSpeed;
if (self.x < 0) {
self.x = 0;
self.horizontalSpeed = Math.random() * 4 - 2; // Random speed between -2 and 2
} else if (self.x > 2048) {
self.x = 2048;
self.horizontalSpeed = Math.random() * 4 - 2; // Random speed between -2 and 2
}
if (self.y > 2732) {
self.destroy();
}
for (var i = 0; i < enemies.length; i++) {
if (enemies[i] != self && enemies[i].intersects(self)) {
self.horizontalSpeed = -self.horizontalSpeed;
break;
}
}
for (var i = 0; i < asteroids.length; i++) {
if (asteroids[i].intersects(self)) {
self.horizontalSpeed = -self.horizontalSpeed;
break;
}
}
};
});
// Explosion class
var Explosion = Container.expand(function () {
var self = Container.call(this);
var explosionGraphics = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5
});
// Play explosion sound when an explosion is created
var explosionSound = LK.getSound('Explosion');
explosionSound.volume = 0.5; // Increase the volume
explosionSound.play();
self.update = function () {
self.scale.x -= 0.01;
self.scale.y -= 0.01;
if (self.scale.x <= 0 || self.scale.y <= 0) {
self.destroy();
}
};
});
//<Assets used in the game will automatically appear here>
// Hero class
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.bulletLimit = 10; // Limit of bullets that can be fired before reloading
self.bulletsFired = 0; // Number of bullets fired since last reload
self.reloadTime = 180; // Time to reload in ticks (3 seconds)
self.reloadCounter = 0; // Counter for reload time
self.canShoot = true; // Whether the hero can shoot or not
self.update = function () {
// If the hero has fired the maximum number of bullets, start the reload counter
if (self.bulletsFired >= self.bulletLimit) {
self.canShoot = false;
self.reloadCounter++;
// If the reload time has passed, reset the counter and the number of bullets fired
if (self.reloadCounter >= self.reloadTime) {
self.bulletsFired = 0;
self.reloadCounter = 0;
self.canShoot = true;
bulletCountTxt.setText('Bullets: ' + (self.bulletLimit - self.bulletsFired));
reloadTxt.visible = false; // Hide the reload sign
} else if (self.reloadCounter > 0) {
reloadTxt.visible = true; // Show the reload sign
}
}
};
});
// Star class
var Star = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
// Set a random brightness for each star
starGraphics.alpha = Math.random();
self.speed = 30;
self.update = function () {
self.y += self.speed;
if (self.y > 2732) {
self.destroy();
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 //Init game with black background
});
/****
* Game Code
****/
// Initialize hero
var hero = game.addChild(new Hero());
hero.x = 2048 / 2;
hero.y = 2732 - 400;
// Create a Text2 object to display the number of bullets left before reloading
var bulletCountTxt = new Text2('Bullets: ' + (hero.bulletLimit - hero.bulletsFired), {
size: 50,
fill: "#ffffff"
});
bulletCountTxt.anchor.set(1, 1); // Anchor to the bottom right corner
LK.gui.bottomRight.addChild(bulletCountTxt);
// Create a Text2 object to display the score at the top of the screen
var scoreTxt = new Text2('Score: 0', {
size: 100,
fill: "#ffffff"
});
scoreTxt.anchor.set(0.5, 0); // Anchor to the top center
LK.gui.top.addChild(scoreTxt);
// Create a Text2 object to display the reload sign
var reloadTxt = new Text2('RELOADING...', {
size: 100,
fill: "#ff0000"
});
reloadTxt.anchor.set(0.5, 0.5); // Anchor to the center
reloadTxt.visible = false; // Initially hidden
LK.gui.center.addChild(reloadTxt);
// Initialize arrays for asteroids, enemies, bullets and stars
var asteroids = [];
var enemies = [];
var bullets = [];
var stars = [];
// Initialize a variable to keep track of the number of enemies in the current wave
var enemiesInWave = 0;
// Function to spawn stars
function spawnStar() {
var star = new Star();
star.x = Math.random() * 2048;
star.y = -50;
stars.push(star);
game.addChild(star);
}
// Function to handle hero movement
function handleMove(x, y, obj) {
hero.x = x;
}
// Function to shoot bullets
function shootBullet() {
var bullet = new Bullet();
bullet.x = hero.x;
bullet.y = hero.y - 50;
bullets.push(bullet);
game.addChild(bullet);
}
// Function to spawn asteroids
function spawnAsteroid() {
var asteroid = new Asteroid();
asteroid.x = Math.random() * 2048;
asteroid.y = -50;
asteroids.push(asteroid);
game.addChild(asteroid);
}
// Function to spawn enemies
function spawnEnemy() {
// Only spawn a new wave of enemies if all enemies from the previous wave have been destroyed
if (enemiesInWave == 0) {
for (var i = 0; i < 3; i++) {
var enemy = new Enemy();
enemy.x = Math.random() * 2048;
enemy.y = -50;
enemies.push(enemy);
game.addChild(enemy);
}
enemiesInWave = 3;
}
}
// Handle game move event
game.move = handleMove;
// Handle game down event to shoot bullets
game.down = function (x, y, obj) {
if (hero.canShoot) {
shootBullet();
hero.bulletsFired++;
bulletCountTxt.setText('Bullets: ' + (hero.bulletLimit - hero.bulletsFired));
}
};
// Update game logic
game.update = function () {
// Play the background sound and repeat it after it finishes
var backgroundSound = LK.getSound('Background');
if (!backgroundSound.isPlaying) {
backgroundSound.play();
}
// Update asteroids
for (var i = asteroids.length - 1; i >= 0; i--) {
asteroids[i].update();
if (asteroids[i].intersects(hero)) {
LK.effects.flashScreen(0xff0000, 1000);
// Create an explosion at the point of collision
var explosion = new Explosion();
explosion.x = hero.x;
explosion.y = hero.y;
game.addChild(explosion);
// Make the hero vanish off the screen
hero.x = -1000;
hero.y = -1000;
LK.setTimeout(function () {
LK.showGameOver();
}, 3000);
}
}
// Update enemies
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].update();
if (enemies[j].intersects(hero)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
} else if (enemies[j].y >= 2732) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
}
// Update bullets
for (var k = bullets.length - 1; k >= 0; k--) {
bullets[k].update();
for (var l = enemies.length - 1; l >= 0; l--) {
if (bullets[k].intersects(enemies[l])) {
// Create a smaller explosion at the point of collision
var smallExplosion = new Explosion();
smallExplosion.x = bullets[k].x;
smallExplosion.y = bullets[k].y;
smallExplosion.scale.x = 0.5;
smallExplosion.scale.y = 0.5;
game.addChild(smallExplosion);
bullets[k].destroy();
enemies[l].destroy();
bullets.splice(k, 1);
enemies.splice(l, 1);
// Decrease the number of enemies in the current wave
enemiesInWave--;
// Increase the score and update the score text
LK.setScore(LK.getScore() + 1);
scoreTxt.setText('Score: ' + LK.getScore());
break;
}
}
}
// Update stars
for (var m = stars.length - 1; m >= 0; m--) {
stars[m].update();
if (stars[m].y > 2732) {
stars[m].destroy();
stars.splice(m, 1);
}
}
// Spawn asteroids, enemies and stars periodically
if (LK.ticks % 30 == 0) {
spawnAsteroid();
}
if (LK.ticks % 120 == 0) {
spawnEnemy();
}
if (LK.ticks % 5 == 0) {
spawnStar();
}
};
asteroid. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Single enemy spaceship flying straight downwards viewed from above in colour. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Single futuristic spaceship flying straight upwards viewed from above in colour without any background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Single space torpedo flying upwards in colour. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
explosion in colour. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
large enemy space ship with massive cannons flying downwards viewed from on top in colour. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.