/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.health = 1;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 100;
self.health = 100;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2550;
var enemies = [];
var bullets = [];
var waveNumber = 1;
var enemiesInWave = 5;
var enemiesKilled = 0;
var currentWaveEnemies = 0;
var healthText = new Text2(player.health.toString(), {
size: 80,
fill: 0x00FF00
});
healthText.anchor.set(0, 0);
LK.gui.topRight.addChild(healthText);
var scoreText = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var waveText = new Text2('Wave ' + waveNumber, {
size: 60,
fill: 0xFFFF00
});
waveText.anchor.set(1, 0);
LK.gui.topRight.addChild(waveText);
var spawnTimer = 0;
var spawnInterval = 60;
var waveComplete = false;
LK.playMusic('bgmusic', {
loop: true
});
function spawnEnemy() {
var newEnemy = game.addChild(new Enemy());
var spawnX = Math.random() * (2048 - 100) + 50;
newEnemy.x = spawnX;
newEnemy.y = -50;
newEnemy.lastY = newEnemy.y;
newEnemy.lastIntersecting = false;
enemies.push(newEnemy);
currentWaveEnemies++;
}
function startNewWave() {
waveNumber++;
enemiesInWave = Math.floor(5 + waveNumber * 1.5);
currentWaveEnemies = 0;
waveComplete = false;
spawnTimer = 0;
spawnInterval = Math.max(30, 60 - waveNumber * 3);
waveText.setText('Wave ' + waveNumber);
}
game.move = function (x, y, obj) {
player.x = x;
if (player.x < 40) player.x = 40;
if (player.x > 2008) player.x = 2008;
};
game.down = function (x, y, obj) {
var newBullet = game.addChild(new Bullet());
newBullet.x = player.x;
newBullet.y = player.y - 50;
newBullet.lastY = newBullet.y;
bullets.push(newBullet);
LK.getSound('shoot').play();
};
game.update = function () {
// Spawn enemies for current wave
if (!waveComplete && currentWaveEnemies < enemiesInWave) {
spawnTimer++;
if (spawnTimer >= spawnInterval) {
spawnEnemy();
spawnTimer = 0;
}
}
// Update and manage bullets
for (var b = bullets.length - 1; b >= 0; b--) {
var bullet = bullets[b];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.y < -30) {
bullet.destroy();
bullets.splice(b, 1);
continue;
}
bullet.lastY = bullet.y;
}
// Update and manage enemies
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
if (enemy.lastIntersecting === undefined) enemy.lastIntersecting = false;
// Enemy reached player
if (enemy.lastY < 2650 && enemy.y >= 2650) {
player.health -= 10;
healthText.setText(player.health.toString());
LK.getSound('damage').play();
if (player.health <= 0) {
LK.showGameOver();
}
enemy.destroy();
enemies.splice(e, 1);
continue;
}
// Check bullet collisions
var bulletHit = false;
for (var b = bullets.length - 1; b >= 0; b--) {
var bullet = bullets[b];
if (enemy.intersects(bullet)) {
bulletHit = true;
bullet.destroy();
bullets.splice(b, 1);
break;
}
}
if (bulletHit) {
enemy.health--;
if (enemy.health <= 0) {
LK.effects.flashObject(enemy, 0xffff00, 100);
LK.getSound('hit').play();
LK.setScore(LK.getScore() + 1);
scoreText.setText(LK.getScore().toString());
enemiesKilled++;
enemy.destroy();
enemies.splice(e, 1);
continue;
}
}
enemy.lastY = enemy.y;
}
// Check if wave is complete
if (!waveComplete && currentWaveEnemies >= enemiesInWave && enemies.length === 0) {
waveComplete = true;
if (LK.getScore() >= 50) {
LK.showYouWin();
} else {
LK.setTimeout(function () {
startNewWave();
}, 1000);
}
}
// Increase difficulty over time
if (enemies.length > 0) {
for (var i = 0; i < enemies.length; i++) {
var speedIncrease = 0.5 + waveNumber * 0.2;
if (enemies[i].speed !== speedIncrease) {
enemies[i].speed = speedIncrease;
}
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.health = 1;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 100;
self.health = 100;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2550;
var enemies = [];
var bullets = [];
var waveNumber = 1;
var enemiesInWave = 5;
var enemiesKilled = 0;
var currentWaveEnemies = 0;
var healthText = new Text2(player.health.toString(), {
size: 80,
fill: 0x00FF00
});
healthText.anchor.set(0, 0);
LK.gui.topRight.addChild(healthText);
var scoreText = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var waveText = new Text2('Wave ' + waveNumber, {
size: 60,
fill: 0xFFFF00
});
waveText.anchor.set(1, 0);
LK.gui.topRight.addChild(waveText);
var spawnTimer = 0;
var spawnInterval = 60;
var waveComplete = false;
LK.playMusic('bgmusic', {
loop: true
});
function spawnEnemy() {
var newEnemy = game.addChild(new Enemy());
var spawnX = Math.random() * (2048 - 100) + 50;
newEnemy.x = spawnX;
newEnemy.y = -50;
newEnemy.lastY = newEnemy.y;
newEnemy.lastIntersecting = false;
enemies.push(newEnemy);
currentWaveEnemies++;
}
function startNewWave() {
waveNumber++;
enemiesInWave = Math.floor(5 + waveNumber * 1.5);
currentWaveEnemies = 0;
waveComplete = false;
spawnTimer = 0;
spawnInterval = Math.max(30, 60 - waveNumber * 3);
waveText.setText('Wave ' + waveNumber);
}
game.move = function (x, y, obj) {
player.x = x;
if (player.x < 40) player.x = 40;
if (player.x > 2008) player.x = 2008;
};
game.down = function (x, y, obj) {
var newBullet = game.addChild(new Bullet());
newBullet.x = player.x;
newBullet.y = player.y - 50;
newBullet.lastY = newBullet.y;
bullets.push(newBullet);
LK.getSound('shoot').play();
};
game.update = function () {
// Spawn enemies for current wave
if (!waveComplete && currentWaveEnemies < enemiesInWave) {
spawnTimer++;
if (spawnTimer >= spawnInterval) {
spawnEnemy();
spawnTimer = 0;
}
}
// Update and manage bullets
for (var b = bullets.length - 1; b >= 0; b--) {
var bullet = bullets[b];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
if (bullet.y < -30) {
bullet.destroy();
bullets.splice(b, 1);
continue;
}
bullet.lastY = bullet.y;
}
// Update and manage enemies
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
if (enemy.lastIntersecting === undefined) enemy.lastIntersecting = false;
// Enemy reached player
if (enemy.lastY < 2650 && enemy.y >= 2650) {
player.health -= 10;
healthText.setText(player.health.toString());
LK.getSound('damage').play();
if (player.health <= 0) {
LK.showGameOver();
}
enemy.destroy();
enemies.splice(e, 1);
continue;
}
// Check bullet collisions
var bulletHit = false;
for (var b = bullets.length - 1; b >= 0; b--) {
var bullet = bullets[b];
if (enemy.intersects(bullet)) {
bulletHit = true;
bullet.destroy();
bullets.splice(b, 1);
break;
}
}
if (bulletHit) {
enemy.health--;
if (enemy.health <= 0) {
LK.effects.flashObject(enemy, 0xffff00, 100);
LK.getSound('hit').play();
LK.setScore(LK.getScore() + 1);
scoreText.setText(LK.getScore().toString());
enemiesKilled++;
enemy.destroy();
enemies.splice(e, 1);
continue;
}
}
enemy.lastY = enemy.y;
}
// Check if wave is complete
if (!waveComplete && currentWaveEnemies >= enemiesInWave && enemies.length === 0) {
waveComplete = true;
if (LK.getScore() >= 50) {
LK.showYouWin();
} else {
LK.setTimeout(function () {
startNewWave();
}, 1000);
}
}
// Increase difficulty over time
if (enemies.length > 0) {
for (var i = 0; i < enemies.length; i++) {
var speedIncrease = 0.5 + waveNumber * 0.2;
if (enemies[i].speed !== speedIncrease) {
enemies[i].speed = speedIncrease;
}
}
}
};
Fullscreen modern App Store landscape banner, 16:9, high definition, for a game titled "Gun Defense: Enemy Invasion" and with the description "Defend yourself against incoming enemy waves. Shoot enemies with your gun to destroy them before they reach you and drain your health. Balance offense and survival as you face increasingly challenging waves.". No text on banner!
WAR PLANE. In-Game asset. 2d. High contrast. No shadows