/****
* Classes
****/
// ExplosionBlock class
var ExplosionBlock = Container.expand(function () {
var self = Container.call(this);
var blockGraphics = self.createAsset('explosionBlock', 'Explosion Block', 0.5, 0.5);
blockGraphics.scale.set(2);
self.fadeOut = function () {
var fadeDuration = 2000; // 2 seconds
var fadeStep = self.alpha / (fadeDuration / (1000 / 60)); // Calculate fade step for 60FPS
var fadeInterval = LK.setInterval(function () {
self.alpha -= fadeStep;
if (self.alpha <= 0) {
LK.clearInterval(fadeInterval);
self.destroy();
}
}, 1000 / 60);
};
self.fadeOut();
blockGraphics.tint = 0xFFA500; // Orange color
self.speed = 40;
self.direction = {
x: 0,
y: 0
};
self.move = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
};
self.isOffScreen = function () {
return self.x < -self.width || self.x > 2048 + self.width || self.y < -self.height || self.y > 2732 + self.height;
};
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.createAsset('enemy', 'Enemy Ship', 0.5, 0.5);
enemyGraphics.scale.set(2);
self.speed = 4;
self.move = function () {
self.y += self.speed;
};
self.isOffScreen = function () {
return self.y > 2732 + self.height;
};
});
// Hero class
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.createAsset('hero', 'Hero Ship', 0.5, 0.5);
heroGraphics.scale.set(2);
self.x = 2048 / 2;
self.y = 2732 - 200;
});
// Bullet class
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('bullet', 'Bullet', 0.5, 0.5);
bulletGraphics.scale.set(2);
self.speed = -20;
self.move = function () {
self.y += self.speed;
};
self.isOffScreen = function () {
return self.y < -self.height;
};
});
// EnemyBullet class
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet', 0.5, 0.5);
bulletGraphics.scale.set(2);
self.speed = 10;
self.move = function () {
self.y += self.speed;
};
self.isOffScreen = function () {
return self.y > 2732 + self.height;
};
});
// HomingBullet class
var HomingBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('homingBullet', 'Homing Bullet', 0.5, 0.5);
bulletGraphics.scale.set(2);
self.speed = 2;
self.target = null;
self.creationTime = LK.ticks;
self.move = function () {
if (LK.ticks >= self.creationTime + 600) {
self.destroy();
return;
}
if (self.target) {
var dx = self.target.x - self.x;
var dy = self.target.y - self.y;
var angle = Math.atan2(dy, dx);
self.x += Math.cos(angle) * self.speed;
self.y += Math.sin(angle) * self.speed;
self.rotation = angle;
} else {
// Default movement towards the bottom of the screen if no target is set
self.y += self.speed;
}
if (self.target && self.intersects(self.target)) {
// Player hit by homing bullet
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
isGameOver = true;
self.destroy();
return;
}
};
self.setTarget = function (target) {
self.target = target;
};
self.isOffScreen = function () {
return self.x < -self.width || self.x > 2048 + self.width || self.y < -self.height || self.y > 2732 + self.height;
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Initialize hero
var hero = game.addChild(new Hero());
// Initialize enemy and bullet arrays
var enemies = [];
var heroBullets = [];
var enemyBullets = [];
// Initialize homing bullet chance and increment
var homingBulletChance = 0.01; // 1% initial chance
var homingBulletIncrement = 0.01; // 1% increment every 3 seconds
var lastHomingBulletIncrementTime = LK.ticks;
// Game state
var isGameOver = false;
// Touch event handling
var dragNode = null;
function handleMove(obj) {
var event = obj.event;
var pos = event.getLocalPosition(game);
if (dragNode) {
dragNode.x = pos.x;
dragNode.y = pos.y;
}
}
game.on('down', function (obj) {
dragNode = hero;
handleMove(obj);
});
game.on('move', handleMove);
game.on('up', function (obj) {
dragNode = null;
});
// Game tick event
LK.on('tick', function () {
if (isGameOver) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
// Move hero bullets
for (var i = heroBullets.length - 1; i >= 0; i--) {
heroBullets[i].move();
if (heroBullets[i].isOffScreen()) {
heroBullets[i].destroy();
heroBullets.splice(i, 1);
}
}
// Move enemies and enemy bullets
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].move();
if (enemies[j].isOffScreen()) {
enemies[j].destroy();
enemies.splice(j, 1);
}
}
// Check if hero is hit by enemy bullets
for (var m = enemyBullets.length - 1; m >= 0; m--) {
enemyBullets[m].move();
if (enemyBullets[m].intersects(hero)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
isGameOver = true;
return;
}
if (enemyBullets[m].isOffScreen()) {
enemyBullets[m].destroy();
enemyBullets.splice(m, 1);
}
}
// Check for collisions
for (var k = heroBullets.length - 1; k >= 0; k--) {
for (var l = enemies.length - 1; l >= 0; l--) {
if (heroBullets[k].intersects(enemies[l])) {
heroBullets[k].destroy();
heroBullets.splice(k, 1);
// Create explosion blocks
var directions = [{
x: -1,
y: 0
},
// Left
{
x: 1,
y: 0
},
// Right
{
x: 0,
y: -1
},
// Up
{
x: 0,
y: 1
} // Down
];
directions.forEach(function (dir) {
var block = new ExplosionBlock();
block.x = enemies[l].x;
block.y = enemies[l].y;
block.direction = dir;
game.addChild(block);
});
// Destroy the enemy
enemies[l].destroy();
enemies.splice(l, 1);
break;
}
}
}
// Fire hero bullets
if (LK.ticks % 60 == 0) {
var bullet = new Bullet();
bullet.x = hero.x;
bullet.y = hero.y;
heroBullets.push(bullet);
game.addChild(bullet);
}
// Enemies shoot bullets
if (LK.ticks % 120 == 0) {
enemies.forEach(function (enemy) {
// Update homing bullet chance every 3 seconds (180 ticks)
if (LK.ticks - lastHomingBulletIncrementTime >= 180) {
homingBulletChance += homingBulletIncrement;
lastHomingBulletIncrementTime = LK.ticks;
}
// Adjusted chance for HomingBullet
if (Math.random() < homingBulletChance) {
var homingBullet = new HomingBullet();
homingBullet.x = enemy.x;
homingBullet.y = enemy.y + enemy.height / 2;
homingBullet.setTarget(hero);
game.addChild(homingBullet);
} else {
var enemyBullet = new EnemyBullet();
enemyBullet.x = enemy.x;
enemyBullet.y = enemy.y + enemy.height / 2;
enemyBullets.push(enemyBullet);
game.addChild(enemyBullet);
}
});
}
// Spawn enemies and make them shoot bullets
// Moved enemyBullets array declaration to the top of the game code to persist its state
if (LK.ticks % 120 == 0) {
var enemy = new Enemy();
enemy.x = Math.random() * (2048 - enemy.width) + enemy.width / 2;
enemy.y = -enemy.height;
enemies.push(enemy);
game.addChild(enemy);
}
// Enemies shoot bullets
if (LK.ticks % 120 == 0) {
enemies.forEach(function (enemy) {
var enemyBullet = new EnemyBullet();
enemyBullet.x = enemy.x;
enemyBullet.y = enemy.y + enemy.height / 2;
enemyBullets.push(enemyBullet);
game.addChild(enemyBullet);
});
}
}); /****
* Classes
****/
// ExplosionBlock class
var ExplosionBlock = Container.expand(function () {
var self = Container.call(this);
var blockGraphics = self.createAsset('explosionBlock', 'Explosion Block', 0.5, 0.5);
blockGraphics.scale.set(2);
self.fadeOut = function () {
var fadeDuration = 2000; // 2 seconds
var fadeStep = self.alpha / (fadeDuration / (1000 / 60)); // Calculate fade step for 60FPS
var fadeInterval = LK.setInterval(function () {
self.alpha -= fadeStep;
if (self.alpha <= 0) {
LK.clearInterval(fadeInterval);
self.destroy();
}
}, 1000 / 60);
};
self.fadeOut();
blockGraphics.tint = 0xFFA500; // Orange color
self.speed = 40;
self.direction = {
x: 0,
y: 0
};
self.move = function () {
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
};
self.isOffScreen = function () {
return self.x < -self.width || self.x > 2048 + self.width || self.y < -self.height || self.y > 2732 + self.height;
};
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.createAsset('enemy', 'Enemy Ship', 0.5, 0.5);
enemyGraphics.scale.set(2);
self.speed = 4;
self.move = function () {
self.y += self.speed;
};
self.isOffScreen = function () {
return self.y > 2732 + self.height;
};
});
// Hero class
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.createAsset('hero', 'Hero Ship', 0.5, 0.5);
heroGraphics.scale.set(2);
self.x = 2048 / 2;
self.y = 2732 - 200;
});
// Bullet class
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('bullet', 'Bullet', 0.5, 0.5);
bulletGraphics.scale.set(2);
self.speed = -20;
self.move = function () {
self.y += self.speed;
};
self.isOffScreen = function () {
return self.y < -self.height;
};
});
// EnemyBullet class
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('enemyBullet', 'Enemy Bullet', 0.5, 0.5);
bulletGraphics.scale.set(2);
self.speed = 10;
self.move = function () {
self.y += self.speed;
};
self.isOffScreen = function () {
return self.y > 2732 + self.height;
};
});
// HomingBullet class
var HomingBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('homingBullet', 'Homing Bullet', 0.5, 0.5);
bulletGraphics.scale.set(2);
self.speed = 2;
self.target = null;
self.creationTime = LK.ticks;
self.move = function () {
if (LK.ticks >= self.creationTime + 600) {
self.destroy();
return;
}
if (self.target) {
var dx = self.target.x - self.x;
var dy = self.target.y - self.y;
var angle = Math.atan2(dy, dx);
self.x += Math.cos(angle) * self.speed;
self.y += Math.sin(angle) * self.speed;
self.rotation = angle;
} else {
// Default movement towards the bottom of the screen if no target is set
self.y += self.speed;
}
if (self.target && self.intersects(self.target)) {
// Player hit by homing bullet
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
isGameOver = true;
self.destroy();
return;
}
};
self.setTarget = function (target) {
self.target = target;
};
self.isOffScreen = function () {
return self.x < -self.width || self.x > 2048 + self.width || self.y < -self.height || self.y > 2732 + self.height;
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Initialize hero
var hero = game.addChild(new Hero());
// Initialize enemy and bullet arrays
var enemies = [];
var heroBullets = [];
var enemyBullets = [];
// Initialize homing bullet chance and increment
var homingBulletChance = 0.01; // 1% initial chance
var homingBulletIncrement = 0.01; // 1% increment every 3 seconds
var lastHomingBulletIncrementTime = LK.ticks;
// Game state
var isGameOver = false;
// Touch event handling
var dragNode = null;
function handleMove(obj) {
var event = obj.event;
var pos = event.getLocalPosition(game);
if (dragNode) {
dragNode.x = pos.x;
dragNode.y = pos.y;
}
}
game.on('down', function (obj) {
dragNode = hero;
handleMove(obj);
});
game.on('move', handleMove);
game.on('up', function (obj) {
dragNode = null;
});
// Game tick event
LK.on('tick', function () {
if (isGameOver) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
// Move hero bullets
for (var i = heroBullets.length - 1; i >= 0; i--) {
heroBullets[i].move();
if (heroBullets[i].isOffScreen()) {
heroBullets[i].destroy();
heroBullets.splice(i, 1);
}
}
// Move enemies and enemy bullets
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].move();
if (enemies[j].isOffScreen()) {
enemies[j].destroy();
enemies.splice(j, 1);
}
}
// Check if hero is hit by enemy bullets
for (var m = enemyBullets.length - 1; m >= 0; m--) {
enemyBullets[m].move();
if (enemyBullets[m].intersects(hero)) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
isGameOver = true;
return;
}
if (enemyBullets[m].isOffScreen()) {
enemyBullets[m].destroy();
enemyBullets.splice(m, 1);
}
}
// Check for collisions
for (var k = heroBullets.length - 1; k >= 0; k--) {
for (var l = enemies.length - 1; l >= 0; l--) {
if (heroBullets[k].intersects(enemies[l])) {
heroBullets[k].destroy();
heroBullets.splice(k, 1);
// Create explosion blocks
var directions = [{
x: -1,
y: 0
},
// Left
{
x: 1,
y: 0
},
// Right
{
x: 0,
y: -1
},
// Up
{
x: 0,
y: 1
} // Down
];
directions.forEach(function (dir) {
var block = new ExplosionBlock();
block.x = enemies[l].x;
block.y = enemies[l].y;
block.direction = dir;
game.addChild(block);
});
// Destroy the enemy
enemies[l].destroy();
enemies.splice(l, 1);
break;
}
}
}
// Fire hero bullets
if (LK.ticks % 60 == 0) {
var bullet = new Bullet();
bullet.x = hero.x;
bullet.y = hero.y;
heroBullets.push(bullet);
game.addChild(bullet);
}
// Enemies shoot bullets
if (LK.ticks % 120 == 0) {
enemies.forEach(function (enemy) {
// Update homing bullet chance every 3 seconds (180 ticks)
if (LK.ticks - lastHomingBulletIncrementTime >= 180) {
homingBulletChance += homingBulletIncrement;
lastHomingBulletIncrementTime = LK.ticks;
}
// Adjusted chance for HomingBullet
if (Math.random() < homingBulletChance) {
var homingBullet = new HomingBullet();
homingBullet.x = enemy.x;
homingBullet.y = enemy.y + enemy.height / 2;
homingBullet.setTarget(hero);
game.addChild(homingBullet);
} else {
var enemyBullet = new EnemyBullet();
enemyBullet.x = enemy.x;
enemyBullet.y = enemy.y + enemy.height / 2;
enemyBullets.push(enemyBullet);
game.addChild(enemyBullet);
}
});
}
// Spawn enemies and make them shoot bullets
// Moved enemyBullets array declaration to the top of the game code to persist its state
if (LK.ticks % 120 == 0) {
var enemy = new Enemy();
enemy.x = Math.random() * (2048 - enemy.width) + enemy.width / 2;
enemy.y = -enemy.height;
enemies.push(enemy);
game.addChild(enemy);
}
// Enemies shoot bullets
if (LK.ticks % 120 == 0) {
enemies.forEach(function (enemy) {
var enemyBullet = new EnemyBullet();
enemyBullet.x = enemy.x;
enemyBullet.y = enemy.y + enemy.height / 2;
enemyBullets.push(enemyBullet);
game.addChild(enemyBullet);
});
}
});
Spaceship with 1 cannon facing upwards. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. Pixelated.
bullet launching upwards. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. Pixelated.
alien ship facing downwards. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. Pixelated.
slime ball being launched downwards. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. Pixelated.
giant space explosion. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. Pixelated.
space trap. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. Pixelated.