/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Enemy Cannonball Class
var Cannonball = Container.expand(function () {
var self = Container.call(this);
var ball = self.attachAsset('cannonball', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = ball.width;
self.height = ball.height;
self.speed = 10;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Enemy Ship Class
var EnemyShip = Container.expand(function () {
var self = Container.call(this);
var ship = self.attachAsset('enemyShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = ship.width;
self.height = ship.height;
self.speed = 2 + Math.random() * 2; // Vary speed
self.fireCooldown = 60 + Math.floor(Math.random() * 60); // Ticks until next shot
self.update = function () {
self.y += self.speed;
self.fireCooldown--;
};
return self;
});
// Explosion effect (visual only)
var Explosion = Container.expand(function () {
var self = Container.call(this);
var exp = self.attachAsset('explosion', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.8
});
// Animate: scale up and fade out
tween(self, {
scaleX: 1.8,
scaleY: 1.8,
alpha: 0
}, {
duration: 350,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
return self;
});
// Player Cannonball Class
var PlayerCannonball = Container.expand(function () {
var self = Container.call(this);
var ball = self.attachAsset('playerCannonball', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = ball.width;
self.height = ball.height;
self.speed = -16;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player Ship Class
var PlayerShip = Container.expand(function () {
var self = Container.call(this);
var ship = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = ship.width;
self.height = ship.height;
// For hit flash
self.flash = function () {
tween(self, {
alpha: 0.3
}, {
duration: 100,
onFinish: function onFinish() {
tween(self, {
alpha: 1
}, {
duration: 200
});
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a3a5c // Deep blue sea
});
/****
* Game Code
****/
// Explosion: red ellipse, 80x80
// Player cannonball: gold ellipse, 60x60
// Cannonball: black ellipse, 60x60
// Enemy ship: dark gray box, 160x100
// Player ship: brown box, 180x120
// --- Globals ---
var playerShip;
var enemyShips = [];
var cannonballs = [];
var playerCannonballs = [];
var explosions = [];
var dragNode = null;
var lastPlayerHit = false;
var scoreTxt;
var spawnTimer = 0;
var enemySpawnInterval = 120; // ticks
var minEnemySpawnInterval = 40;
var difficultyTimer = 0;
// --- Setup background color ---
game.setBackgroundColor(0x1a3a5c);
// --- Score UI ---
scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// --- Player Ship ---
playerShip = new PlayerShip();
playerShip.x = 2048 / 2;
playerShip.y = 2732 - 220;
game.addChild(playerShip);
// --- Touch Controls ---
function clamp(val, min, max) {
if (val < min) return min;
if (val > max) return max;
return val;
}
function handleMove(x, y, obj) {
if (dragNode === playerShip) {
// Clamp ship inside screen
var halfW = playerShip.width / 2;
var halfH = playerShip.height / 2;
playerShip.x = clamp(x, halfW, 2048 - halfW);
playerShip.y = clamp(y, 2732 * 0.5, 2732 - halfH - 20);
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Only start drag if touch is on player ship
var local = playerShip.toLocal(game.toGlobal({
x: x,
y: y
}));
if (local.x >= -playerShip.width / 2 && local.x <= playerShip.width / 2 && local.y >= -playerShip.height / 2 && local.y <= playerShip.height / 2) {
dragNode = playerShip;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// --- Game Update Loop ---
game.update = function () {
// --- Difficulty scaling ---
difficultyTimer++;
if (difficultyTimer % 600 === 0 && enemySpawnInterval > minEnemySpawnInterval) {
enemySpawnInterval -= 10;
if (enemySpawnInterval < minEnemySpawnInterval) enemySpawnInterval = minEnemySpawnInterval;
}
// --- Spawn Enemies ---
spawnTimer++;
if (spawnTimer >= enemySpawnInterval) {
spawnTimer = 0;
var enemy = new EnemyShip();
// Random x, avoid edges
var ew = enemy.width / 2;
enemy.x = ew + Math.random() * (2048 - ew * 2);
enemy.y = -enemy.height / 2 - 10;
enemyShips.push(enemy);
game.addChild(enemy);
}
// --- Update Enemies ---
for (var i = enemyShips.length - 1; i >= 0; i--) {
var enemy = enemyShips[i];
enemy.update();
// Fire cannonball if ready and player is alive
if (enemy.fireCooldown <= 0 && playerShip && !lastPlayerHit) {
var cb = new Cannonball();
cb.x = enemy.x;
cb.y = enemy.y + enemy.height / 2 + 10;
cannonballs.push(cb);
game.addChild(cb);
enemy.fireCooldown = 90 + Math.floor(Math.random() * 60);
}
// Remove if off screen
if (enemy.y - enemy.height / 2 > 2732 + 100) {
enemy.destroy();
enemyShips.splice(i, 1);
}
}
// --- Update Enemy Cannonballs ---
for (var i = cannonballs.length - 1; i >= 0; i--) {
var cb = cannonballs[i];
cb.update();
// Collision with player
if (playerShip && cb.intersects(playerShip)) {
// Hit!
if (!lastPlayerHit) {
playerShip.flash();
LK.effects.flashScreen(0xff0000, 800);
lastPlayerHit = true;
// Show game over after short delay for effect
LK.setTimeout(function () {
LK.showGameOver();
}, 600);
}
}
// Remove if off screen
if (cb.y - cb.height / 2 > 2732 + 60) {
cb.destroy();
cannonballs.splice(i, 1);
}
}
// --- Update Player Cannonballs ---
for (var i = playerCannonballs.length - 1; i >= 0; i--) {
var pcb = playerCannonballs[i];
pcb.update();
// Remove if off screen
if (pcb.y + pcb.height / 2 < -60) {
pcb.destroy();
playerCannonballs.splice(i, 1);
continue;
}
// Check collision with enemy ships
for (var j = enemyShips.length - 1; j >= 0; j--) {
var enemy = enemyShips[j];
if (pcb.intersects(enemy)) {
// Explosion effect
var exp = new Explosion();
exp.x = enemy.x;
exp.y = enemy.y;
game.addChild(exp);
// Remove enemy and cannonball
enemy.destroy();
enemyShips.splice(j, 1);
pcb.destroy();
playerCannonballs.splice(i, 1);
// Score
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
break;
}
}
}
// --- Fire player cannonball (auto-fire every 18 ticks) ---
if (playerShip && !lastPlayerHit && LK.ticks % 18 === 0) {
var pcb = new PlayerCannonball();
pcb.x = playerShip.x;
pcb.y = playerShip.y - playerShip.height / 2 - 10;
playerCannonballs.push(pcb);
game.addChild(pcb);
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,278 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Enemy Cannonball Class
+var Cannonball = Container.expand(function () {
+ var self = Container.call(this);
+ var ball = self.attachAsset('cannonball', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = ball.width;
+ self.height = ball.height;
+ self.speed = 10;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Enemy Ship Class
+var EnemyShip = Container.expand(function () {
+ var self = Container.call(this);
+ var ship = self.attachAsset('enemyShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = ship.width;
+ self.height = ship.height;
+ self.speed = 2 + Math.random() * 2; // Vary speed
+ self.fireCooldown = 60 + Math.floor(Math.random() * 60); // Ticks until next shot
+ self.update = function () {
+ self.y += self.speed;
+ self.fireCooldown--;
+ };
+ return self;
+});
+// Explosion effect (visual only)
+var Explosion = Container.expand(function () {
+ var self = Container.call(this);
+ var exp = self.attachAsset('explosion', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.8
+ });
+ // Animate: scale up and fade out
+ tween(self, {
+ scaleX: 1.8,
+ scaleY: 1.8,
+ alpha: 0
+ }, {
+ duration: 350,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.destroy();
+ }
+ });
+ return self;
+});
+// Player Cannonball Class
+var PlayerCannonball = Container.expand(function () {
+ var self = Container.call(this);
+ var ball = self.attachAsset('playerCannonball', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = ball.width;
+ self.height = ball.height;
+ self.speed = -16;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Player Ship Class
+var PlayerShip = Container.expand(function () {
+ var self = Container.call(this);
+ var ship = self.attachAsset('playerShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.width = ship.width;
+ self.height = ship.height;
+ // For hit flash
+ self.flash = function () {
+ tween(self, {
+ alpha: 0.3
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(self, {
+ alpha: 1
+ }, {
+ duration: 200
+ });
+ }
+ });
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x1a3a5c // Deep blue sea
+});
+
+/****
+* Game Code
+****/
+// Explosion: red ellipse, 80x80
+// Player cannonball: gold ellipse, 60x60
+// Cannonball: black ellipse, 60x60
+// Enemy ship: dark gray box, 160x100
+// Player ship: brown box, 180x120
+// --- Globals ---
+var playerShip;
+var enemyShips = [];
+var cannonballs = [];
+var playerCannonballs = [];
+var explosions = [];
+var dragNode = null;
+var lastPlayerHit = false;
+var scoreTxt;
+var spawnTimer = 0;
+var enemySpawnInterval = 120; // ticks
+var minEnemySpawnInterval = 40;
+var difficultyTimer = 0;
+// --- Setup background color ---
+game.setBackgroundColor(0x1a3a5c);
+// --- Score UI ---
+scoreTxt = new Text2('0', {
+ size: 120,
+ fill: "#fff"
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// --- Player Ship ---
+playerShip = new PlayerShip();
+playerShip.x = 2048 / 2;
+playerShip.y = 2732 - 220;
+game.addChild(playerShip);
+// --- Touch Controls ---
+function clamp(val, min, max) {
+ if (val < min) return min;
+ if (val > max) return max;
+ return val;
+}
+function handleMove(x, y, obj) {
+ if (dragNode === playerShip) {
+ // Clamp ship inside screen
+ var halfW = playerShip.width / 2;
+ var halfH = playerShip.height / 2;
+ playerShip.x = clamp(x, halfW, 2048 - halfW);
+ playerShip.y = clamp(y, 2732 * 0.5, 2732 - halfH - 20);
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ // Only start drag if touch is on player ship
+ var local = playerShip.toLocal(game.toGlobal({
+ x: x,
+ y: y
+ }));
+ if (local.x >= -playerShip.width / 2 && local.x <= playerShip.width / 2 && local.y >= -playerShip.height / 2 && local.y <= playerShip.height / 2) {
+ dragNode = playerShip;
+ handleMove(x, y, obj);
+ }
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// --- Game Update Loop ---
+game.update = function () {
+ // --- Difficulty scaling ---
+ difficultyTimer++;
+ if (difficultyTimer % 600 === 0 && enemySpawnInterval > minEnemySpawnInterval) {
+ enemySpawnInterval -= 10;
+ if (enemySpawnInterval < minEnemySpawnInterval) enemySpawnInterval = minEnemySpawnInterval;
+ }
+ // --- Spawn Enemies ---
+ spawnTimer++;
+ if (spawnTimer >= enemySpawnInterval) {
+ spawnTimer = 0;
+ var enemy = new EnemyShip();
+ // Random x, avoid edges
+ var ew = enemy.width / 2;
+ enemy.x = ew + Math.random() * (2048 - ew * 2);
+ enemy.y = -enemy.height / 2 - 10;
+ enemyShips.push(enemy);
+ game.addChild(enemy);
+ }
+ // --- Update Enemies ---
+ for (var i = enemyShips.length - 1; i >= 0; i--) {
+ var enemy = enemyShips[i];
+ enemy.update();
+ // Fire cannonball if ready and player is alive
+ if (enemy.fireCooldown <= 0 && playerShip && !lastPlayerHit) {
+ var cb = new Cannonball();
+ cb.x = enemy.x;
+ cb.y = enemy.y + enemy.height / 2 + 10;
+ cannonballs.push(cb);
+ game.addChild(cb);
+ enemy.fireCooldown = 90 + Math.floor(Math.random() * 60);
+ }
+ // Remove if off screen
+ if (enemy.y - enemy.height / 2 > 2732 + 100) {
+ enemy.destroy();
+ enemyShips.splice(i, 1);
+ }
+ }
+ // --- Update Enemy Cannonballs ---
+ for (var i = cannonballs.length - 1; i >= 0; i--) {
+ var cb = cannonballs[i];
+ cb.update();
+ // Collision with player
+ if (playerShip && cb.intersects(playerShip)) {
+ // Hit!
+ if (!lastPlayerHit) {
+ playerShip.flash();
+ LK.effects.flashScreen(0xff0000, 800);
+ lastPlayerHit = true;
+ // Show game over after short delay for effect
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 600);
+ }
+ }
+ // Remove if off screen
+ if (cb.y - cb.height / 2 > 2732 + 60) {
+ cb.destroy();
+ cannonballs.splice(i, 1);
+ }
+ }
+ // --- Update Player Cannonballs ---
+ for (var i = playerCannonballs.length - 1; i >= 0; i--) {
+ var pcb = playerCannonballs[i];
+ pcb.update();
+ // Remove if off screen
+ if (pcb.y + pcb.height / 2 < -60) {
+ pcb.destroy();
+ playerCannonballs.splice(i, 1);
+ continue;
+ }
+ // Check collision with enemy ships
+ for (var j = enemyShips.length - 1; j >= 0; j--) {
+ var enemy = enemyShips[j];
+ if (pcb.intersects(enemy)) {
+ // Explosion effect
+ var exp = new Explosion();
+ exp.x = enemy.x;
+ exp.y = enemy.y;
+ game.addChild(exp);
+ // Remove enemy and cannonball
+ enemy.destroy();
+ enemyShips.splice(j, 1);
+ pcb.destroy();
+ playerCannonballs.splice(i, 1);
+ // Score
+ LK.setScore(LK.getScore() + 1);
+ scoreTxt.setText(LK.getScore());
+ break;
+ }
+ }
+ }
+ // --- Fire player cannonball (auto-fire every 18 ticks) ---
+ if (playerShip && !lastPlayerHit && LK.ticks % 18 === 0) {
+ var pcb = new PlayerCannonball();
+ pcb.x = playerShip.x;
+ pcb.y = playerShip.y - playerShip.height / 2 - 10;
+ playerCannonballs.push(pcb);
+ game.addChild(pcb);
+ }
+};
\ No newline at end of file
blue flyng wyvern dragon back view. In-Game asset. 2d. High contrast. No shadows
winged evil gray skull. In-Game asset. 2d. High contrast. No shadows
oval fire ball. In-Game asset. 2d. High contrast. No shadows
yellow bright fire explosion. In-Game asset. 2d. High contrast. No shadows
blue thunder ball. In-Game asset. 2d. High contrast. No shadows