/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Enemy Shell
var EnemyShell = Container.expand(function () {
var self = Container.call(this);
var shell = self.attachAsset('enemyShell', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = shell.width;
self.height = shell.height;
self.speed = 22 + Math.random() * 6;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Enemy Tank
var EnemyTank = Container.expand(function () {
var self = Container.call(this);
var tank = self.attachAsset('enemyTank', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = tank.width;
self.height = tank.height;
self.speed = 6 + Math.random() * enemySpeedIncrease;
self.shootCooldown = 60 + Math.floor(Math.random() * 60);
self.update = function () {
self.y += self.speed;
if (self.shootCooldown > 0) {
self.shootCooldown--;
} else {
self.shoot();
self.shootCooldown = 90 + Math.floor(Math.random() * 60);
}
};
self.shoot = function () {
var shell = new EnemyShell();
shell.x = self.x;
shell.y = self.y + self.height / 2 + shell.height / 2;
enemyShells.push(shell);
game.addChild(shell);
LK.getSound('enemyFire').play();
};
return self;
});
// Explosion (visual effect only)
var Explosion = Container.expand(function () {
var self = Container.call(this);
var exp = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.5,
scaleY: 0.5,
alpha: 0.8
});
self.width = exp.width;
self.height = exp.height;
// Animate explosion
tween(exp, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 400,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
return self;
});
// Player Shell
var PlayerShell = Container.expand(function () {
var self = Container.call(this);
var shell = self.attachAsset('playerShell', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = shell.width;
self.height = shell.height;
self.speed = -32;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player Tank
var PlayerTank = Container.expand(function () {
var self = Container.call(this);
var tank = self.attachAsset('playerTank', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = tank.width;
self.height = tank.height;
self.shootCooldown = 0;
self.poweredUp = false;
self.powerupTimer = 0;
// Shoot method
self.shoot = function () {
if (self.shootCooldown > 0) return;
var shell = new PlayerShell();
shell.x = self.x;
shell.y = self.y - self.height / 2 - shell.height / 2;
playerShells.push(shell);
game.addChild(shell);
LK.getSound('fire').play();
self.shootCooldown = self.poweredUp ? 10 : 20; // Faster fire if powered up
};
// Powerup method
self.activatePowerup = function () {
self.poweredUp = true;
self.powerupTimer = 360; // 6 seconds at 60fps
tween(self, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.elasticOut
});
};
self.deactivatePowerup = function () {
self.poweredUp = false;
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.elasticIn
});
};
// Update
self.update = function () {
if (self.shootCooldown > 0) self.shootCooldown--;
if (self.poweredUp) {
self.powerupTimer--;
if (self.powerupTimer <= 0) self.deactivatePowerup();
}
};
return self;
});
// Powerup
var Powerup = Container.expand(function () {
var self = Container.call(this);
var p = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = p.width;
self.height = p.height;
self.speed = 10;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x22272a
});
/****
* Game Code
****/
// Music
// Sounds
// Explosion (for effect)
// Powerup
// Enemy Shell
// Enemy Tank
// Player Shell
// Player Tank
// Play music
LK.playMusic('battleTheme');
// Score
var score = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: '#fff'
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Player
var player = new PlayerTank();
player.x = 2048 / 2;
player.y = 2732 - 300;
game.addChild(player);
// Arrays for game objects
var playerShells = [];
var enemyTanks = [];
var enemyShells = [];
var powerups = [];
var explosions = [];
// Difficulty
var enemySpawnTimer = 0;
var enemySpawnInterval = 90;
var enemySpeedIncrease = 0;
var powerupTimer = 0;
// Dragging
var dragNode = null;
// Move handler
function handleMove(x, y, obj) {
if (dragNode) {
// Clamp tank inside game area (leave 100px margin at top for UI)
var minX = player.width / 2;
var maxX = 2048 - player.width / 2;
var minY = 100 + player.height / 2;
var maxY = 2732 - player.height / 2;
dragNode.x = Math.max(minX, Math.min(maxX, x));
dragNode.y = Math.max(minY, Math.min(maxY, y));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Only start drag if touch/click is on player tank
var local = player.toLocal(game.toGlobal({
x: x,
y: y
}));
if (Math.abs(local.x) <= player.width / 2 && Math.abs(local.y) <= player.height / 2) {
dragNode = player;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Tap to shoot (anywhere)
game.tap = function (x, y, obj) {
player.shoot();
};
// For mobile: allow shooting by tapping anywhere except on UI
game.down = function (x, y, obj) {
// If tap is not on top UI, shoot
if (y > 180) player.shoot();
// Also allow drag
var local = player.toLocal(game.toGlobal({
x: x,
y: y
}));
if (Math.abs(local.x) <= player.width / 2 && Math.abs(local.y) <= player.height / 2) {
dragNode = player;
}
};
// Main update loop
game.update = function () {
// Player update
player.update();
// Player shells
for (var i = playerShells.length - 1; i >= 0; i--) {
var shell = playerShells[i];
shell.update();
// Remove if off screen
if (shell.y < -shell.height) {
shell.destroy();
playerShells.splice(i, 1);
continue;
}
// Check collision with enemy tanks
for (var j = enemyTanks.length - 1; j >= 0; j--) {
var enemy = enemyTanks[j];
if (shell.intersects(enemy)) {
// Explosion
var exp = new Explosion();
exp.x = enemy.x;
exp.y = enemy.y;
game.addChild(exp);
explosions.push(exp);
LK.getSound('explode').play();
// Remove both
enemy.destroy();
shell.destroy();
enemyTanks.splice(j, 1);
playerShells.splice(i, 1);
// Score
score++;
scoreTxt.setText(score);
// Increase difficulty
if (score % 10 === 0) {
enemySpeedIncrease += 2;
if (enemySpawnInterval > 30) enemySpawnInterval -= 5;
}
// Win condition
if (score >= 50) {
LK.showYouWin();
return;
}
break;
}
}
}
// Enemy tanks
for (var i = enemyTanks.length - 1; i >= 0; i--) {
var enemy = enemyTanks[i];
enemy.update();
// Remove if off screen
if (enemy.y > 2732 + enemy.height) {
enemy.destroy();
enemyTanks.splice(i, 1);
continue;
}
// Collision with player
if (enemy.intersects(player)) {
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
// Enemy shells
for (var i = enemyShells.length - 1; i >= 0; i--) {
var shell = enemyShells[i];
shell.update();
// Remove if off screen
if (shell.y > 2732 + shell.height) {
shell.destroy();
enemyShells.splice(i, 1);
continue;
}
// Collision with player
if (shell.intersects(player)) {
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
// Powerups
for (var i = powerups.length - 1; i >= 0; i--) {
var p = powerups[i];
p.update();
// Remove if off screen
if (p.y > 2732 + p.height) {
p.destroy();
powerups.splice(i, 1);
continue;
}
// Collision with player
if (p.intersects(player)) {
LK.getSound('powerup').play();
player.activatePowerup();
p.destroy();
powerups.splice(i, 1);
}
}
// Explosions (auto-destroyed by tween)
// Spawn enemy tanks
enemySpawnTimer--;
if (enemySpawnTimer <= 0) {
var enemy = new EnemyTank();
enemy.x = 200 + Math.random() * (2048 - 400);
enemy.y = -enemy.height / 2;
enemyTanks.push(enemy);
game.addChild(enemy);
enemySpawnTimer = enemySpawnInterval + Math.floor(Math.random() * 40);
}
// Spawn powerups
powerupTimer--;
if (powerupTimer <= 0) {
if (Math.random() < 0.25) {
// 25% chance
var p = new Powerup();
p.x = 200 + Math.random() * (2048 - 400);
p.y = -p.height / 2;
powerups.push(p);
game.addChild(p);
}
powerupTimer = 600 + Math.floor(Math.random() * 600); // 10-20 seconds
}
};
// Initial timers
enemySpawnTimer = 60;
powerupTimer = 900;
// Prevent UI overlap (top left 100x100 reserved)
scoreTxt.x = 2048 / 2;
scoreTxt.y = 20; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,384 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Enemy Shell
+var EnemyShell = Container.expand(function () {
+ var self = Container.call(this);
+ var shell = self.attachAsset('enemyShell', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = shell.width;
+ self.height = shell.height;
+ self.speed = 22 + Math.random() * 6;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Enemy Tank
+var EnemyTank = Container.expand(function () {
+ var self = Container.call(this);
+ var tank = self.attachAsset('enemyTank', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = tank.width;
+ self.height = tank.height;
+ self.speed = 6 + Math.random() * enemySpeedIncrease;
+ self.shootCooldown = 60 + Math.floor(Math.random() * 60);
+ self.update = function () {
+ self.y += self.speed;
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ } else {
+ self.shoot();
+ self.shootCooldown = 90 + Math.floor(Math.random() * 60);
+ }
+ };
+ self.shoot = function () {
+ var shell = new EnemyShell();
+ shell.x = self.x;
+ shell.y = self.y + self.height / 2 + shell.height / 2;
+ enemyShells.push(shell);
+ game.addChild(shell);
+ LK.getSound('enemyFire').play();
+ };
+ return self;
+});
+// Explosion (visual effect only)
+var Explosion = Container.expand(function () {
+ var self = Container.call(this);
+ var exp = self.attachAsset('explosion', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.5,
+ scaleY: 0.5,
+ alpha: 0.8
+ });
+ self.width = exp.width;
+ self.height = exp.height;
+ // Animate explosion
+ tween(exp, {
+ scaleX: 1.5,
+ scaleY: 1.5,
+ alpha: 0
+ }, {
+ duration: 400,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.destroy();
+ }
+ });
+ return self;
+});
+// Player Shell
+var PlayerShell = Container.expand(function () {
+ var self = Container.call(this);
+ var shell = self.attachAsset('playerShell', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = shell.width;
+ self.height = shell.height;
+ self.speed = -32;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Player Tank
+var PlayerTank = Container.expand(function () {
+ var self = Container.call(this);
+ var tank = self.attachAsset('playerTank', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = tank.width;
+ self.height = tank.height;
+ self.shootCooldown = 0;
+ self.poweredUp = false;
+ self.powerupTimer = 0;
+ // Shoot method
+ self.shoot = function () {
+ if (self.shootCooldown > 0) return;
+ var shell = new PlayerShell();
+ shell.x = self.x;
+ shell.y = self.y - self.height / 2 - shell.height / 2;
+ playerShells.push(shell);
+ game.addChild(shell);
+ LK.getSound('fire').play();
+ self.shootCooldown = self.poweredUp ? 10 : 20; // Faster fire if powered up
+ };
+ // Powerup method
+ self.activatePowerup = function () {
+ self.poweredUp = true;
+ self.powerupTimer = 360; // 6 seconds at 60fps
+ tween(self, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 200,
+ easing: tween.elasticOut
+ });
+ };
+ self.deactivatePowerup = function () {
+ self.poweredUp = false;
+ tween(self, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ easing: tween.elasticIn
+ });
+ };
+ // Update
+ self.update = function () {
+ if (self.shootCooldown > 0) self.shootCooldown--;
+ if (self.poweredUp) {
+ self.powerupTimer--;
+ if (self.powerupTimer <= 0) self.deactivatePowerup();
+ }
+ };
+ return self;
+});
+// Powerup
+var Powerup = Container.expand(function () {
+ var self = Container.call(this);
+ var p = self.attachAsset('powerup', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = p.width;
+ self.height = p.height;
+ self.speed = 10;
+ 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: 0x22272a
+});
+
+/****
+* Game Code
+****/
+// Music
+// Sounds
+// Explosion (for effect)
+// Powerup
+// Enemy Shell
+// Enemy Tank
+// Player Shell
+// Player Tank
+// Play music
+LK.playMusic('battleTheme');
+// Score
+var score = 0;
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: '#fff'
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Player
+var player = new PlayerTank();
+player.x = 2048 / 2;
+player.y = 2732 - 300;
+game.addChild(player);
+// Arrays for game objects
+var playerShells = [];
+var enemyTanks = [];
+var enemyShells = [];
+var powerups = [];
+var explosions = [];
+// Difficulty
+var enemySpawnTimer = 0;
+var enemySpawnInterval = 90;
+var enemySpeedIncrease = 0;
+var powerupTimer = 0;
+// Dragging
+var dragNode = null;
+// Move handler
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ // Clamp tank inside game area (leave 100px margin at top for UI)
+ var minX = player.width / 2;
+ var maxX = 2048 - player.width / 2;
+ var minY = 100 + player.height / 2;
+ var maxY = 2732 - player.height / 2;
+ dragNode.x = Math.max(minX, Math.min(maxX, x));
+ dragNode.y = Math.max(minY, Math.min(maxY, y));
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ // Only start drag if touch/click is on player tank
+ var local = player.toLocal(game.toGlobal({
+ x: x,
+ y: y
+ }));
+ if (Math.abs(local.x) <= player.width / 2 && Math.abs(local.y) <= player.height / 2) {
+ dragNode = player;
+ }
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Tap to shoot (anywhere)
+game.tap = function (x, y, obj) {
+ player.shoot();
+};
+// For mobile: allow shooting by tapping anywhere except on UI
+game.down = function (x, y, obj) {
+ // If tap is not on top UI, shoot
+ if (y > 180) player.shoot();
+ // Also allow drag
+ var local = player.toLocal(game.toGlobal({
+ x: x,
+ y: y
+ }));
+ if (Math.abs(local.x) <= player.width / 2 && Math.abs(local.y) <= player.height / 2) {
+ dragNode = player;
+ }
+};
+// Main update loop
+game.update = function () {
+ // Player update
+ player.update();
+ // Player shells
+ for (var i = playerShells.length - 1; i >= 0; i--) {
+ var shell = playerShells[i];
+ shell.update();
+ // Remove if off screen
+ if (shell.y < -shell.height) {
+ shell.destroy();
+ playerShells.splice(i, 1);
+ continue;
+ }
+ // Check collision with enemy tanks
+ for (var j = enemyTanks.length - 1; j >= 0; j--) {
+ var enemy = enemyTanks[j];
+ if (shell.intersects(enemy)) {
+ // Explosion
+ var exp = new Explosion();
+ exp.x = enemy.x;
+ exp.y = enemy.y;
+ game.addChild(exp);
+ explosions.push(exp);
+ LK.getSound('explode').play();
+ // Remove both
+ enemy.destroy();
+ shell.destroy();
+ enemyTanks.splice(j, 1);
+ playerShells.splice(i, 1);
+ // Score
+ score++;
+ scoreTxt.setText(score);
+ // Increase difficulty
+ if (score % 10 === 0) {
+ enemySpeedIncrease += 2;
+ if (enemySpawnInterval > 30) enemySpawnInterval -= 5;
+ }
+ // Win condition
+ if (score >= 50) {
+ LK.showYouWin();
+ return;
+ }
+ break;
+ }
+ }
+ }
+ // Enemy tanks
+ for (var i = enemyTanks.length - 1; i >= 0; i--) {
+ var enemy = enemyTanks[i];
+ enemy.update();
+ // Remove if off screen
+ if (enemy.y > 2732 + enemy.height) {
+ enemy.destroy();
+ enemyTanks.splice(i, 1);
+ continue;
+ }
+ // Collision with player
+ if (enemy.intersects(player)) {
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Enemy shells
+ for (var i = enemyShells.length - 1; i >= 0; i--) {
+ var shell = enemyShells[i];
+ shell.update();
+ // Remove if off screen
+ if (shell.y > 2732 + shell.height) {
+ shell.destroy();
+ enemyShells.splice(i, 1);
+ continue;
+ }
+ // Collision with player
+ if (shell.intersects(player)) {
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Powerups
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ var p = powerups[i];
+ p.update();
+ // Remove if off screen
+ if (p.y > 2732 + p.height) {
+ p.destroy();
+ powerups.splice(i, 1);
+ continue;
+ }
+ // Collision with player
+ if (p.intersects(player)) {
+ LK.getSound('powerup').play();
+ player.activatePowerup();
+ p.destroy();
+ powerups.splice(i, 1);
+ }
+ }
+ // Explosions (auto-destroyed by tween)
+ // Spawn enemy tanks
+ enemySpawnTimer--;
+ if (enemySpawnTimer <= 0) {
+ var enemy = new EnemyTank();
+ enemy.x = 200 + Math.random() * (2048 - 400);
+ enemy.y = -enemy.height / 2;
+ enemyTanks.push(enemy);
+ game.addChild(enemy);
+ enemySpawnTimer = enemySpawnInterval + Math.floor(Math.random() * 40);
+ }
+ // Spawn powerups
+ powerupTimer--;
+ if (powerupTimer <= 0) {
+ if (Math.random() < 0.25) {
+ // 25% chance
+ var p = new Powerup();
+ p.x = 200 + Math.random() * (2048 - 400);
+ p.y = -p.height / 2;
+ powerups.push(p);
+ game.addChild(p);
+ }
+ powerupTimer = 600 + Math.floor(Math.random() * 600); // 10-20 seconds
+ }
+};
+// Initial timers
+enemySpawnTimer = 60;
+powerupTimer = 900;
+// Prevent UI overlap (top left 100x100 reserved)
+scoreTxt.x = 2048 / 2;
+scoreTxt.y = 20;
\ No newline at end of file
create explode. In-Game asset. 2d. High contrast. No shadows
friend tank. In-Game asset. 2d. High contrast. No shadows
enemy tank. In-Game asset. 2d. High contrast. No shadows
make a power up asest. In-Game asset. 2d. High contrast. No shadows
yellow bullet. In-Game asset. 2d. High contrast. No shadows
gray,light gray,black bullet Don't put white! Let him/her look behind. let there be no eye and arm. In-Game asset. 2d. High contrast. No shadows