/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var EnemyShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('enemyShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.update = function () {
self.y += self.speed;
};
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;
});
var PlayerShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create player ship
var player = game.addChild(new PlayerShip());
player.x = 2048 / 2;
player.y = 2732 - 150;
// Game arrays
var bullets = [];
var enemies = [];
// Game variables
var lastShootTime = 0;
var shootInterval = 10; // Shoot every 10 ticks (6 times per second)
var enemySpawnTimer = 0;
var enemySpawnInterval = 60; // Spawn enemy every 60 ticks (1 per second)
// Touch/drag handling
var isDragging = false;
game.down = function (x, y, obj) {
isDragging = true;
player.x = Math.max(40, Math.min(2048 - 40, x));
};
game.move = function (x, y, obj) {
if (isDragging) {
player.x = Math.max(40, Math.min(2048 - 40, x));
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
// Main game update loop
game.update = function () {
// Auto-shoot bullets
if (LK.ticks - lastShootTime >= shootInterval) {
var newBullet = new PlayerBullet();
newBullet.x = player.x;
newBullet.y = player.y - 50;
newBullet.lastY = newBullet.y;
bullets.push(newBullet);
game.addChild(newBullet);
lastShootTime = LK.ticks;
LK.getSound('shoot').play();
}
// Spawn enemies
enemySpawnTimer++;
if (enemySpawnTimer >= enemySpawnInterval) {
var newEnemy = new EnemyShip();
newEnemy.x = Math.random() * (2048 - 100) + 50;
newEnemy.y = -30;
newEnemy.lastY = newEnemy.y;
newEnemy.lastPlayerIntersecting = false;
enemies.push(newEnemy);
game.addChild(newEnemy);
enemySpawnTimer = 0;
}
// Update and check bullets
for (var b = bullets.length - 1; b >= 0; b--) {
var bullet = bullets[b];
// Remove bullets that go off screen
if (bullet.lastY >= -25 && bullet.y < -25) {
bullet.destroy();
bullets.splice(b, 1);
continue;
}
// Check bullet-enemy collisions
var bulletHitEnemy = false;
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
if (bullet.intersects(enemy)) {
// Enemy destroyed
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
// Create explosion effect
tween(enemy, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
// Enemy cleanup is handled below
}
});
LK.getSound('enemyDestroyed').play();
// Remove enemy
enemy.destroy();
enemies.splice(e, 1);
// Remove bullet
bullet.destroy();
bullets.splice(b, 1);
bulletHitEnemy = true;
break;
}
}
if (!bulletHitEnemy) {
bullet.lastY = bullet.y;
}
}
// Update and check enemies
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
// Remove enemies that go off screen
if (enemy.lastY <= 2732 + 50 && enemy.y > 2732 + 50) {
enemy.destroy();
enemies.splice(e, 1);
continue;
}
// Check enemy-player collision
var currentPlayerIntersecting = enemy.intersects(player);
if (!enemy.lastPlayerIntersecting && currentPlayerIntersecting) {
// Game Over
LK.getSound('gameOver').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
enemy.lastY = enemy.y;
enemy.lastPlayerIntersecting = currentPlayerIntersecting;
}
// Increase difficulty over time
if (LK.getScore() > 0 && LK.getScore() % 100 === 0 && enemySpawnInterval > 20) {
enemySpawnInterval = Math.max(20, enemySpawnInterval - 1);
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var EnemyShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('enemyShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.update = function () {
self.y += self.speed;
};
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;
});
var PlayerShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create player ship
var player = game.addChild(new PlayerShip());
player.x = 2048 / 2;
player.y = 2732 - 150;
// Game arrays
var bullets = [];
var enemies = [];
// Game variables
var lastShootTime = 0;
var shootInterval = 10; // Shoot every 10 ticks (6 times per second)
var enemySpawnTimer = 0;
var enemySpawnInterval = 60; // Spawn enemy every 60 ticks (1 per second)
// Touch/drag handling
var isDragging = false;
game.down = function (x, y, obj) {
isDragging = true;
player.x = Math.max(40, Math.min(2048 - 40, x));
};
game.move = function (x, y, obj) {
if (isDragging) {
player.x = Math.max(40, Math.min(2048 - 40, x));
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
// Main game update loop
game.update = function () {
// Auto-shoot bullets
if (LK.ticks - lastShootTime >= shootInterval) {
var newBullet = new PlayerBullet();
newBullet.x = player.x;
newBullet.y = player.y - 50;
newBullet.lastY = newBullet.y;
bullets.push(newBullet);
game.addChild(newBullet);
lastShootTime = LK.ticks;
LK.getSound('shoot').play();
}
// Spawn enemies
enemySpawnTimer++;
if (enemySpawnTimer >= enemySpawnInterval) {
var newEnemy = new EnemyShip();
newEnemy.x = Math.random() * (2048 - 100) + 50;
newEnemy.y = -30;
newEnemy.lastY = newEnemy.y;
newEnemy.lastPlayerIntersecting = false;
enemies.push(newEnemy);
game.addChild(newEnemy);
enemySpawnTimer = 0;
}
// Update and check bullets
for (var b = bullets.length - 1; b >= 0; b--) {
var bullet = bullets[b];
// Remove bullets that go off screen
if (bullet.lastY >= -25 && bullet.y < -25) {
bullet.destroy();
bullets.splice(b, 1);
continue;
}
// Check bullet-enemy collisions
var bulletHitEnemy = false;
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
if (bullet.intersects(enemy)) {
// Enemy destroyed
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
// Create explosion effect
tween(enemy, {
scaleX: 2,
scaleY: 2,
alpha: 0
}, {
duration: 200,
onFinish: function onFinish() {
// Enemy cleanup is handled below
}
});
LK.getSound('enemyDestroyed').play();
// Remove enemy
enemy.destroy();
enemies.splice(e, 1);
// Remove bullet
bullet.destroy();
bullets.splice(b, 1);
bulletHitEnemy = true;
break;
}
}
if (!bulletHitEnemy) {
bullet.lastY = bullet.y;
}
}
// Update and check enemies
for (var e = enemies.length - 1; e >= 0; e--) {
var enemy = enemies[e];
// Remove enemies that go off screen
if (enemy.lastY <= 2732 + 50 && enemy.y > 2732 + 50) {
enemy.destroy();
enemies.splice(e, 1);
continue;
}
// Check enemy-player collision
var currentPlayerIntersecting = enemy.intersects(player);
if (!enemy.lastPlayerIntersecting && currentPlayerIntersecting) {
// Game Over
LK.getSound('gameOver').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
enemy.lastY = enemy.y;
enemy.lastPlayerIntersecting = currentPlayerIntersecting;
}
// Increase difficulty over time
if (LK.getScore() > 0 && LK.getScore() % 100 === 0 && enemySpawnInterval > 20) {
enemySpawnInterval = Math.max(20, enemySpawnInterval - 1);
}
};