/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 30;
self.health = self.maxHealth;
self.speed = 1.5;
self.damage = 5;
self.targetX = 1024;
self.targetY = 1366;
self.lastX = self.x;
self.lastY = self.y;
var healthBarBg = self.addChild(LK.getAsset('healthBarBg', {
anchorX: 0.5,
anchorY: 0.5
}));
healthBarBg.y = -50;
var healthBar = self.addChild(LK.getAsset('healthBar', {
anchorX: 0.5,
anchorY: 0.5
}));
healthBar.y = -50;
self.healthBar = healthBar;
self.takeDamage = function (damage) {
self.health -= damage;
var healthPercent = Math.max(0, self.health / self.maxHealth);
self.healthBar.scaleX = healthPercent;
};
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 5) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.maxHealth = 100;
self.health = self.maxHealth;
self.speed = 3;
self.damage = 10;
self.fireRate = 10;
self.fireCounter = 0;
self.touchX = 1024;
self.touchY = 1366;
var healthBarBg = self.addChild(LK.getAsset('healthBarBg', {
anchorX: 0,
anchorY: 0
}));
healthBarBg.x = -30;
healthBarBg.y = -50;
var healthBar = self.addChild(LK.getAsset('healthBar', {
anchorX: 0,
anchorY: 0
}));
healthBar.x = -30;
healthBar.y = -50;
self.healthBar = healthBar;
self.takeDamage = function (damage) {
self.health -= damage;
var healthPercent = Math.max(0, self.health / self.maxHealth);
self.healthBar.scaleX = healthPercent;
};
self.update = function () {
var dx = self.touchX - self.x;
var dy = self.touchY - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist > 10) {
self.x += dx / dist * self.speed;
self.y += dy / dist * self.speed;
}
self.fireCounter++;
};
self.canShoot = function () {
return self.fireCounter >= self.fireRate;
};
self.resetFireCounter = function () {
self.fireCounter = 0;
};
return self;
});
var Projectile = Container.expand(function () {
var self = Container.call(this);
var graphics = self.attachAsset('projectile', {
anchorX: 0.5,
anchorY: 0.5
});
self.vx = 0;
self.vy = 0;
self.damage = 10;
self.lastX = self.x;
self.lastY = self.y;
self.update = function () {
self.lastX = self.x;
self.lastY = self.y;
self.x += self.vx;
self.y += self.vy;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
// Game state variables
var player = null;
var enemies = [];
var projectiles = [];
var currentWave = 1;
var enemiesSpawned = 0;
var enemiesDefeated = 0;
var waveActive = false;
var currency = 0;
var waveEnemyCount = 3;
var isGameOver = false;
// UI elements
var waveText = new Text2('Wave: 1', {
size: 60,
fill: '#ffffff'
});
waveText.anchor.set(0, 0);
LK.gui.topRight.addChild(waveText);
var currencyText = new Text2('Currency: 0', {
size: 50,
fill: '#ffff00'
});
currencyText.anchor.set(0, 0);
LK.gui.top.addChild(currencyText);
var enemyCountText = new Text2('Enemies: 0/3', {
size: 50,
fill: '#ffffff'
});
enemyCountText.anchor.set(0.5, 0);
LK.gui.top.addChild(enemyCountText);
var healthText = new Text2('Health: 100/100', {
size: 50,
fill: '#00ff00'
});
healthText.anchor.set(1, 0);
LK.gui.topRight.addChild(healthText);
// Initialize player
player = game.addChild(new Player());
player.x = 1024;
player.y = 2400;
// Initialize first wave
function startWave() {
waveActive = true;
enemiesSpawned = 0;
waveEnemyCount = 3 + Math.floor((currentWave - 1) * 1.5);
LK.getSound('wave').play();
}
function spawnEnemy() {
var enemy = new Enemy();
enemy.maxHealth = 30 + (currentWave - 1) * 10;
enemy.health = enemy.maxHealth;
enemy.speed = 1.5 + (currentWave - 1) * 0.3;
enemy.damage = 5 + Math.floor((currentWave - 1) * 1.5);
var spawnSide = Math.floor(Math.random() * 4);
if (spawnSide === 0) {
enemy.x = Math.random() * 2048;
enemy.y = -50;
} else if (spawnSide === 1) {
enemy.x = 2048 + 50;
enemy.y = Math.random() * 2732;
} else if (spawnSide === 2) {
enemy.x = Math.random() * 2048;
enemy.y = 2732 + 50;
} else {
enemy.x = -50;
enemy.y = Math.random() * 2732;
}
enemy.lastX = enemy.x;
enemy.lastY = enemy.y;
enemies.push(enemy);
game.addChild(enemy);
enemiesSpawned++;
}
function nextWave() {
currentWave++;
enemiesDefeated = 0;
startWave();
}
function fireProjectile() {
var projectile = new Projectile();
projectile.x = player.x;
projectile.y = player.y;
projectile.lastX = projectile.x;
projectile.lastY = projectile.y;
projectile.damage = player.damage;
if (enemies.length > 0) {
var closestEnemy = enemies[0];
var closestDist = 9999;
for (var i = 0; i < enemies.length; i++) {
var dx = enemies[i].x - player.x;
var dy = enemies[i].y - player.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < closestDist) {
closestDist = dist;
closestEnemy = enemies[i];
}
}
var dx = closestEnemy.x - projectile.x;
var dy = closestEnemy.y - projectile.y;
var dist = Math.sqrt(dx * dx + dy * dy);
var speed = 8;
projectile.vx = dx / dist * speed;
projectile.vy = dy / dist * speed;
}
projectiles.push(projectile);
game.addChild(projectile);
LK.getSound('shoot').play();
}
// Game move handler
game.move = function (x, y, obj) {
player.touchX = x;
player.touchY = y;
};
// Main game update
game.update = function () {
if (isGameOver) return;
// Spawn enemies
if (waveActive && enemiesSpawned < waveEnemyCount) {
if (LK.ticks % 60 === 0) {
spawnEnemy();
}
}
// Player update
player.update();
// Check if player can shoot
if (player.canShoot() && enemies.length > 0) {
fireProjectile();
player.resetFireCounter();
}
// Update projectiles
for (var p = projectiles.length - 1; p >= 0; p--) {
var projectile = projectiles[p];
projectile.update();
var outOfBounds = projectile.x < -50 || projectile.x > 2048 + 50 || projectile.y < -50 || projectile.y > 2732 + 50;
if (outOfBounds) {
projectile.destroy();
projectiles.splice(p, 1);
continue;
}
// Check collision with enemies
for (var e = enemies.length - 1; e >= 0; e--) {
if (projectile.intersects(enemies[e])) {
enemies[e].takeDamage(projectile.damage);
LK.getSound('hit').play();
if (enemies[e].health <= 0) {
currency += 10 + currentWave * 2;
enemiesDefeated++;
enemies[e].destroy();
enemies.splice(e, 1);
}
projectile.destroy();
projectiles.splice(p, 1);
break;
}
}
}
// Update enemies
for (var e = enemies.length - 1; e >= 0; e--) {
enemies[e].update();
// Check collision with player
if (enemies[e].intersects(player)) {
player.takeDamage(enemies[e].damage);
enemies[e].destroy();
enemies.splice(e, 1);
if (player.health <= 0) {
isGameOver = true;
LK.setScore(currentWave);
LK.showGameOver();
}
continue;
}
}
// Check if wave is complete
if (waveActive && enemiesSpawned >= waveEnemyCount && enemies.length === 0) {
waveActive = false;
LK.setTimeout(function () {
if (!isGameOver) {
nextWave();
}
}, 1000);
}
// Update UI
waveText.setText('Wave: ' + currentWave);
currencyText.setText('Currency: ' + currency);
enemyCountText.setText('Enemies: ' + enemies.length + '/' + waveEnemyCount);
healthText.setText('Health: ' + Math.max(0, player.health) + '/' + player.maxHealth);
};
// Start first wave
startWave();
LK.playMusic('bgmusic', {
loop: true
}); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,324 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.maxHealth = 30;
+ self.health = self.maxHealth;
+ self.speed = 1.5;
+ self.damage = 5;
+ self.targetX = 1024;
+ self.targetY = 1366;
+ self.lastX = self.x;
+ self.lastY = self.y;
+ var healthBarBg = self.addChild(LK.getAsset('healthBarBg', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ }));
+ healthBarBg.y = -50;
+ var healthBar = self.addChild(LK.getAsset('healthBar', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ }));
+ healthBar.y = -50;
+ self.healthBar = healthBar;
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ var healthPercent = Math.max(0, self.health / self.maxHealth);
+ self.healthBar.scaleX = healthPercent;
+ };
+ self.update = function () {
+ self.lastX = self.x;
+ self.lastY = self.y;
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist > 5) {
+ self.x += dx / dist * self.speed;
+ self.y += dy / dist * self.speed;
+ }
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.maxHealth = 100;
+ self.health = self.maxHealth;
+ self.speed = 3;
+ self.damage = 10;
+ self.fireRate = 10;
+ self.fireCounter = 0;
+ self.touchX = 1024;
+ self.touchY = 1366;
+ var healthBarBg = self.addChild(LK.getAsset('healthBarBg', {
+ anchorX: 0,
+ anchorY: 0
+ }));
+ healthBarBg.x = -30;
+ healthBarBg.y = -50;
+ var healthBar = self.addChild(LK.getAsset('healthBar', {
+ anchorX: 0,
+ anchorY: 0
+ }));
+ healthBar.x = -30;
+ healthBar.y = -50;
+ self.healthBar = healthBar;
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ var healthPercent = Math.max(0, self.health / self.maxHealth);
+ self.healthBar.scaleX = healthPercent;
+ };
+ self.update = function () {
+ var dx = self.touchX - self.x;
+ var dy = self.touchY - self.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist > 10) {
+ self.x += dx / dist * self.speed;
+ self.y += dy / dist * self.speed;
+ }
+ self.fireCounter++;
+ };
+ self.canShoot = function () {
+ return self.fireCounter >= self.fireRate;
+ };
+ self.resetFireCounter = function () {
+ self.fireCounter = 0;
+ };
+ return self;
+});
+var Projectile = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('projectile', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.vx = 0;
+ self.vy = 0;
+ self.damage = 10;
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.update = function () {
+ self.lastX = self.x;
+ self.lastY = self.y;
+ self.x += self.vx;
+ self.y += self.vy;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
+ backgroundColor: 0x1a1a1a
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var player = null;
+var enemies = [];
+var projectiles = [];
+var currentWave = 1;
+var enemiesSpawned = 0;
+var enemiesDefeated = 0;
+var waveActive = false;
+var currency = 0;
+var waveEnemyCount = 3;
+var isGameOver = false;
+// UI elements
+var waveText = new Text2('Wave: 1', {
+ size: 60,
+ fill: '#ffffff'
+});
+waveText.anchor.set(0, 0);
+LK.gui.topRight.addChild(waveText);
+var currencyText = new Text2('Currency: 0', {
+ size: 50,
+ fill: '#ffff00'
+});
+currencyText.anchor.set(0, 0);
+LK.gui.top.addChild(currencyText);
+var enemyCountText = new Text2('Enemies: 0/3', {
+ size: 50,
+ fill: '#ffffff'
+});
+enemyCountText.anchor.set(0.5, 0);
+LK.gui.top.addChild(enemyCountText);
+var healthText = new Text2('Health: 100/100', {
+ size: 50,
+ fill: '#00ff00'
+});
+healthText.anchor.set(1, 0);
+LK.gui.topRight.addChild(healthText);
+// Initialize player
+player = game.addChild(new Player());
+player.x = 1024;
+player.y = 2400;
+// Initialize first wave
+function startWave() {
+ waveActive = true;
+ enemiesSpawned = 0;
+ waveEnemyCount = 3 + Math.floor((currentWave - 1) * 1.5);
+ LK.getSound('wave').play();
+}
+function spawnEnemy() {
+ var enemy = new Enemy();
+ enemy.maxHealth = 30 + (currentWave - 1) * 10;
+ enemy.health = enemy.maxHealth;
+ enemy.speed = 1.5 + (currentWave - 1) * 0.3;
+ enemy.damage = 5 + Math.floor((currentWave - 1) * 1.5);
+ var spawnSide = Math.floor(Math.random() * 4);
+ if (spawnSide === 0) {
+ enemy.x = Math.random() * 2048;
+ enemy.y = -50;
+ } else if (spawnSide === 1) {
+ enemy.x = 2048 + 50;
+ enemy.y = Math.random() * 2732;
+ } else if (spawnSide === 2) {
+ enemy.x = Math.random() * 2048;
+ enemy.y = 2732 + 50;
+ } else {
+ enemy.x = -50;
+ enemy.y = Math.random() * 2732;
+ }
+ enemy.lastX = enemy.x;
+ enemy.lastY = enemy.y;
+ enemies.push(enemy);
+ game.addChild(enemy);
+ enemiesSpawned++;
+}
+function nextWave() {
+ currentWave++;
+ enemiesDefeated = 0;
+ startWave();
+}
+function fireProjectile() {
+ var projectile = new Projectile();
+ projectile.x = player.x;
+ projectile.y = player.y;
+ projectile.lastX = projectile.x;
+ projectile.lastY = projectile.y;
+ projectile.damage = player.damage;
+ if (enemies.length > 0) {
+ var closestEnemy = enemies[0];
+ var closestDist = 9999;
+ for (var i = 0; i < enemies.length; i++) {
+ var dx = enemies[i].x - player.x;
+ var dy = enemies[i].y - player.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ if (dist < closestDist) {
+ closestDist = dist;
+ closestEnemy = enemies[i];
+ }
+ }
+ var dx = closestEnemy.x - projectile.x;
+ var dy = closestEnemy.y - projectile.y;
+ var dist = Math.sqrt(dx * dx + dy * dy);
+ var speed = 8;
+ projectile.vx = dx / dist * speed;
+ projectile.vy = dy / dist * speed;
+ }
+ projectiles.push(projectile);
+ game.addChild(projectile);
+ LK.getSound('shoot').play();
+}
+// Game move handler
+game.move = function (x, y, obj) {
+ player.touchX = x;
+ player.touchY = y;
+};
+// Main game update
+game.update = function () {
+ if (isGameOver) return;
+ // Spawn enemies
+ if (waveActive && enemiesSpawned < waveEnemyCount) {
+ if (LK.ticks % 60 === 0) {
+ spawnEnemy();
+ }
+ }
+ // Player update
+ player.update();
+ // Check if player can shoot
+ if (player.canShoot() && enemies.length > 0) {
+ fireProjectile();
+ player.resetFireCounter();
+ }
+ // Update projectiles
+ for (var p = projectiles.length - 1; p >= 0; p--) {
+ var projectile = projectiles[p];
+ projectile.update();
+ var outOfBounds = projectile.x < -50 || projectile.x > 2048 + 50 || projectile.y < -50 || projectile.y > 2732 + 50;
+ if (outOfBounds) {
+ projectile.destroy();
+ projectiles.splice(p, 1);
+ continue;
+ }
+ // Check collision with enemies
+ for (var e = enemies.length - 1; e >= 0; e--) {
+ if (projectile.intersects(enemies[e])) {
+ enemies[e].takeDamage(projectile.damage);
+ LK.getSound('hit').play();
+ if (enemies[e].health <= 0) {
+ currency += 10 + currentWave * 2;
+ enemiesDefeated++;
+ enemies[e].destroy();
+ enemies.splice(e, 1);
+ }
+ projectile.destroy();
+ projectiles.splice(p, 1);
+ break;
+ }
+ }
+ }
+ // Update enemies
+ for (var e = enemies.length - 1; e >= 0; e--) {
+ enemies[e].update();
+ // Check collision with player
+ if (enemies[e].intersects(player)) {
+ player.takeDamage(enemies[e].damage);
+ enemies[e].destroy();
+ enemies.splice(e, 1);
+ if (player.health <= 0) {
+ isGameOver = true;
+ LK.setScore(currentWave);
+ LK.showGameOver();
+ }
+ continue;
+ }
+ }
+ // Check if wave is complete
+ if (waveActive && enemiesSpawned >= waveEnemyCount && enemies.length === 0) {
+ waveActive = false;
+ LK.setTimeout(function () {
+ if (!isGameOver) {
+ nextWave();
+ }
+ }, 1000);
+ }
+ // Update UI
+ waveText.setText('Wave: ' + currentWave);
+ currencyText.setText('Currency: ' + currency);
+ enemyCountText.setText('Enemies: ' + enemies.length + '/' + waveEnemyCount);
+ healthText.setText('Health: ' + Math.max(0, player.health) + '/' + player.maxHealth);
+};
+// Start first wave
+startWave();
+LK.playMusic('bgmusic', {
+ loop: true
});
\ No newline at end of file