/****
* 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 = 2;
self.health = 1;
self.targetX = 1024;
self.targetY = 1366;
self.lastX = self.x;
self.lastY = self.y;
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health <= 0) {
return true;
}
return false;
};
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
var ShieldSegment = Container.expand(function () {
var self = Container.call(this);
var segmentGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health <= 0) {
return true;
}
tween(segmentGraphics, {
tint: 0xff6600
}, {
duration: 200
});
return false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
// Game variables
var character = game.addChild(new Enemy());
character.speed = 0;
character.x = 1024;
character.y = 1366;
var characterGraphics = character.children[0];
characterGraphics.tint = 0x00ff00;
var enemies = [];
var shields = [];
var score = 0;
var waveCounter = 0;
var gameActive = true;
var currentLevel = 1;
var baseEnemySpeed = 2;
var baseSpawnRate = 1500;
var baseEnemyHealth = 1;
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topLeft.addChild(scoreTxt);
// Create level display
var levelTxt = new Text2('Level: 1', {
size: 120,
fill: 0xFFFFFF
});
levelTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(levelTxt);
// Draw shield tracking
var isDrawing = false;
var currentShieldLine = [];
var lastShieldX = 0;
var lastShieldY = 0;
// Calculate difficulty scaling based on level
function getDifficultyMultiplier() {
return 1 + (currentLevel - 1) * 0.15;
}
// Spawn enemy
function spawnEnemy() {
if (!gameActive) return;
var angle = Math.random() * Math.PI * 2;
var spawnDistance = 300;
var spawnX = 1024 + Math.cos(angle) * spawnDistance;
var spawnY = 1366 + Math.sin(angle) * spawnDistance;
var newEnemy = game.addChild(new Enemy());
newEnemy.x = spawnX;
newEnemy.y = spawnY;
newEnemy.lastX = spawnX;
newEnemy.lastY = spawnY;
newEnemy.speed = baseEnemySpeed * getDifficultyMultiplier();
newEnemy.health = baseEnemyHealth + Math.floor((currentLevel - 1) * 0.5);
enemies.push(newEnemy);
}
// Create shield from drawn line
function createShield(x, y) {
var newShield = game.addChild(new ShieldSegment());
newShield.x = x;
newShield.y = y;
shields.push(newShield);
}
// Enemy spawn timer - scales with level
var spawnTimer = null;
function startSpawnTimer() {
var spawnRate = baseSpawnRate / getDifficultyMultiplier();
if (spawnTimer !== null) {
LK.clearInterval(spawnTimer);
}
spawnTimer = LK.setInterval(function () {
if (gameActive) {
spawnEnemy();
waveCounter++;
}
}, Math.floor(spawnRate));
}
startSpawnTimer();
// Game input handlers
game.down = function (x, y, obj) {
if (!gameActive) return;
isDrawing = true;
currentShieldLine = [];
lastShieldX = x;
lastShieldY = y;
};
game.move = function (x, y, obj) {
if (!gameActive || !isDrawing) return;
var dx = x - lastShieldX;
var dy = y - lastShieldY;
var distance = Math.sqrt(dx * dx + dy * dy);
// Create shield segments every 30 pixels
if (distance > 30) {
createShield(x, y);
lastShieldX = x;
lastShieldY = y;
}
};
game.up = function (x, y, obj) {
if (!gameActive) return;
isDrawing = false;
currentShieldLine = [];
};
// Main game update loop
game.update = function () {
if (!gameActive) return;
// Check for level advancement
var newLevel = Math.floor(score / 250) + 1;
if (newLevel !== currentLevel) {
currentLevel = newLevel;
levelTxt.setText('Level: ' + currentLevel);
startSpawnTimer();
// Flash screen to indicate level up
LK.effects.flashScreen(0x00ff00, 300);
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
enemy.update();
// Check distance to character
var dx = character.x - enemy.x;
var dy = character.y - enemy.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 100) {
// Enemy reached character - game over
LK.effects.flashScreen(0xff0000, 500);
gameActive = false;
LK.showGameOver();
LK.clearInterval(spawnTimer);
return;
}
// Check collision with shields
var enemyDestroyed = false;
for (var j = shields.length - 1; j >= 0; j--) {
var shield = shields[j];
var shieldDx = shield.x - enemy.x;
var shieldDy = shield.y - enemy.y;
var shieldDistance = Math.sqrt(shieldDx * shieldDx + shieldDy * shieldDy);
if (shieldDistance < 60) {
// Enemy hits shield
if (enemy.takeDamage(1)) {
// Enemy defeated
LK.getSound('enemyDefeat').play();
enemy.destroy();
enemies.splice(i, 1);
score += 10;
scoreTxt.setText('Score: ' + score);
// Win condition - increases with each level
if (score >= 250 * currentLevel + 250) {
gameActive = false;
LK.clearInterval(spawnTimer);
LK.showYouWin();
}
enemyDestroyed = true;
} else {
// Shield takes damage
if (shield.takeDamage(1)) {
LK.getSound('hit').play();
shield.destroy();
shields.splice(j, 1);
}
}
break;
}
}
if (enemyDestroyed) break;
}
// Clean up off-screen shields
for (var k = shields.length - 1; k >= 0; k--) {
var shield = shields[k];
if (shield.x < -100 || shield.x > 2148 || shield.y < -100 || shield.y > 2832) {
shield.destroy();
shields.splice(k, 1);
}
}
}; /****
* 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 = 2;
self.health = 1;
self.targetX = 1024;
self.targetY = 1366;
self.lastX = self.x;
self.lastY = self.y;
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health <= 0) {
return true;
}
return false;
};
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 5) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
var ShieldSegment = Container.expand(function () {
var self = Container.call(this);
var segmentGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 3;
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health <= 0) {
return true;
}
tween(segmentGraphics, {
tint: 0xff6600
}, {
duration: 200
});
return false;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
// Game variables
var character = game.addChild(new Enemy());
character.speed = 0;
character.x = 1024;
character.y = 1366;
var characterGraphics = character.children[0];
characterGraphics.tint = 0x00ff00;
var enemies = [];
var shields = [];
var score = 0;
var waveCounter = 0;
var gameActive = true;
var currentLevel = 1;
var baseEnemySpeed = 2;
var baseSpawnRate = 1500;
var baseEnemyHealth = 1;
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topLeft.addChild(scoreTxt);
// Create level display
var levelTxt = new Text2('Level: 1', {
size: 120,
fill: 0xFFFFFF
});
levelTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(levelTxt);
// Draw shield tracking
var isDrawing = false;
var currentShieldLine = [];
var lastShieldX = 0;
var lastShieldY = 0;
// Calculate difficulty scaling based on level
function getDifficultyMultiplier() {
return 1 + (currentLevel - 1) * 0.15;
}
// Spawn enemy
function spawnEnemy() {
if (!gameActive) return;
var angle = Math.random() * Math.PI * 2;
var spawnDistance = 300;
var spawnX = 1024 + Math.cos(angle) * spawnDistance;
var spawnY = 1366 + Math.sin(angle) * spawnDistance;
var newEnemy = game.addChild(new Enemy());
newEnemy.x = spawnX;
newEnemy.y = spawnY;
newEnemy.lastX = spawnX;
newEnemy.lastY = spawnY;
newEnemy.speed = baseEnemySpeed * getDifficultyMultiplier();
newEnemy.health = baseEnemyHealth + Math.floor((currentLevel - 1) * 0.5);
enemies.push(newEnemy);
}
// Create shield from drawn line
function createShield(x, y) {
var newShield = game.addChild(new ShieldSegment());
newShield.x = x;
newShield.y = y;
shields.push(newShield);
}
// Enemy spawn timer - scales with level
var spawnTimer = null;
function startSpawnTimer() {
var spawnRate = baseSpawnRate / getDifficultyMultiplier();
if (spawnTimer !== null) {
LK.clearInterval(spawnTimer);
}
spawnTimer = LK.setInterval(function () {
if (gameActive) {
spawnEnemy();
waveCounter++;
}
}, Math.floor(spawnRate));
}
startSpawnTimer();
// Game input handlers
game.down = function (x, y, obj) {
if (!gameActive) return;
isDrawing = true;
currentShieldLine = [];
lastShieldX = x;
lastShieldY = y;
};
game.move = function (x, y, obj) {
if (!gameActive || !isDrawing) return;
var dx = x - lastShieldX;
var dy = y - lastShieldY;
var distance = Math.sqrt(dx * dx + dy * dy);
// Create shield segments every 30 pixels
if (distance > 30) {
createShield(x, y);
lastShieldX = x;
lastShieldY = y;
}
};
game.up = function (x, y, obj) {
if (!gameActive) return;
isDrawing = false;
currentShieldLine = [];
};
// Main game update loop
game.update = function () {
if (!gameActive) return;
// Check for level advancement
var newLevel = Math.floor(score / 250) + 1;
if (newLevel !== currentLevel) {
currentLevel = newLevel;
levelTxt.setText('Level: ' + currentLevel);
startSpawnTimer();
// Flash screen to indicate level up
LK.effects.flashScreen(0x00ff00, 300);
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
enemy.update();
// Check distance to character
var dx = character.x - enemy.x;
var dy = character.y - enemy.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 100) {
// Enemy reached character - game over
LK.effects.flashScreen(0xff0000, 500);
gameActive = false;
LK.showGameOver();
LK.clearInterval(spawnTimer);
return;
}
// Check collision with shields
var enemyDestroyed = false;
for (var j = shields.length - 1; j >= 0; j--) {
var shield = shields[j];
var shieldDx = shield.x - enemy.x;
var shieldDy = shield.y - enemy.y;
var shieldDistance = Math.sqrt(shieldDx * shieldDx + shieldDy * shieldDy);
if (shieldDistance < 60) {
// Enemy hits shield
if (enemy.takeDamage(1)) {
// Enemy defeated
LK.getSound('enemyDefeat').play();
enemy.destroy();
enemies.splice(i, 1);
score += 10;
scoreTxt.setText('Score: ' + score);
// Win condition - increases with each level
if (score >= 250 * currentLevel + 250) {
gameActive = false;
LK.clearInterval(spawnTimer);
LK.showYouWin();
}
enemyDestroyed = true;
} else {
// Shield takes damage
if (shield.takeDamage(1)) {
LK.getSound('hit').play();
shield.destroy();
shields.splice(j, 1);
}
}
break;
}
}
if (enemyDestroyed) break;
}
// Clean up off-screen shields
for (var k = shields.length - 1; k >= 0; k--) {
var shield = shields[k];
if (shield.x < -100 || shield.x > 2148 || shield.y < -100 || shield.y > 2832) {
shield.destroy();
shields.splice(k, 1);
}
}
};