/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.health = 1;
self.lastY = 0;
self.lastIntersecting = false;
self.takeDamage = function (amount) {
self.health -= amount;
};
self.update = function () {
self.y += self.speed;
if (self.lastY === undefined) self.lastY = self.y;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.moveX = 0;
self.speed = 8;
self.update = function () {
self.x += self.moveX * self.speed;
if (self.x < 40) self.x = 40;
if (self.x > 2048 - 40) self.x = 2048 - 40;
};
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.lastY = 0;
self.update = function () {
self.y += self.speed;
if (self.lastY === undefined) self.lastY = self.y;
};
return self;
});
var SkillUpgrade = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('upgradeBackground', {
anchorX: 0.5,
anchorY: 0.5
});
background.width = 2048;
background.height = 2732;
background.x = 1024;
background.y = 1366;
var titleText = new Text2('Choose an Upgrade', {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
titleText.x = 1024;
titleText.y = 200;
self.addChild(titleText);
var skills = [{
name: 'Faster Bullets',
effect: 'bulletSpeed'
}, {
name: 'Rapid Fire',
effect: 'fireRate'
}, {
name: 'More Health',
effect: 'playerHealth'
}];
self.skillButtons = [];
for (var i = 0; i < skills.length; i++) {
var buttonBg = self.attachAsset('skillButton', {
anchorX: 0.5,
anchorY: 0.5
});
buttonBg.width = 600;
buttonBg.height = 200;
buttonBg.x = 1024;
buttonBg.y = 800 + i * 300;
var skillText = new Text2(skills[i].name, {
size: 80,
fill: 0xFFFFFF
});
skillText.anchor.set(0.5, 0.5);
skillText.x = 1024;
skillText.y = 800 + i * 300;
self.addChild(skillText);
self.skillButtons.push({
bg: buttonBg,
x: 1024,
y: 800 + i * 300,
effect: skills[i].effect,
index: i
});
}
self.selectedSkill = null;
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 = 2400;
var playerBullets = [];
var enemies = [];
var currentWave = 1;
var enemiesKilledInWave = 0;
var enemiesToKillInWave = 5;
var gameScore = 0;
var playerStats = {
bulletSpeed: -15,
fireRate: 400,
playerHealth: 1
};
var upgradeScreenActive = false;
var waveText = new Text2('Wave: ' + currentWave, {
size: 100,
fill: 0xFFFFFF
});
waveText.anchor.set(0.5, 0);
LK.gui.top.addChild(waveText);
var scoreText = new Text2('Score: 0', {
size: 80,
fill: 0xFFFF00
});
scoreText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(scoreText);
var enemyCountText = new Text2('Enemies: 0/' + enemiesToKillInWave, {
size: 80,
fill: 0x00FFFF
});
enemyCountText.anchor.set(0, 1);
LK.gui.bottomLeft.addChild(enemyCountText);
var dragNode = null;
var touchStartX = 0;
function spawnEnemy() {
var newEnemy = new Enemy();
newEnemy.x = Math.random() * (2048 - 140) + 70;
newEnemy.y = -50;
var speedMultiplier = 1 + (currentWave - 1) * 0.3;
newEnemy.speed = 2 + speedMultiplier;
newEnemy.health = 1 + Math.floor((currentWave - 1) / 3);
newEnemy.lastY = newEnemy.y;
newEnemy.lastIntersecting = false;
enemies.push(newEnemy);
game.addChild(newEnemy);
}
function applySkillUpgrade(skillEffect) {
if (skillEffect === 'bulletSpeed') {
playerStats.bulletSpeed -= 3;
} else if (skillEffect === 'fireRate') {
playerStats.fireRate = Math.max(150, playerStats.fireRate - 50);
} else if (skillEffect === 'playerHealth') {
playerStats.playerHealth += 1;
}
}
function fireProjectile() {
var bullet = new PlayerBullet();
bullet.x = player.x;
bullet.y = player.y - 40;
bullet.speed = playerStats.bulletSpeed;
bullet.lastY = bullet.y;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
var spawnTimer = LK.setInterval(function () {
if (enemies.length < 3 + currentWave) {
spawnEnemy();
}
}, 800);
var fireTimer = LK.setInterval(function () {
fireProjectile();
}, playerStats.fireRate);
game.down = function (x, y, obj) {
dragNode = player;
};
game.move = function (x, y, obj) {
if (dragNode) {
player.x = x;
if (player.x < 40) player.x = 40;
if (player.x > 2048 - 40) player.x = 2048 - 40;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
for (var a = playerBullets.length - 1; a >= 0; a--) {
var bullet = playerBullets[a];
if (bullet.y < -50) {
bullet.destroy();
playerBullets.splice(a, 1);
continue;
}
var bulletDestroyed = false;
for (var b = enemies.length - 1; b >= 0; b--) {
var enemy = enemies[b];
if (bullet.intersects(enemy)) {
enemy.takeDamage(1);
LK.getSound('enemyHit').play();
if (enemy.health <= 0) {
enemy.destroy();
enemies.splice(b, 1);
gameScore += 10;
enemiesKilledInWave++;
scoreText.setText('Score: ' + gameScore);
enemyCountText.setText('Enemies: ' + enemiesKilledInWave + '/' + enemiesToKillInWave);
if (enemiesKilledInWave >= enemiesToKillInWave) {
currentWave++;
enemiesKilledInWave = 0;
enemiesToKillInWave = 5 + (currentWave - 1) * 2;
waveText.setText('Wave: ' + currentWave);
enemyCountText.setText('Enemies: 0/' + enemiesToKillInWave);
for (var c = enemies.length - 1; c >= 0; c--) {
enemies[c].destroy();
enemies.splice(c, 1);
}
if (currentWave % 5 === 0) {
upgradeScreenActive = true;
LK.clearInterval(spawnTimer);
LK.clearInterval(fireTimer);
var upgradeScreen = game.addChild(new SkillUpgrade());
game.down = function (x, y, obj) {
if (upgradeScreenActive && upgradeScreen && upgradeScreen.skillButtons) {
for (var sb = 0; sb < upgradeScreen.skillButtons.length; sb++) {
var btn = upgradeScreen.skillButtons[sb];
var distance = Math.sqrt(Math.pow(x - btn.x, 2) + Math.pow(y - btn.y, 2));
if (distance < 300) {
applySkillUpgrade(btn.effect);
upgradeScreen.destroy();
upgradeScreenActive = false;
spawnTimer = LK.setInterval(function () {
if (enemies.length < 3 + currentWave) {
spawnEnemy();
}
}, 800);
fireTimer = LK.setInterval(function () {
fireProjectile();
}, playerStats.fireRate);
game.down = function (x, y, obj) {
dragNode = player;
};
return;
}
}
} else if (!upgradeScreenActive) {
dragNode = player;
}
};
}
}
}
bullet.destroy();
playerBullets.splice(a, 1);
bulletDestroyed = true;
break;
}
}
}
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.y > 2732 + 50) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
if (enemy.y > 2400 + 50) {
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
LK.clearInterval(spawnTimer);
LK.clearInterval(fireTimer);
LK.showGameOver();
return;
}
var currentIntersecting = enemy.intersects(player);
if (!enemy.lastIntersecting && currentIntersecting) {
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
LK.clearInterval(spawnTimer);
LK.clearInterval(fireTimer);
LK.showGameOver();
return;
}
enemy.lastIntersecting = currentIntersecting;
}
};
LK.playMusic('bgmusic'); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.health = 1;
self.lastY = 0;
self.lastIntersecting = false;
self.takeDamage = function (amount) {
self.health -= amount;
};
self.update = function () {
self.y += self.speed;
if (self.lastY === undefined) self.lastY = self.y;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.moveX = 0;
self.speed = 8;
self.update = function () {
self.x += self.moveX * self.speed;
if (self.x < 40) self.x = 40;
if (self.x > 2048 - 40) self.x = 2048 - 40;
};
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.lastY = 0;
self.update = function () {
self.y += self.speed;
if (self.lastY === undefined) self.lastY = self.y;
};
return self;
});
var SkillUpgrade = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('upgradeBackground', {
anchorX: 0.5,
anchorY: 0.5
});
background.width = 2048;
background.height = 2732;
background.x = 1024;
background.y = 1366;
var titleText = new Text2('Choose an Upgrade', {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
titleText.x = 1024;
titleText.y = 200;
self.addChild(titleText);
var skills = [{
name: 'Faster Bullets',
effect: 'bulletSpeed'
}, {
name: 'Rapid Fire',
effect: 'fireRate'
}, {
name: 'More Health',
effect: 'playerHealth'
}];
self.skillButtons = [];
for (var i = 0; i < skills.length; i++) {
var buttonBg = self.attachAsset('skillButton', {
anchorX: 0.5,
anchorY: 0.5
});
buttonBg.width = 600;
buttonBg.height = 200;
buttonBg.x = 1024;
buttonBg.y = 800 + i * 300;
var skillText = new Text2(skills[i].name, {
size: 80,
fill: 0xFFFFFF
});
skillText.anchor.set(0.5, 0.5);
skillText.x = 1024;
skillText.y = 800 + i * 300;
self.addChild(skillText);
self.skillButtons.push({
bg: buttonBg,
x: 1024,
y: 800 + i * 300,
effect: skills[i].effect,
index: i
});
}
self.selectedSkill = null;
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 = 2400;
var playerBullets = [];
var enemies = [];
var currentWave = 1;
var enemiesKilledInWave = 0;
var enemiesToKillInWave = 5;
var gameScore = 0;
var playerStats = {
bulletSpeed: -15,
fireRate: 400,
playerHealth: 1
};
var upgradeScreenActive = false;
var waveText = new Text2('Wave: ' + currentWave, {
size: 100,
fill: 0xFFFFFF
});
waveText.anchor.set(0.5, 0);
LK.gui.top.addChild(waveText);
var scoreText = new Text2('Score: 0', {
size: 80,
fill: 0xFFFF00
});
scoreText.anchor.set(0.5, 1);
LK.gui.bottom.addChild(scoreText);
var enemyCountText = new Text2('Enemies: 0/' + enemiesToKillInWave, {
size: 80,
fill: 0x00FFFF
});
enemyCountText.anchor.set(0, 1);
LK.gui.bottomLeft.addChild(enemyCountText);
var dragNode = null;
var touchStartX = 0;
function spawnEnemy() {
var newEnemy = new Enemy();
newEnemy.x = Math.random() * (2048 - 140) + 70;
newEnemy.y = -50;
var speedMultiplier = 1 + (currentWave - 1) * 0.3;
newEnemy.speed = 2 + speedMultiplier;
newEnemy.health = 1 + Math.floor((currentWave - 1) / 3);
newEnemy.lastY = newEnemy.y;
newEnemy.lastIntersecting = false;
enemies.push(newEnemy);
game.addChild(newEnemy);
}
function applySkillUpgrade(skillEffect) {
if (skillEffect === 'bulletSpeed') {
playerStats.bulletSpeed -= 3;
} else if (skillEffect === 'fireRate') {
playerStats.fireRate = Math.max(150, playerStats.fireRate - 50);
} else if (skillEffect === 'playerHealth') {
playerStats.playerHealth += 1;
}
}
function fireProjectile() {
var bullet = new PlayerBullet();
bullet.x = player.x;
bullet.y = player.y - 40;
bullet.speed = playerStats.bulletSpeed;
bullet.lastY = bullet.y;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
var spawnTimer = LK.setInterval(function () {
if (enemies.length < 3 + currentWave) {
spawnEnemy();
}
}, 800);
var fireTimer = LK.setInterval(function () {
fireProjectile();
}, playerStats.fireRate);
game.down = function (x, y, obj) {
dragNode = player;
};
game.move = function (x, y, obj) {
if (dragNode) {
player.x = x;
if (player.x < 40) player.x = 40;
if (player.x > 2048 - 40) player.x = 2048 - 40;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
for (var a = playerBullets.length - 1; a >= 0; a--) {
var bullet = playerBullets[a];
if (bullet.y < -50) {
bullet.destroy();
playerBullets.splice(a, 1);
continue;
}
var bulletDestroyed = false;
for (var b = enemies.length - 1; b >= 0; b--) {
var enemy = enemies[b];
if (bullet.intersects(enemy)) {
enemy.takeDamage(1);
LK.getSound('enemyHit').play();
if (enemy.health <= 0) {
enemy.destroy();
enemies.splice(b, 1);
gameScore += 10;
enemiesKilledInWave++;
scoreText.setText('Score: ' + gameScore);
enemyCountText.setText('Enemies: ' + enemiesKilledInWave + '/' + enemiesToKillInWave);
if (enemiesKilledInWave >= enemiesToKillInWave) {
currentWave++;
enemiesKilledInWave = 0;
enemiesToKillInWave = 5 + (currentWave - 1) * 2;
waveText.setText('Wave: ' + currentWave);
enemyCountText.setText('Enemies: 0/' + enemiesToKillInWave);
for (var c = enemies.length - 1; c >= 0; c--) {
enemies[c].destroy();
enemies.splice(c, 1);
}
if (currentWave % 5 === 0) {
upgradeScreenActive = true;
LK.clearInterval(spawnTimer);
LK.clearInterval(fireTimer);
var upgradeScreen = game.addChild(new SkillUpgrade());
game.down = function (x, y, obj) {
if (upgradeScreenActive && upgradeScreen && upgradeScreen.skillButtons) {
for (var sb = 0; sb < upgradeScreen.skillButtons.length; sb++) {
var btn = upgradeScreen.skillButtons[sb];
var distance = Math.sqrt(Math.pow(x - btn.x, 2) + Math.pow(y - btn.y, 2));
if (distance < 300) {
applySkillUpgrade(btn.effect);
upgradeScreen.destroy();
upgradeScreenActive = false;
spawnTimer = LK.setInterval(function () {
if (enemies.length < 3 + currentWave) {
spawnEnemy();
}
}, 800);
fireTimer = LK.setInterval(function () {
fireProjectile();
}, playerStats.fireRate);
game.down = function (x, y, obj) {
dragNode = player;
};
return;
}
}
} else if (!upgradeScreenActive) {
dragNode = player;
}
};
}
}
}
bullet.destroy();
playerBullets.splice(a, 1);
bulletDestroyed = true;
break;
}
}
}
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.y > 2732 + 50) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
if (enemy.y > 2400 + 50) {
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
LK.clearInterval(spawnTimer);
LK.clearInterval(fireTimer);
LK.showGameOver();
return;
}
var currentIntersecting = enemy.intersects(player);
if (!enemy.lastIntersecting && currentIntersecting) {
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('playerHit').play();
LK.clearInterval(spawnTimer);
LK.clearInterval(fireTimer);
LK.showGameOver();
return;
}
enemy.lastIntersecting = currentIntersecting;
}
};
LK.playMusic('bgmusic');