User prompt
only destroy background layers when they are 1000 pixels off screen
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'addChild')' in this line: 'LK.gui.bottomCenter.addChild(self.healthBar);' Line Number: 65
User prompt
move health bar to bottom centre of the screen
User prompt
change score counter to count up by 10 instead of just adding 1000 each time
User prompt
change the explosion destruction interval to 10 ticks
User prompt
every 5 ticks, check for explosion assets and destroy any that remain
User prompt
after creating an explosion, destroy it again after 0.1 seconds
User prompt
create an explosion asset when an enemy is destroyed
User prompt
wait 0.1 seconds and then despawn the explosion
User prompt
every 0.1 seconds check for explosion assets, and destroy any that remain
User prompt
on tick, check for explosion assets and destroy any that remain
User prompt
after 0.1 seconds, destroy the explosion asset
User prompt
when explosion reaches 0.1 seconds, destroy it and remove it from the game
User prompt
after 0.1 seconds, destroy explosion
User prompt
remove explosion after 0.1 second duration
var Explosion = Container.expand(function () {
var self = Container.call(this);
self.timestamp = Date.now();
var explosionGraphics = self.createAsset('explosion', 'Explosion effect', .5, .5);
self.animationDuration = 6;
self.tickCount = 0;
self.on('tick', function () {
self.tickCount++;
if (self.tickCount > self.animationDuration) {
self.destroy();
}
});
});
var ParallaxBackground = Container.expand(function (layers, speed) {
var self = Container.call(this);
self.layers = layers.map(function (layerInfo) {
var layer = self.createAsset(layerInfo.id, layerInfo.description, 0.5, 0.5);
layer.speed = layerInfo.speed;
self.addChild(layer);
return layer;
});
self.move = function () {
self.layers.forEach(function (layer) {
layer.y += layer.speed;
if (layer.y >= 2732) {
layer.y -= 2732 * 2;
}
layer.x = 2048 - layer.width + 1000;
});
};
});
var HealthPickup = Container.expand(function () {
var self = Container.call(this);
self.creationTime = LK.ticks;
var pickupGraphics = self.createAsset('healthPickup', 'Health Pickup', .5, .5);
self.restoreAmount = 10;
self.move = function () {
self.y += 2;
};
self.applyToHero = function (hero) {
hero.health = Math.min(hero.health + self.restoreAmount, hero.healthBar.maxHealth);
hero.healthBar.updateHealth(hero.health);
};
});
var HealthBar = Container.expand(function (maxHealth) {
var self = Container.call(this);
var background = self.createAsset('healthBarBackground', 'Health Bar Background', 0, 0.5);
var foreground = self.createAsset('healthBarForeground', 'Health Bar Foreground', 0, 0.5);
self.setMaxHealth = function (maxHealth) {
self.maxHealth = maxHealth;
self.currentHealth = maxHealth;
};
self.updateHealth = function (currentHealth) {
self.currentHealth = currentHealth;
var scale = currentHealth / self.maxHealth;
foreground.scale.x = scale > 0 ? scale : 0;
};
self.setMaxHealth(maxHealth);
});
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.createAsset('hero', 'Hero character', .5, .5);
self.healthBar = new HealthBar(100);
self.healthBar.x = 10;
self.healthBar.y = 10;
LK.gui.topLeft.addChild(self.healthBar);
self.speed = 5;
self.health = 100;
self.healthBar.setMaxHealth(self.health);
self.healthBar.updateHealth(self.health);
self.move = function () {
if (self.y + self.speed > 0) {
if (self.y + self.speed < 2732) {
self.y += self.speed;
}
}
};
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.createAsset('enemy', 'Enemy character', .5, .5);
self.baseSpeed = -3.6;
self.move = function () {
self.y -= self.baseSpeed;
};
});
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('heroBullet', 'Hero Bullet', .5, .5);
self.speed = 12;
self.move = function () {
self.y -= self.speed;
};
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet', .5, .5);
self.baseSpeed = -12;
self.move = function () {
self.y -= self.baseSpeed;
};
});
var Game = Container.expand(function () {
var self = Container.call(this);
var backgroundLayers = [{
id: 'backgroundFar',
description: 'Far Background',
speed: 0.5
}, {
id: 'backgroundMid',
description: 'Mid Background',
speed: 1
}, {
id: 'backgroundNear',
description: 'Near Background',
speed: 1.5
}];
var parallaxBackground = self.addChild(new ParallaxBackground(backgroundLayers, 2));
var hero = self.addChild(new Hero());
var enemies = [];
var heroBullets = [];
var enemyBullets = [];
var score = 0;
var scoreTxt = new Text2('0', {
size: 150,
fill: "#ffffff"
});
LK.gui.topCenter.addChild(scoreTxt);
hero.x = 200;
hero.y = 2732 / 2;
LK.on('tick', function () {
var LEFT = 37, UP = 38, RIGHT = 39, DOWN = 40;
LK.stage.on('move', function (obj) {
var touchPos = obj.event.getLocalPosition(self);
hero.x = touchPos.x;
hero.y = touchPos.y;
});
if (hero.x < 0) hero.x = 0;
if (hero.x > 2048 - hero.width) hero.x = 2048 - hero.width;
if (hero.y < 0) hero.y = 0;
if (hero.y > 2732 - hero.height) hero.y = 2732 - hero.height;
parallaxBackground.move();
hero.move();
self.children.forEach(function (child) {
if (child instanceof HealthPickup) {
if (hero.intersects(child)) {
child.applyToHero(hero);
child.destroy();
} else if (child.y > 2732 + 50 || LK.ticks - child.creationTime > 300) {
child.destroy();
}
}
});
for (var i = 0; i < enemies.length; i++) {
enemies[i].move();
if (hero.intersects(enemies[i])) {
hero.health -= 20;
hero.healthBar.updateHealth(hero.health);
if (hero.health <= 0) {
LK.showGameOver();
}
enemies[i].destroy();
enemies.splice(i, 1);
continue;
}
if (enemies[i].y > 2732 + 50) {
enemies[i].destroy();
enemies.splice(i, 1);
scoreTxt.setText(score);
}
}
for (var i = 0; i < heroBullets.length; i++) {
heroBullets[i].move();
for (var j = 0; j < enemyBullets.length; j++) {
if (heroBullets[i].intersects(enemyBullets[j])) {
heroBullets[i].destroy();
enemyBullets[j].destroy();
heroBullets.splice(i, 1);
enemyBullets.splice(j, 1);
i--;
break;
}
}
for (var j = 0; j < enemies.length; j++) {
if (heroBullets[i] && heroBullets[i].intersects(enemies[j])) {
var explosion = new Explosion();
explosion.x = enemies[j].x;
explosion.y = enemies[j].y;
self.addChild(explosion);
enemies[j].destroy();
if (Math.random() < 0.05) {
var pickup = new HealthPickup();
pickup.x = enemies[j].x;
pickup.y = enemies[j].y - pickup.height;
self.addChild(pickup);
}
enemies.splice(j, 1);
score += 1000;
scoreTxt.setText(score);
heroBullets[i].destroy();
heroBullets.splice(i, 1);
i--;
break;
}
}
if (heroBullets[i] && heroBullets[i].y < -50) {
heroBullets[i].destroy();
heroBullets.splice(i, 1);
}
}
for (var i = 0; i < enemyBullets.length; i++) {
enemyBullets[i].move();
if (hero.intersects(enemyBullets[i])) {
hero.health -= 20;
hero.healthBar.updateHealth(hero.health);
if (hero.health <= 0) {
LK.showGameOver();
}
enemyBullets[i].destroy();
enemyBullets.splice(i, 1);
continue;
}
if (enemyBullets[i].y > 2732 + 50) {
enemyBullets[i].destroy();
enemyBullets.splice(i, 1);
}
}
});
hero.canShoot = true;
hero.shootCooldown = 12;
hero.lastShotTime = 0;
hero.on('down', function (obj) {
if (hero.canShoot) {
var bullet = new HeroBullet();
bullet.x = hero.x;
bullet.y = hero.y;
heroBullets.push(bullet);
self.addChild(bullet);
hero.canShoot = false;
hero.lastShotTime = LK.ticks;
}
});
LK.on('tick', function () {
if (!hero.canShoot && LK.ticks - hero.lastShotTime > hero.shootCooldown) {
hero.canShoot = true;
}
});
var startTime = Date.now();
var enemySpawnInterval = 2000;
var maxEnemies = 5;
var enemySpeedIncreaseTimer = LK.setInterval(function () {
Enemy.prototype.baseSpeed *= 1.05;
EnemyBullet.prototype.baseSpeed *= 1.05;
}, 30000);
var enemySpawnTimer = LK.setInterval(function () {
var currentTime = Date.now();
var elapsedTime = (currentTime - startTime) / 60000;
maxEnemies = 5 + Math.floor(elapsedTime);
if (enemies.length < maxEnemies) {
var enemy = new Enemy();
var enemyWidth = enemy.width;
enemy.x = Math.random() * (2048 - enemyWidth) + enemyWidth / 2;
enemy.y = -50;
enemies.push(enemy);
self.addChild(enemy);
}
}, enemySpawnInterval);
LK.setInterval(function () {
if (Math.random() < 0.1) {
var pickup = new HealthPickup();
pickup.x = Math.random() * (2048 - pickup.width) + pickup.width / 2;
pickup.y = -50;
self.addChild(pickup);
} else {
var enemyIndex = Math.floor(Math.random() * enemies.length);
var bullet = new EnemyBullet();
bullet.x = enemies[enemyIndex].x;
bullet.y = enemies[enemyIndex].y;
enemyBullets.push(bullet);
self.addChild(bullet);
}
}, 2000);
});
Create a plain red health bar Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create a plain empty health bar Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create a top down view of a single Earth-like planet Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A background image of some stars in space Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A background image of asteroids in space Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic looking explosion, viewed from above. Bright coloured fire Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a double missile pointing vertically, with fire coming out of the rear Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A health pickup icon Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A cool looking spaceship viewed from above Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A round energy based projectile. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.