/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Dragon = Container.expand(function () {
var self = Container.call(this);
var dragonGraphics = self.attachAsset('dragon', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 50;
self.maxHealth = 50;
self.speed = 2;
self.shootTimer = 0;
self.moveDirection = 1;
self.phase = 1;
self.update = function () {
self.x += self.moveDirection * self.speed;
if (self.x < 200 || self.x > 1848) {
self.moveDirection *= -1;
}
self.shootTimer++;
if (self.phase == 1 && self.shootTimer >= 40) {
self.shootTimer = 0;
for (var i = -1; i <= 1; i++) {
var bullet = new DragonBullet();
bullet.x = self.x + i * 80;
bullet.y = self.y + 100;
bullet.direction = i;
dragonBullets.push(bullet);
game.addChild(bullet);
}
} else if (self.phase == 2 && self.shootTimer >= 25) {
self.shootTimer = 0;
for (var i = -2; i <= 2; i++) {
var bullet = new DragonBullet();
bullet.x = self.x + i * 60;
bullet.y = self.y + 100;
bullet.direction = i * 0.5;
dragonBullets.push(bullet);
game.addChild(bullet);
}
}
if (self.health < self.maxHealth * 0.5 && self.phase == 1) {
self.phase = 2;
self.speed = 3;
dragonGraphics.tint = 0xff6666;
}
};
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xff0000, 200);
if (self.health <= 0) {
LK.getSound('explosion').play();
return true;
}
LK.getSound('hit').play();
return false;
};
return self;
});
var DragonBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('dragonBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.direction = 1;
self.update = function () {
self.y += self.speed;
self.x += self.direction * 2;
};
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 = 3;
self.shootTimer = 0;
self.moveDirection = 1;
self.update = function () {
self.y += self.speed;
self.x += self.moveDirection * 1.5;
if (self.x < 100 || self.x > 1948) {
self.moveDirection *= -1;
}
self.shootTimer++;
if (self.shootTimer >= 60 && Math.random() < 0.02) {
self.shootTimer = 0;
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 50;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
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.health = 3;
self.shootTimer = 0;
self.invulnerable = 0;
self.update = function () {
if (self.invulnerable > 0) {
self.invulnerable--;
playerGraphics.alpha = self.invulnerable % 10 < 5 ? 0.5 : 1.0;
} else {
playerGraphics.alpha = 1.0;
}
self.shootTimer++;
if (self.shootTimer >= 15) {
self.shootTimer = 0;
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 60;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
};
self.takeDamage = function () {
if (self.invulnerable <= 0) {
self.health--;
self.invulnerable = 120;
LK.effects.flashObject(self, 0xff0000, 500);
LK.getSound('hit').play();
return true;
}
return false;
};
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 = -12;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1976D2
});
/****
* Game Code
****/
var player = null;
var enemies = [];
var dragon = null;
var playerBullets = [];
var enemyBullets = [];
var dragonBullets = [];
var currentLevel = 1;
var enemiesKilled = 0;
var enemiesNeeded = 0;
var levelComplete = false;
var dragNode = null;
var levelText = new Text2('Level 1', {
size: 100,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(1, 0);
scoreText.x = -20;
scoreText.y = 20;
LK.gui.topRight.addChild(scoreText);
var healthText = new Text2('Health: 3', {
size: 60,
fill: 0xFFFFFF
});
healthText.anchor.set(0, 0);
healthText.x = 120;
healthText.y = 20;
LK.gui.topLeft.addChild(healthText);
function startLevel(level) {
currentLevel = level;
enemiesKilled = 0;
levelComplete = false;
levelText.setText('Level ' + level);
enemies = [];
dragon = null;
if (level < 7) {
enemiesNeeded = 5 + level * 2;
for (var i = 0; i < Math.min(3 + level, 8); i++) {
spawnEnemy();
}
} else {
dragon = new Dragon();
dragon.x = 1024;
dragon.y = 300;
game.addChild(dragon);
}
}
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = Math.random() * 1600 + 224;
enemy.y = Math.random() * -500 - 100;
enemy.speed = 2 + currentLevel * 0.5;
enemies.push(enemy);
game.addChild(enemy);
}
function handleMove(x, y, obj) {
if (dragNode && player) {
dragNode.x = Math.max(50, Math.min(1998, x));
dragNode.y = Math.max(200, Math.min(2600, y));
}
}
player = new Player();
player.x = 1024;
player.y = 2400;
game.addChild(player);
startLevel(1);
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
scoreText.setText('Score: ' + LK.getScore());
healthText.setText('Health: ' + (player ? player.health : 0));
if (!player || player.health <= 0) {
LK.showGameOver();
return;
}
// Player bullets vs enemies
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.y < -50) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
var hit = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
LK.setScore(LK.getScore() + 100);
bullet.destroy();
playerBullets.splice(i, 1);
enemy.destroy();
enemies.splice(j, 1);
enemiesKilled++;
hit = true;
break;
}
}
if (!hit && dragon && bullet.intersects(dragon)) {
LK.setScore(LK.getScore() + 50);
bullet.destroy();
playerBullets.splice(i, 1);
if (dragon.takeDamage()) {
dragon.destroy();
dragon = null;
LK.setScore(LK.getScore() + 5000);
LK.showYouWin();
return;
}
}
}
// Enemy bullets vs player
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.y > 2782) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
if (bullet.intersects(player)) {
bullet.destroy();
enemyBullets.splice(i, 1);
player.takeDamage();
}
}
// Dragon bullets vs player
for (var i = dragonBullets.length - 1; i >= 0; i--) {
var bullet = dragonBullets[i];
if (bullet.y > 2782 || bullet.x < -50 || bullet.x > 2098) {
bullet.destroy();
dragonBullets.splice(i, 1);
continue;
}
if (bullet.intersects(player)) {
bullet.destroy();
dragonBullets.splice(i, 1);
player.takeDamage();
}
}
// Player vs enemies collision
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.y > 2782) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
if (enemy.intersects(player)) {
enemy.destroy();
enemies.splice(i, 1);
player.takeDamage();
}
}
// Player vs dragon collision
if (dragon && dragon.intersects(player)) {
player.takeDamage();
}
// Level progression
if (currentLevel < 7) {
if (enemiesKilled >= enemiesNeeded) {
if (!levelComplete) {
levelComplete = true;
LK.setTimeout(function () {
if (currentLevel < 6) {
startLevel(currentLevel + 1);
} else {
startLevel(7);
}
}, 2000);
}
} else if (enemies.length < 2 && enemiesKilled < enemiesNeeded) {
spawnEnemy();
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Dragon = Container.expand(function () {
var self = Container.call(this);
var dragonGraphics = self.attachAsset('dragon', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 50;
self.maxHealth = 50;
self.speed = 2;
self.shootTimer = 0;
self.moveDirection = 1;
self.phase = 1;
self.update = function () {
self.x += self.moveDirection * self.speed;
if (self.x < 200 || self.x > 1848) {
self.moveDirection *= -1;
}
self.shootTimer++;
if (self.phase == 1 && self.shootTimer >= 40) {
self.shootTimer = 0;
for (var i = -1; i <= 1; i++) {
var bullet = new DragonBullet();
bullet.x = self.x + i * 80;
bullet.y = self.y + 100;
bullet.direction = i;
dragonBullets.push(bullet);
game.addChild(bullet);
}
} else if (self.phase == 2 && self.shootTimer >= 25) {
self.shootTimer = 0;
for (var i = -2; i <= 2; i++) {
var bullet = new DragonBullet();
bullet.x = self.x + i * 60;
bullet.y = self.y + 100;
bullet.direction = i * 0.5;
dragonBullets.push(bullet);
game.addChild(bullet);
}
}
if (self.health < self.maxHealth * 0.5 && self.phase == 1) {
self.phase = 2;
self.speed = 3;
dragonGraphics.tint = 0xff6666;
}
};
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xff0000, 200);
if (self.health <= 0) {
LK.getSound('explosion').play();
return true;
}
LK.getSound('hit').play();
return false;
};
return self;
});
var DragonBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('dragonBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.direction = 1;
self.update = function () {
self.y += self.speed;
self.x += self.direction * 2;
};
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 = 3;
self.shootTimer = 0;
self.moveDirection = 1;
self.update = function () {
self.y += self.speed;
self.x += self.moveDirection * 1.5;
if (self.x < 100 || self.x > 1948) {
self.moveDirection *= -1;
}
self.shootTimer++;
if (self.shootTimer >= 60 && Math.random() < 0.02) {
self.shootTimer = 0;
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 50;
enemyBullets.push(bullet);
game.addChild(bullet);
}
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
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.health = 3;
self.shootTimer = 0;
self.invulnerable = 0;
self.update = function () {
if (self.invulnerable > 0) {
self.invulnerable--;
playerGraphics.alpha = self.invulnerable % 10 < 5 ? 0.5 : 1.0;
} else {
playerGraphics.alpha = 1.0;
}
self.shootTimer++;
if (self.shootTimer >= 15) {
self.shootTimer = 0;
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 60;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
};
self.takeDamage = function () {
if (self.invulnerable <= 0) {
self.health--;
self.invulnerable = 120;
LK.effects.flashObject(self, 0xff0000, 500);
LK.getSound('hit').play();
return true;
}
return false;
};
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 = -12;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1976D2
});
/****
* Game Code
****/
var player = null;
var enemies = [];
var dragon = null;
var playerBullets = [];
var enemyBullets = [];
var dragonBullets = [];
var currentLevel = 1;
var enemiesKilled = 0;
var enemiesNeeded = 0;
var levelComplete = false;
var dragNode = null;
var levelText = new Text2('Level 1', {
size: 100,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
LK.gui.top.addChild(levelText);
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(1, 0);
scoreText.x = -20;
scoreText.y = 20;
LK.gui.topRight.addChild(scoreText);
var healthText = new Text2('Health: 3', {
size: 60,
fill: 0xFFFFFF
});
healthText.anchor.set(0, 0);
healthText.x = 120;
healthText.y = 20;
LK.gui.topLeft.addChild(healthText);
function startLevel(level) {
currentLevel = level;
enemiesKilled = 0;
levelComplete = false;
levelText.setText('Level ' + level);
enemies = [];
dragon = null;
if (level < 7) {
enemiesNeeded = 5 + level * 2;
for (var i = 0; i < Math.min(3 + level, 8); i++) {
spawnEnemy();
}
} else {
dragon = new Dragon();
dragon.x = 1024;
dragon.y = 300;
game.addChild(dragon);
}
}
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = Math.random() * 1600 + 224;
enemy.y = Math.random() * -500 - 100;
enemy.speed = 2 + currentLevel * 0.5;
enemies.push(enemy);
game.addChild(enemy);
}
function handleMove(x, y, obj) {
if (dragNode && player) {
dragNode.x = Math.max(50, Math.min(1998, x));
dragNode.y = Math.max(200, Math.min(2600, y));
}
}
player = new Player();
player.x = 1024;
player.y = 2400;
game.addChild(player);
startLevel(1);
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
scoreText.setText('Score: ' + LK.getScore());
healthText.setText('Health: ' + (player ? player.health : 0));
if (!player || player.health <= 0) {
LK.showGameOver();
return;
}
// Player bullets vs enemies
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.y < -50) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
var hit = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
LK.setScore(LK.getScore() + 100);
bullet.destroy();
playerBullets.splice(i, 1);
enemy.destroy();
enemies.splice(j, 1);
enemiesKilled++;
hit = true;
break;
}
}
if (!hit && dragon && bullet.intersects(dragon)) {
LK.setScore(LK.getScore() + 50);
bullet.destroy();
playerBullets.splice(i, 1);
if (dragon.takeDamage()) {
dragon.destroy();
dragon = null;
LK.setScore(LK.getScore() + 5000);
LK.showYouWin();
return;
}
}
}
// Enemy bullets vs player
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.y > 2782) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
if (bullet.intersects(player)) {
bullet.destroy();
enemyBullets.splice(i, 1);
player.takeDamage();
}
}
// Dragon bullets vs player
for (var i = dragonBullets.length - 1; i >= 0; i--) {
var bullet = dragonBullets[i];
if (bullet.y > 2782 || bullet.x < -50 || bullet.x > 2098) {
bullet.destroy();
dragonBullets.splice(i, 1);
continue;
}
if (bullet.intersects(player)) {
bullet.destroy();
dragonBullets.splice(i, 1);
player.takeDamage();
}
}
// Player vs enemies collision
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.y > 2782) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
if (enemy.intersects(player)) {
enemy.destroy();
enemies.splice(i, 1);
player.takeDamage();
}
}
// Player vs dragon collision
if (dragon && dragon.intersects(player)) {
player.takeDamage();
}
// Level progression
if (currentLevel < 7) {
if (enemiesKilled >= enemiesNeeded) {
if (!levelComplete) {
levelComplete = true;
LK.setTimeout(function () {
if (currentLevel < 6) {
startLevel(currentLevel + 1);
} else {
startLevel(7);
}
}, 2000);
}
} else if (enemies.length < 2 && enemiesKilled < enemiesNeeded) {
spawnEnemy();
}
}
};