/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
var assetName = 'enemy' + (type || 1);
var enemyGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type || 1;
self.health = self.type;
self.speed = 2 + (self.type - 1) * 0.5;
self.shootCooldown = 0;
self.movePattern = 0;
self.moveTimer = 0;
self.update = function () {
self.moveTimer++;
// Different movement patterns based on type
if (self.type === 1) {
self.y += self.speed;
} else if (self.type === 2) {
self.y += self.speed;
self.x += Math.sin(self.moveTimer * 0.05) * 2;
} else if (self.type === 3) {
self.y += self.speed * 0.8;
self.x += Math.cos(self.moveTimer * 0.03) * 3;
// Type 3 enemies shoot
if (self.shootCooldown <= 0 && self.y > 200 && self.y < 2200) {
self.shoot();
self.shootCooldown = 60 + Math.random() * 60;
}
}
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
};
self.shoot = function () {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
enemyBullets.push(bullet);
game.addChild(bullet);
};
self.takeDamage = function () {
self.health--;
LK.effects.flashObject(self, 0xFFFFFF, 200);
if (self.health <= 0) {
LK.setScore(LK.getScore() + self.type * 10);
LK.getSound('enemyHit').play();
return true; // Enemy destroyed
}
return false;
};
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 = 6;
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.maxHealth = 3;
self.shootCooldown = 0;
self.invulnerable = false;
self.invulnerableTime = 0;
self.update = function () {
if (self.shootCooldown > 0) {
self.shootCooldown--;
}
if (self.invulnerable) {
self.invulnerableTime--;
playerGraphics.alpha = Math.sin(LK.ticks * 0.5) * 0.5 + 0.5;
if (self.invulnerableTime <= 0) {
self.invulnerable = false;
playerGraphics.alpha = 1;
}
}
};
self.shoot = function () {
if (self.shootCooldown <= 0) {
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 50;
playerBullets.push(bullet);
game.addChild(bullet);
self.shootCooldown = 8;
LK.getSound('shoot').play();
}
};
self.takeDamage = function () {
if (!self.invulnerable) {
self.health--;
self.invulnerable = true;
self.invulnerableTime = 120;
LK.effects.flashObject(self, 0xFF0000, 500);
LK.getSound('playerHit').play();
if (self.health <= 0) {
LK.showGameOver();
}
}
};
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: 0x001122
});
/****
* Game Code
****/
// Game variables
var player;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var currentLevel = 1;
var maxLevel = 10;
var levelEnemiesSpawned = 0;
var levelEnemiesTotal = 0;
var levelComplete = false;
var spawnTimer = 0;
var dragNode = null;
// Level configurations
var levelConfigs = [{
enemies: 5,
types: [1],
spawnDelay: 60
}, {
enemies: 8,
types: [1, 1, 2],
spawnDelay: 50
}, {
enemies: 10,
types: [1, 2],
spawnDelay: 45
}, {
enemies: 12,
types: [1, 2, 2],
spawnDelay: 40
}, {
enemies: 15,
types: [1, 2, 3],
spawnDelay: 35
}, {
enemies: 18,
types: [2, 2, 3],
spawnDelay: 30
}, {
enemies: 20,
types: [1, 2, 3, 3],
spawnDelay: 28
}, {
enemies: 22,
types: [2, 3, 3],
spawnDelay: 25
}, {
enemies: 25,
types: [2, 3, 3, 3],
spawnDelay: 22
}, {
enemies: 30,
types: [3, 3, 3, 3],
spawnDelay: 20
}];
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 120;
scoreTxt.y = 50;
LK.gui.topLeft.addChild(scoreTxt);
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
var healthTxt = new Text2('Health: 3', {
size: 60,
fill: 0xFFFFFF
});
healthTxt.anchor.set(1, 0);
healthTxt.x = -50;
healthTxt.y = 50;
LK.gui.topRight.addChild(healthTxt);
// Initialize player
player = new Player();
player.x = 1024;
player.y = 2400;
game.addChild(player);
// Initialize level
function initLevel() {
levelEnemiesSpawned = 0;
levelEnemiesTotal = levelConfigs[currentLevel - 1].enemies;
levelComplete = false;
spawnTimer = 0;
// Clear existing enemies and bullets
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].destroy();
enemies.splice(i, 1);
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
enemyBullets[i].destroy();
enemyBullets.splice(i, 1);
}
levelTxt.setText('Level: ' + currentLevel);
}
function spawnEnemy() {
var config = levelConfigs[currentLevel - 1];
var enemyType = config.types[Math.floor(Math.random() * config.types.length)];
var enemy = new Enemy(enemyType);
enemy.x = Math.random() * (2048 - 200) + 100;
enemy.y = -50;
enemies.push(enemy);
game.addChild(enemy);
levelEnemiesSpawned++;
}
// Event handlers
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = Math.max(40, Math.min(2008, x));
dragNode.y = Math.max(200, Math.min(2600, y));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
player.shoot();
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Auto-shooting while dragging
var autoShootTimer = 0;
// Main game update
game.update = function () {
// Auto-shoot while dragging
if (dragNode) {
autoShootTimer++;
if (autoShootTimer >= 15) {
player.shoot();
autoShootTimer = 0;
}
}
// Spawn enemies
if (!levelComplete && levelEnemiesSpawned < levelEnemiesTotal) {
spawnTimer++;
if (spawnTimer >= levelConfigs[currentLevel - 1].spawnDelay) {
spawnEnemy();
spawnTimer = 0;
}
}
// Update player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.y < -50) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
bullet.destroy();
playerBullets.splice(i, 1);
if (enemy.takeDamage()) {
enemy.destroy();
enemies.splice(j, 1);
}
break;
}
}
}
// Update enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.y > 2800) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Check collision with player
if (bullet.intersects(player)) {
bullet.destroy();
enemyBullets.splice(i, 1);
player.takeDamage();
}
}
// Update enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
// Remove enemies that are off screen
if (enemy.y > 2800) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check collision with player
if (enemy.intersects(player)) {
enemy.destroy();
enemies.splice(i, 1);
player.takeDamage();
}
}
// Check level completion
if (!levelComplete && levelEnemiesSpawned >= levelEnemiesTotal && enemies.length === 0) {
levelComplete = true;
LK.getSound('levelComplete').play();
if (currentLevel >= maxLevel) {
LK.showYouWin();
} else {
currentLevel++;
LK.setTimeout(function () {
initLevel();
}, 2000);
}
}
// Update UI
scoreTxt.setText('Score: ' + LK.getScore());
healthTxt.setText('Health: ' + player.health);
};
// Initialize first level
initLevel(); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,362 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Enemy = Container.expand(function (type) {
+ var self = Container.call(this);
+ var assetName = 'enemy' + (type || 1);
+ var enemyGraphics = self.attachAsset(assetName, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = type || 1;
+ self.health = self.type;
+ self.speed = 2 + (self.type - 1) * 0.5;
+ self.shootCooldown = 0;
+ self.movePattern = 0;
+ self.moveTimer = 0;
+ self.update = function () {
+ self.moveTimer++;
+ // Different movement patterns based on type
+ if (self.type === 1) {
+ self.y += self.speed;
+ } else if (self.type === 2) {
+ self.y += self.speed;
+ self.x += Math.sin(self.moveTimer * 0.05) * 2;
+ } else if (self.type === 3) {
+ self.y += self.speed * 0.8;
+ self.x += Math.cos(self.moveTimer * 0.03) * 3;
+ // Type 3 enemies shoot
+ if (self.shootCooldown <= 0 && self.y > 200 && self.y < 2200) {
+ self.shoot();
+ self.shootCooldown = 60 + Math.random() * 60;
+ }
+ }
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ };
+ self.shoot = function () {
+ var bullet = new EnemyBullet();
+ bullet.x = self.x;
+ bullet.y = self.y + 30;
+ enemyBullets.push(bullet);
+ game.addChild(bullet);
+ };
+ self.takeDamage = function () {
+ self.health--;
+ LK.effects.flashObject(self, 0xFFFFFF, 200);
+ if (self.health <= 0) {
+ LK.setScore(LK.getScore() + self.type * 10);
+ LK.getSound('enemyHit').play();
+ return true; // Enemy destroyed
+ }
+ return false;
+ };
+ 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 = 6;
+ 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.maxHealth = 3;
+ self.shootCooldown = 0;
+ self.invulnerable = false;
+ self.invulnerableTime = 0;
+ self.update = function () {
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ }
+ if (self.invulnerable) {
+ self.invulnerableTime--;
+ playerGraphics.alpha = Math.sin(LK.ticks * 0.5) * 0.5 + 0.5;
+ if (self.invulnerableTime <= 0) {
+ self.invulnerable = false;
+ playerGraphics.alpha = 1;
+ }
+ }
+ };
+ self.shoot = function () {
+ if (self.shootCooldown <= 0) {
+ var bullet = new PlayerBullet();
+ bullet.x = self.x;
+ bullet.y = self.y - 50;
+ playerBullets.push(bullet);
+ game.addChild(bullet);
+ self.shootCooldown = 8;
+ LK.getSound('shoot').play();
+ }
+ };
+ self.takeDamage = function () {
+ if (!self.invulnerable) {
+ self.health--;
+ self.invulnerable = true;
+ self.invulnerableTime = 120;
+ LK.effects.flashObject(self, 0xFF0000, 500);
+ LK.getSound('playerHit').play();
+ if (self.health <= 0) {
+ LK.showGameOver();
+ }
+ }
+ };
+ 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: 0x001122
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var player;
+var playerBullets = [];
+var enemies = [];
+var enemyBullets = [];
+var currentLevel = 1;
+var maxLevel = 10;
+var levelEnemiesSpawned = 0;
+var levelEnemiesTotal = 0;
+var levelComplete = false;
+var spawnTimer = 0;
+var dragNode = null;
+// Level configurations
+var levelConfigs = [{
+ enemies: 5,
+ types: [1],
+ spawnDelay: 60
+}, {
+ enemies: 8,
+ types: [1, 1, 2],
+ spawnDelay: 50
+}, {
+ enemies: 10,
+ types: [1, 2],
+ spawnDelay: 45
+}, {
+ enemies: 12,
+ types: [1, 2, 2],
+ spawnDelay: 40
+}, {
+ enemies: 15,
+ types: [1, 2, 3],
+ spawnDelay: 35
+}, {
+ enemies: 18,
+ types: [2, 2, 3],
+ spawnDelay: 30
+}, {
+ enemies: 20,
+ types: [1, 2, 3, 3],
+ spawnDelay: 28
+}, {
+ enemies: 22,
+ types: [2, 3, 3],
+ spawnDelay: 25
+}, {
+ enemies: 25,
+ types: [2, 3, 3, 3],
+ spawnDelay: 22
+}, {
+ enemies: 30,
+ types: [3, 3, 3, 3],
+ spawnDelay: 20
+}];
+// UI Elements
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0, 0);
+scoreTxt.x = 120;
+scoreTxt.y = 50;
+LK.gui.topLeft.addChild(scoreTxt);
+var levelTxt = new Text2('Level: 1', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+levelTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(levelTxt);
+var healthTxt = new Text2('Health: 3', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+healthTxt.anchor.set(1, 0);
+healthTxt.x = -50;
+healthTxt.y = 50;
+LK.gui.topRight.addChild(healthTxt);
+// Initialize player
+player = new Player();
+player.x = 1024;
+player.y = 2400;
+game.addChild(player);
+// Initialize level
+function initLevel() {
+ levelEnemiesSpawned = 0;
+ levelEnemiesTotal = levelConfigs[currentLevel - 1].enemies;
+ levelComplete = false;
+ spawnTimer = 0;
+ // Clear existing enemies and bullets
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ enemies[i].destroy();
+ enemies.splice(i, 1);
+ }
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ enemyBullets[i].destroy();
+ enemyBullets.splice(i, 1);
+ }
+ levelTxt.setText('Level: ' + currentLevel);
+}
+function spawnEnemy() {
+ var config = levelConfigs[currentLevel - 1];
+ var enemyType = config.types[Math.floor(Math.random() * config.types.length)];
+ var enemy = new Enemy(enemyType);
+ enemy.x = Math.random() * (2048 - 200) + 100;
+ enemy.y = -50;
+ enemies.push(enemy);
+ game.addChild(enemy);
+ levelEnemiesSpawned++;
+}
+// Event handlers
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ dragNode.x = Math.max(40, Math.min(2008, x));
+ dragNode.y = Math.max(200, Math.min(2600, y));
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ dragNode = player;
+ handleMove(x, y, obj);
+ player.shoot();
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Auto-shooting while dragging
+var autoShootTimer = 0;
+// Main game update
+game.update = function () {
+ // Auto-shoot while dragging
+ if (dragNode) {
+ autoShootTimer++;
+ if (autoShootTimer >= 15) {
+ player.shoot();
+ autoShootTimer = 0;
+ }
+ }
+ // Spawn enemies
+ if (!levelComplete && levelEnemiesSpawned < levelEnemiesTotal) {
+ spawnTimer++;
+ if (spawnTimer >= levelConfigs[currentLevel - 1].spawnDelay) {
+ spawnEnemy();
+ spawnTimer = 0;
+ }
+ }
+ // Update player bullets
+ for (var i = playerBullets.length - 1; i >= 0; i--) {
+ var bullet = playerBullets[i];
+ if (bullet.y < -50) {
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with enemies
+ for (var j = enemies.length - 1; j >= 0; j--) {
+ var enemy = enemies[j];
+ if (bullet.intersects(enemy)) {
+ bullet.destroy();
+ playerBullets.splice(i, 1);
+ if (enemy.takeDamage()) {
+ enemy.destroy();
+ enemies.splice(j, 1);
+ }
+ break;
+ }
+ }
+ }
+ // Update enemy bullets
+ for (var i = enemyBullets.length - 1; i >= 0; i--) {
+ var bullet = enemyBullets[i];
+ if (bullet.y > 2800) {
+ bullet.destroy();
+ enemyBullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (bullet.intersects(player)) {
+ bullet.destroy();
+ enemyBullets.splice(i, 1);
+ player.takeDamage();
+ }
+ }
+ // Update enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ // Remove enemies that are off screen
+ if (enemy.y > 2800) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ continue;
+ }
+ // Check collision with player
+ if (enemy.intersects(player)) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ player.takeDamage();
+ }
+ }
+ // Check level completion
+ if (!levelComplete && levelEnemiesSpawned >= levelEnemiesTotal && enemies.length === 0) {
+ levelComplete = true;
+ LK.getSound('levelComplete').play();
+ if (currentLevel >= maxLevel) {
+ LK.showYouWin();
+ } else {
+ currentLevel++;
+ LK.setTimeout(function () {
+ initLevel();
+ }, 2000);
+ }
+ }
+ // Update UI
+ scoreTxt.setText('Score: ' + LK.getScore());
+ healthTxt.setText('Health: ' + player.health);
+};
+// Initialize first level
+initLevel();
\ No newline at end of file