/****
* 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();
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,365 @@
-/****
+/****
+* 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: 0x000000
-});
\ No newline at end of file
+ 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();
+ }
+ }
+};
\ No newline at end of file