/**** * Classes ****/ var StingerEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.createAsset('stingerEnemy', 'Stinger enemy character', 0.5, 0.5); self.baseSpeed = 1.5; self.strength = 10; // Stinger enemy with higher strength self.updateSpeed = function (score) { self.strength = 10 + Math.floor(score / 150); // Stinger enemies scale with score self.speed = self.baseSpeed * self.strength; }; self.move = function () { self.y += self.speed; }; }); // HeroBullet class var HeroBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.createAsset('heroBullet', 'Hero bullet', 0.5, 1); self.speed = 10; self.move = function () { self.y -= self.speed; }; }); // Hero class var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = self.createAsset('hero', 'Hero character', 0.5, 0.5); self.speed = 5; self.bulletCooldown = 0; self.lives = 5; // Player starts with 5 lives self.moveLeft = function () { self.x = Math.max(self.width / 2, self.x - self.speed); }; self.moveRight = function () { self.x = Math.min(2048 - self.width / 2, self.x + self.speed); }; self.shoot = function () { if (self.bulletCooldown <= 0) { var bullet = new HeroBullet(); bullet.x = self.x; bullet.y = self.y - self.height / 2; game.addChild(bullet); bullets.push(bullet); self.bulletCooldown = 20; // Cooldown period before next shot } }; self.powerUpTimer = 0; self.powerUpActive = false; self.enableSpreadShot = function () { self.powerUpActive = true; self.powerUpTimer = 3600; // 1 minute at 60FPS self.shoot = function () { if (self.bulletCooldown <= 0) { var angles = [-Math.PI / 4, -Math.PI / 2, -3 * Math.PI / 4]; // Angles for upward spread shot for (var i = 0; i < angles.length; i++) { var bullet = new SpreadShotBullet(angles[i], 10); bullet.x = self.x; bullet.y = self.y - self.height / 2; game.addChild(bullet); bullets.push(bullet); } self.bulletCooldown = 20; // Cooldown period before next shot } }; }; self.updatePowerUpTimer = function () { if (self.powerUpTimer > 0) { self.powerUpTimer--; if (self.powerUpTimer == 0) { self.powerUpActive = false; // Reset shoot function to default behavior self.shoot = self.defaultShoot; } } }; self.defaultShoot = function () { if (self.bulletCooldown <= 0) { var bullet = new HeroBullet(); bullet.x = self.x; bullet.y = self.y - self.height / 2; game.addChild(bullet); bullets.push(bullet); self.bulletCooldown = 20; // Cooldown period before next shot } }; self.shoot = self.defaultShoot; self.update = function () { if (self.bulletCooldown > 0) { self.bulletCooldown--; } var joystickDirection = joystick.getDirection(); if (joystickDirection.x < -10) { self.moveLeft(); } else if (joystickDirection.x > 10) { self.moveRight(); } }; }); // SpreadShotBullet class var SpreadShotBullet = Container.expand(function (angle, speed) { var self = Container.call(this); var bulletGraphics = self.createAsset('heroBullet', 'Spread shot bullet', 0.5, 1); self.speed = speed; self.angle = angle; self.move = function () { self.x += self.speed * Math.cos(self.angle); self.y += self.speed * Math.sin(self.angle); }; }); // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.createAsset('enemy', 'Enemy character', 0.5, 0.5); self.baseSpeed = 2; self.strength = 1; self.updateSpeed = function (score) { self.strength = 1 + Math.floor(score / 50); self.speed = self.baseSpeed * self.strength; }; self.move = function () { self.y += self.speed; }; }); // EnemyBullet class var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.createAsset('enemyBullet', 'Enemy bullet', 0.5, 0); self.speed = 5; self.move = function () { self.y += self.speed; }; }); // PowerUp class var PowerUp = Container.expand(function () { var self = Container.call(this); var powerUpGraphics = self.createAsset('powerUp', 'Power up', 0.5, 0.5); self.type = 'spread'; // Default power-up type self.speed = 2; self.move = function () { self.y += self.speed; }; self.applyEffect = function (hero) { // Apply the effect based on power-up type switch (self.type) { case 'spread': hero.enableSpreadShot(); break; } }; }); // Joystick class var Joystick = Container.expand(function () { var self = Container.call(this); var joystickGraphics = self.createAsset('joystickBase', 'Joystick base', 0.5, 0.5); var joystickKnob = self.createAsset('joystickKnob', 'Joystick knob', 0.5, 0.5); self.addChild(joystickKnob); self.isDragging = false; self.startPos = { x: 0, y: 0 }; self.currentPos = { x: 0, y: 0 }; self.delta = { x: 0, y: 0 }; self.on('down', function (obj) { self.isDragging = true; self.startPos = obj.event.getLocalPosition(self); }); self.on('move', function (obj) { if (self.isDragging) { self.currentPos = obj.event.getLocalPosition(self); self.delta.x = self.currentPos.x - self.startPos.x; self.delta.y = self.currentPos.y - self.startPos.y; joystickKnob.x = Math.max(-50, Math.min(50, self.delta.x)); joystickKnob.y = Math.max(-50, Math.min(50, self.delta.y)); } }); self.on('up', function (obj) { self.isDragging = false; joystickKnob.x = 0; joystickKnob.y = 0; self.delta.x = 0; self.delta.y = 0; }); self.getDirection = function () { return self.delta; }; }); // ShootButton class var ShootButton = Container.expand(function () { var self = Container.call(this); var buttonGraphics = self.createAsset('shootButton', 'Shoot button', 0.5, 0.5); self.on('down', function () { hero.shoot(); }); }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000, // Init game with black background backgroundImage: 'spaceBackground' // Set background image to Space }); /**** * Game Code ****/ var shootButton = game.addChild(new ShootButton()); shootButton.x = 2048 - 150; // Position from right shootButton.y = 2732 - 150; // Position from bottom var joystick = game.addChild(new Joystick()); joystick.x = 150; // Position from left joystick.y = 2732 - 150; // Position from bottom // Initialize important asset arrays var bullets = []; var enemies = []; var enemyBullets = []; var powerUps = []; // Store active power-ups var score = 0; var hero = game.addChild(new Hero()); hero.x = 1024; // Center of the screen hero.y = 2732 - 200; // Near the bottom of the screen // Score display var scoreTxt = new Text2('0', { size: 150, fill: "#ffffff" }); // Lives display var livesTxt = new Text2('Lives: 5', { size: 100, fill: "#ffffff" }); livesTxt.anchor.set(0, 0); LK.gui.topLeft.addChild(livesTxt); // Score and Wave display var scoreAndWaveTxt = new Text2('Score: 0 | Wave: 1', { size: 100, fill: "#ffffff" }); scoreAndWaveTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreAndWaveTxt); // Game tick event LK.on('tick', function () { // Update hero hero.update(); // Move and check bullets for (var i = bullets.length - 1; i >= 0; i--) { bullets[i].move(); if (bullets[i].y < -bullets[i].height) { bullets[i].destroy(); bullets.splice(i, 1); } else { // Check for bullet collision with enemies for (var j = enemies.length - 1; j >= 0; j--) { if (bullets[i].intersects(enemies[j])) { if (Math.random() < 0.2) { // 20% chance to drop a power-up var powerUpTypes = ['spread']; var powerUp = new PowerUp(); powerUp.type = powerUpTypes[Math.floor(Math.random() * powerUpTypes.length)]; powerUp.x = enemies[j].x; powerUp.y = enemies[j].y; game.addChild(powerUp); powerUps.push(powerUp); } enemies[j].destroy(); enemies.splice(j, 1); bullets[i].destroy(); bullets.splice(i, 1); score += 10; scoreTxt.setText(score.toString()); break; } } } } // Move and check enemy bullets for (var k = enemyBullets.length - 1; k >= 0; k--) { enemyBullets[k].move(); if (enemyBullets[k].y > 2732 + enemyBullets[k].height) { enemyBullets[k].destroy(); enemyBullets.splice(k, 1); } else if (enemyBullets[k].intersects(hero)) { hero.lives--; if (hero.lives <= 0) { // Game over condition LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } else { // Flash hero red to indicate hit and update lives display LK.effects.flashObject(hero, 0xff0000, 500); livesTxt.setText('Lives: ' + hero.lives); } enemyBullets[k].destroy(); enemyBullets.splice(k, 1); } } // Move and check power-ups for (var m = powerUps.length - 1; m >= 0; m--) { powerUps[m].move(); if (powerUps[m].y > 2732 + powerUps[m].height) { powerUps[m].destroy(); powerUps.splice(m, 1); } else if (powerUps[m].intersects(hero)) { powerUps[m].applyEffect(hero); powerUps[m].destroy(); powerUps.splice(m, 1); } } // Update hero's power-up timer hero.updatePowerUpTimer(); // Move enemies, check for collisions with hero, and potentially shoot for (var l = enemies.length - 1; l >= 0; l--) { enemies[l].move(); // Check for collision with hero if (enemies[l].intersects(hero)) { hero.lives--; if (hero.lives <= 0) { // Game over condition LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } else { // Flash hero red to indicate hit and update lives display LK.effects.flashObject(hero, 0xff0000, 500); livesTxt.setText('Lives: ' + hero.lives); } enemies[l].destroy(); enemies.splice(l, 1); continue; } if (Math.random() < 0.005) { // Random chance to shoot, rate reduced to half var enemyBullet = new EnemyBullet(); enemyBullet.x = enemies[l].x; enemyBullet.y = enemies[l].y + enemies[l].height / 2; game.addChild(enemyBullet); enemyBullets.push(enemyBullet); } } // Wave system var waveInterval = 600; // 10 seconds per wave var enemiesPerWave = 5 + Math.floor(score / 100); // Increase number of enemies per wave based on score var currentWave = Math.floor(LK.ticks / waveInterval) + 1; scoreAndWaveTxt.setText('Score: ' + score + ' | Wave: ' + currentWave); if (LK.ticks % waveInterval == 0) { var currentWave = Math.floor(LK.ticks / waveInterval) + 1; for (var i = 0; i < enemiesPerWave; i++) { var newEnemy; var enemyCount = 3; var stingerCount = 7; for (var i = 0; i < enemiesPerWave; i++) { if (i % enemyCount === 0) { // Spawn stingerEnemy for (var n = 0; n < stingerCount; n++) { var stingerEnemy = new StingerEnemy(); stingerEnemy.updateSpeed(score); stingerEnemy.x = 2048 / 8 * (n + 1) - stingerEnemy.width / 2; stingerEnemy.y = -stingerEnemy.height / 2 - i * stingerEnemy.height * 1.5; enemies.push(stingerEnemy); game.addChild(stingerEnemy); } } else { // Spawn normal enemies var normalEnemy = new Enemy(); normalEnemy.updateSpeed(score); normalEnemy.x = Math.random() * (2048 - normalEnemy.width) + normalEnemy.width / 2; normalEnemy.y = -normalEnemy.height / 2 - i * normalEnemy.height; enemies.push(normalEnemy); game.addChild(normalEnemy); } } } } });
/****
* Classes
****/
var StingerEnemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.createAsset('stingerEnemy', 'Stinger enemy character', 0.5, 0.5);
self.baseSpeed = 1.5;
self.strength = 10; // Stinger enemy with higher strength
self.updateSpeed = function (score) {
self.strength = 10 + Math.floor(score / 150); // Stinger enemies scale with score
self.speed = self.baseSpeed * self.strength;
};
self.move = function () {
self.y += self.speed;
};
});
// HeroBullet class
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('heroBullet', 'Hero bullet', 0.5, 1);
self.speed = 10;
self.move = function () {
self.y -= self.speed;
};
});
// Hero class
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.createAsset('hero', 'Hero character', 0.5, 0.5);
self.speed = 5;
self.bulletCooldown = 0;
self.lives = 5; // Player starts with 5 lives
self.moveLeft = function () {
self.x = Math.max(self.width / 2, self.x - self.speed);
};
self.moveRight = function () {
self.x = Math.min(2048 - self.width / 2, self.x + self.speed);
};
self.shoot = function () {
if (self.bulletCooldown <= 0) {
var bullet = new HeroBullet();
bullet.x = self.x;
bullet.y = self.y - self.height / 2;
game.addChild(bullet);
bullets.push(bullet);
self.bulletCooldown = 20; // Cooldown period before next shot
}
};
self.powerUpTimer = 0;
self.powerUpActive = false;
self.enableSpreadShot = function () {
self.powerUpActive = true;
self.powerUpTimer = 3600; // 1 minute at 60FPS
self.shoot = function () {
if (self.bulletCooldown <= 0) {
var angles = [-Math.PI / 4, -Math.PI / 2, -3 * Math.PI / 4]; // Angles for upward spread shot
for (var i = 0; i < angles.length; i++) {
var bullet = new SpreadShotBullet(angles[i], 10);
bullet.x = self.x;
bullet.y = self.y - self.height / 2;
game.addChild(bullet);
bullets.push(bullet);
}
self.bulletCooldown = 20; // Cooldown period before next shot
}
};
};
self.updatePowerUpTimer = function () {
if (self.powerUpTimer > 0) {
self.powerUpTimer--;
if (self.powerUpTimer == 0) {
self.powerUpActive = false;
// Reset shoot function to default behavior
self.shoot = self.defaultShoot;
}
}
};
self.defaultShoot = function () {
if (self.bulletCooldown <= 0) {
var bullet = new HeroBullet();
bullet.x = self.x;
bullet.y = self.y - self.height / 2;
game.addChild(bullet);
bullets.push(bullet);
self.bulletCooldown = 20; // Cooldown period before next shot
}
};
self.shoot = self.defaultShoot;
self.update = function () {
if (self.bulletCooldown > 0) {
self.bulletCooldown--;
}
var joystickDirection = joystick.getDirection();
if (joystickDirection.x < -10) {
self.moveLeft();
} else if (joystickDirection.x > 10) {
self.moveRight();
}
};
});
// SpreadShotBullet class
var SpreadShotBullet = Container.expand(function (angle, speed) {
var self = Container.call(this);
var bulletGraphics = self.createAsset('heroBullet', 'Spread shot bullet', 0.5, 1);
self.speed = speed;
self.angle = angle;
self.move = function () {
self.x += self.speed * Math.cos(self.angle);
self.y += self.speed * Math.sin(self.angle);
};
});
// Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.createAsset('enemy', 'Enemy character', 0.5, 0.5);
self.baseSpeed = 2;
self.strength = 1;
self.updateSpeed = function (score) {
self.strength = 1 + Math.floor(score / 50);
self.speed = self.baseSpeed * self.strength;
};
self.move = function () {
self.y += self.speed;
};
});
// EnemyBullet class
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.createAsset('enemyBullet', 'Enemy bullet', 0.5, 0);
self.speed = 5;
self.move = function () {
self.y += self.speed;
};
});
// PowerUp class
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.createAsset('powerUp', 'Power up', 0.5, 0.5);
self.type = 'spread'; // Default power-up type
self.speed = 2;
self.move = function () {
self.y += self.speed;
};
self.applyEffect = function (hero) {
// Apply the effect based on power-up type
switch (self.type) {
case 'spread':
hero.enableSpreadShot();
break;
}
};
});
// Joystick class
var Joystick = Container.expand(function () {
var self = Container.call(this);
var joystickGraphics = self.createAsset('joystickBase', 'Joystick base', 0.5, 0.5);
var joystickKnob = self.createAsset('joystickKnob', 'Joystick knob', 0.5, 0.5);
self.addChild(joystickKnob);
self.isDragging = false;
self.startPos = {
x: 0,
y: 0
};
self.currentPos = {
x: 0,
y: 0
};
self.delta = {
x: 0,
y: 0
};
self.on('down', function (obj) {
self.isDragging = true;
self.startPos = obj.event.getLocalPosition(self);
});
self.on('move', function (obj) {
if (self.isDragging) {
self.currentPos = obj.event.getLocalPosition(self);
self.delta.x = self.currentPos.x - self.startPos.x;
self.delta.y = self.currentPos.y - self.startPos.y;
joystickKnob.x = Math.max(-50, Math.min(50, self.delta.x));
joystickKnob.y = Math.max(-50, Math.min(50, self.delta.y));
}
});
self.on('up', function (obj) {
self.isDragging = false;
joystickKnob.x = 0;
joystickKnob.y = 0;
self.delta.x = 0;
self.delta.y = 0;
});
self.getDirection = function () {
return self.delta;
};
});
// ShootButton class
var ShootButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphics = self.createAsset('shootButton', 'Shoot button', 0.5, 0.5);
self.on('down', function () {
hero.shoot();
});
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000,
// Init game with black background
backgroundImage: 'spaceBackground' // Set background image to Space
});
/****
* Game Code
****/
var shootButton = game.addChild(new ShootButton());
shootButton.x = 2048 - 150; // Position from right
shootButton.y = 2732 - 150; // Position from bottom
var joystick = game.addChild(new Joystick());
joystick.x = 150; // Position from left
joystick.y = 2732 - 150; // Position from bottom
// Initialize important asset arrays
var bullets = [];
var enemies = [];
var enemyBullets = [];
var powerUps = []; // Store active power-ups
var score = 0;
var hero = game.addChild(new Hero());
hero.x = 1024; // Center of the screen
hero.y = 2732 - 200; // Near the bottom of the screen
// Score display
var scoreTxt = new Text2('0', {
size: 150,
fill: "#ffffff"
});
// Lives display
var livesTxt = new Text2('Lives: 5', {
size: 100,
fill: "#ffffff"
});
livesTxt.anchor.set(0, 0);
LK.gui.topLeft.addChild(livesTxt);
// Score and Wave display
var scoreAndWaveTxt = new Text2('Score: 0 | Wave: 1', {
size: 100,
fill: "#ffffff"
});
scoreAndWaveTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreAndWaveTxt);
// Game tick event
LK.on('tick', function () {
// Update hero
hero.update();
// Move and check bullets
for (var i = bullets.length - 1; i >= 0; i--) {
bullets[i].move();
if (bullets[i].y < -bullets[i].height) {
bullets[i].destroy();
bullets.splice(i, 1);
} else {
// Check for bullet collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
if (bullets[i].intersects(enemies[j])) {
if (Math.random() < 0.2) {
// 20% chance to drop a power-up
var powerUpTypes = ['spread'];
var powerUp = new PowerUp();
powerUp.type = powerUpTypes[Math.floor(Math.random() * powerUpTypes.length)];
powerUp.x = enemies[j].x;
powerUp.y = enemies[j].y;
game.addChild(powerUp);
powerUps.push(powerUp);
}
enemies[j].destroy();
enemies.splice(j, 1);
bullets[i].destroy();
bullets.splice(i, 1);
score += 10;
scoreTxt.setText(score.toString());
break;
}
}
}
}
// Move and check enemy bullets
for (var k = enemyBullets.length - 1; k >= 0; k--) {
enemyBullets[k].move();
if (enemyBullets[k].y > 2732 + enemyBullets[k].height) {
enemyBullets[k].destroy();
enemyBullets.splice(k, 1);
} else if (enemyBullets[k].intersects(hero)) {
hero.lives--;
if (hero.lives <= 0) {
// Game over condition
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
} else {
// Flash hero red to indicate hit and update lives display
LK.effects.flashObject(hero, 0xff0000, 500);
livesTxt.setText('Lives: ' + hero.lives);
}
enemyBullets[k].destroy();
enemyBullets.splice(k, 1);
}
}
// Move and check power-ups
for (var m = powerUps.length - 1; m >= 0; m--) {
powerUps[m].move();
if (powerUps[m].y > 2732 + powerUps[m].height) {
powerUps[m].destroy();
powerUps.splice(m, 1);
} else if (powerUps[m].intersects(hero)) {
powerUps[m].applyEffect(hero);
powerUps[m].destroy();
powerUps.splice(m, 1);
}
}
// Update hero's power-up timer
hero.updatePowerUpTimer();
// Move enemies, check for collisions with hero, and potentially shoot
for (var l = enemies.length - 1; l >= 0; l--) {
enemies[l].move();
// Check for collision with hero
if (enemies[l].intersects(hero)) {
hero.lives--;
if (hero.lives <= 0) {
// Game over condition
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
} else {
// Flash hero red to indicate hit and update lives display
LK.effects.flashObject(hero, 0xff0000, 500);
livesTxt.setText('Lives: ' + hero.lives);
}
enemies[l].destroy();
enemies.splice(l, 1);
continue;
}
if (Math.random() < 0.005) {
// Random chance to shoot, rate reduced to half
var enemyBullet = new EnemyBullet();
enemyBullet.x = enemies[l].x;
enemyBullet.y = enemies[l].y + enemies[l].height / 2;
game.addChild(enemyBullet);
enemyBullets.push(enemyBullet);
}
}
// Wave system
var waveInterval = 600; // 10 seconds per wave
var enemiesPerWave = 5 + Math.floor(score / 100); // Increase number of enemies per wave based on score
var currentWave = Math.floor(LK.ticks / waveInterval) + 1;
scoreAndWaveTxt.setText('Score: ' + score + ' | Wave: ' + currentWave);
if (LK.ticks % waveInterval == 0) {
var currentWave = Math.floor(LK.ticks / waveInterval) + 1;
for (var i = 0; i < enemiesPerWave; i++) {
var newEnemy;
var enemyCount = 3;
var stingerCount = 7;
for (var i = 0; i < enemiesPerWave; i++) {
if (i % enemyCount === 0) {
// Spawn stingerEnemy
for (var n = 0; n < stingerCount; n++) {
var stingerEnemy = new StingerEnemy();
stingerEnemy.updateSpeed(score);
stingerEnemy.x = 2048 / 8 * (n + 1) - stingerEnemy.width / 2;
stingerEnemy.y = -stingerEnemy.height / 2 - i * stingerEnemy.height * 1.5;
enemies.push(stingerEnemy);
game.addChild(stingerEnemy);
}
} else {
// Spawn normal enemies
var normalEnemy = new Enemy();
normalEnemy.updateSpeed(score);
normalEnemy.x = Math.random() * (2048 - normalEnemy.width) + normalEnemy.width / 2;
normalEnemy.y = -normalEnemy.height / 2 - i * normalEnemy.height;
enemies.push(normalEnemy);
game.addChild(normalEnemy);
}
}
}
}
});
A laser. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A laser bullet. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A plus sign. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A mechanical wasp. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A turret. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.