/**** * Classes ****/ var Star = Container.expand(function () { var self = Container.call(this); var starGraphics = self.attachAsset('whiteStar', { anchorX: 0.5, anchorY: 0.5 }); // Set a random scale for the star to vary its size var scale = Math.random() * 0.5 + 0.5; self.scaleX = scale; self.scaleY = scale; // Set a random alpha for the star to vary its brightness self.alpha = Math.random() * 0.5 + 0.5; // Set a random speed for the star to move downwards self.speed = Math.random() * 1 + 0.5; self.move = function () { self.y += self.speed; // Reset star position if it moves off screen if (self.y > 2732) { self.y = -10; self.x = Math.random() * 2048; } }; }); // Define the Hero class var Hero = Container.expand(function () { var self = Container.call(this); var heroGraphics = self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); self.health = 5; // Player must be hit 5 times before dying self.shootInterval = 27; // 0.45 seconds at 60FPS self.lastShotTick = 0; self.update = function () { if (LK.ticks - self.lastShotTick >= self.shootInterval) { this.shoot(); self.lastShotTick = LK.ticks; } self.setColor = function (color) { heroGraphics.tint = color; // Change the tint of the hero }; // Hero update logic }; self.shoot = function () { var bullet = new HeroBullet(); bullet.x = this.x; bullet.y = this.y - 50; // Adjust bullet start position heroBullets.push(bullet); game.addChild(bullet); }; }); // Define the Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); // Initialize health for enemy to take 2 hits self.health = 2; // Initialize direction and speed for structured movement self.directionX = Math.random() < 0.5 ? -1 : 1; self.directionY = Math.random() < 0.5 ? -1 : 1; self.speed = 5; self.update = function () { self.x += self.directionX * self.speed; self.y += self.directionY * self.speed; // Reverse direction when hitting the screen boundaries if (self.x <= 100 || self.x >= 1948) { self.directionX *= -1; } if (self.y <= 100 || self.y >= 2732 / 2 - 100) { self.directionY *= -1; } }; }); // Define the HeroBullet class var HeroBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('heroBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -10; self.move = function () { self.y += self.speed; }; }); // Define the EnemyBullet class var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.move = function () { self.y += self.speed; }; }); // Define the BossEnemy class var BossEnemy = Container.expand(function () { var self = Container.call(this); var bossGraphics = self.attachAsset('bossEnemy', { anchorX: 0.5, anchorY: 0.5 }); // Initialize boss-specific properties self.health = 50; // Boss has more health self.speed = 2; // Boss moves slower self.shootInterval = 21; // Boss shoots every 0.35 seconds at 60FPS self.lastShotTick = 0; // Track the last shot tick // Initialize direction for structured movement self.directionX = Math.random() < 0.5 ? -1 : 1; self.directionY = Math.random() < 0.5 ? -1 : 1; self.update = function () { // Boss update logic with structured movement self.x += self.directionX * self.speed; self.y += self.directionY * self.speed; // Reverse direction when hitting the screen boundaries if (self.x <= 100 || self.x >= 1948) { self.directionX *= -1; } if (self.y <= 100 || self.y >= 2732 / 2 - 100) { self.directionY *= -1; } // Boss specific logic for shooting self.shoot(); }; self.shoot = function () { if (LK.ticks - self.lastShotTick >= self.shootInterval) { var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = self.y + 50; // Adjust bullet start position enemyBullets.push(bullet); game.addChild(bullet); self.lastShotTick = LK.ticks; } }; }); var WaveManager = Container.expand(function () { var self = Container.call(this); self.waveCount = 0; self.enemiesPerWave = 5; self.enemies = []; self.createWave = function () { if ((self.waveCount + 1) % 5 === 0) { // Every 5 waves, spawn a BossEnemy instead of regular enemies var bossEnemy = game.addChild(new BossEnemy()); bossEnemy.x = 2048 / 2; // Start in the middle of the screen bossEnemy.y = 2732 / 4; // Start in the upper part of the screen self.enemies.push(bossEnemy); } else { // Other waves: Spawn regular enemies for (var i = 0; i < self.enemiesPerWave; i++) { var enemy = game.addChild(new Enemy()); enemy.x = Math.random() * (2048 - 100) + 50; enemy.y = Math.random() * (2732 / 2 - 200) + 100; self.enemies.push(enemy); } } self.waveCount++; waveCounterTxt.setText('Wave: ' + (self.waveCount + 1)); }; }); // Define the Block class var Block = Container.expand(function () { var self = Container.call(this); var blockGraphics = self.attachAsset('block', { anchorX: 0.5, anchorY: 0.5 }); }); // Define the ArrowSelector class var ArrowSelector = Container.expand(function () { var self = Container.call(this); var colors = [0x4fd54a, 0xff0000, 0x0000ff, 0xffff00]; // Array of colors to choose from var currentColorIndex = 0; // Start with the first color var leftArrow = self.attachAsset('block', { width: 50, height: 100, color: 0x777777, anchorX: 0.5, anchorY: 0.5 }); var rightArrow = self.attachAsset('block', { width: 50, height: 100, color: 0x777777, anchorX: 0.5, anchorY: 0.5 }); leftArrow.x = 100; // Position left arrow leftArrow.y = 2732 - 200; // Position at the bottom of the screen rightArrow.x = 2048 - 100; // Position right arrow rightArrow.y = 2732 - 200; // Position at the bottom of the screen leftArrow.on('down', function () { currentColorIndex--; if (currentColorIndex < 0) { currentColorIndex = colors.length - 1; } hero.setColor(colors[currentColorIndex]); // Update hero color to the left updateHeroColorText(colors[currentColorIndex]); // Update the text displaying the hero's color }); rightArrow.on('down', function () { currentColorIndex++; if (currentColorIndex >= colors.length) { currentColorIndex = 0; } hero.setColor(colors[currentColorIndex]); // Update hero color to the right updateHeroColorText(colors[currentColorIndex]); // Update the text displaying the hero's color }); self.addChild(leftArrow); self.addChild(rightArrow); }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 // Init game with black background }); /**** * Game Code ****/ var colorSelector = game.addChild(new ArrowSelector()); var stars = []; for (var i = 0; i < 100; i++) { var star = new Star(); star.x = Math.random() * 2048; star.y = Math.random() * 2732; stars.push(star); game.addChild(star); } // Update the stars in the game tick event LK.on('tick', function () { for (var i = 0; i < stars.length; i++) { stars[i].move(); } // Existing game tick code... }); var waveManager = game.addChild(new WaveManager()); var waveCounterTxt = new Text2('Wave: 0', { size: 100, fill: "#ffffff" }); LK.gui.top.addChild(waveCounterTxt); waveManager.createWave(); // Define assets for the game // Initialize game elements var hero = game.addChild(new Hero()); hero.x = 2048 / 2; hero.y = 2732 - 150; var enemies = []; var heroBullets = []; var enemyBullets = []; var blocks = []; // Game tick event LK.on('tick', function () { // Update hero hero.update(); // Update enemies for (var i = 0; i < waveManager.enemies.length; i++) { waveManager.enemies[i].update(); } // Move hero bullets and check for collisions with enemies for (var i = heroBullets.length - 1; i >= 0; i--) { var bullet = heroBullets[i]; bullet.move(); // Check for bullet collision with enemies or off-screen for (var j = waveManager.enemies.length - 1; j >= 0; j--) { if (bullet.intersects(waveManager.enemies[j])) { // Decrease enemy health and check if it should be destroyed waveManager.enemies[j].health--; LK.effects.flashObject(waveManager.enemies[j], 0xff0000, 500); if (waveManager.enemies[j].health <= 0) { waveManager.enemies[j].destroy(); waveManager.enemies.splice(j, 1); } bullet.destroy(); heroBullets.splice(i, 1); break; } } if (bullet.y < 0) { bullet.destroy(); heroBullets.splice(i, 1); } } // Check if all enemies are defeated to create a new wave if (waveManager.enemies.length === 0) { waveManager.createWave(); } // Enemy shooting logic if (LK.ticks % 120 == 0) { waveManager.enemies.forEach(function (enemy) { var bullet = new EnemyBullet(); bullet.x = enemy.x; bullet.y = enemy.y; enemyBullets.push(bullet); game.addChild(bullet); }); } // Move enemy bullets and check for collisions for (var i = enemyBullets.length - 1; i >= 0; i--) { var bullet = enemyBullets[i]; bullet.move(); // Check for bullet collision with hero or off-screen if (bullet.intersects(hero)) { hero.health -= 1; // Decrease hero's health by one LK.effects.flashObject(hero, 0xff0000, 500); bullet.destroy(); enemyBullets.splice(i, 1); if (hero.health <= 0) { // Game over logic LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } if (bullet.y > 2732) { bullet.destroy(); enemyBullets.splice(i, 1); } } }); // Touch event handling for hero movement and shooting game.on('down', function (obj) { var pos = obj.event.getLocalPosition(game); hero.x = pos.x; }); var heroColorText = new Text2('', { size: 50, fill: "#ffffff", x: 2048 / 2, y: 2732 - 100 }); LK.gui.bottom.addChild(heroColorText); function updateHeroColorText(color) { var colorName = { 0x4fd54a: 'Green', 0xff0000: 'Red', 0x0000ff: 'Blue', 0xffff00: 'Yellow' }; heroColorText.setText('Hero Color: ' + colorName[color]); } // Create a hero bullet when the hero shoots Hero.prototype.shoot = function () { var bullet = new HeroBullet(); bullet.x = this.x; bullet.y = this.y - 50; // Adjust bullet start position heroBullets.push(bullet); game.addChild(bullet); }; // Update the hero's position based on touch movement game.on('move', function (obj) { var pos = obj.event.getLocalPosition(game); hero.x = pos.x; }); // Ensure the hero stays within the game boundaries Hero.prototype.update = function () { this.x = Math.max(50, Math.min(this.x, 2048 - 50)); };
/****
* Classes
****/
var Star = Container.expand(function () {
var self = Container.call(this);
var starGraphics = self.attachAsset('whiteStar', {
anchorX: 0.5,
anchorY: 0.5
});
// Set a random scale for the star to vary its size
var scale = Math.random() * 0.5 + 0.5;
self.scaleX = scale;
self.scaleY = scale;
// Set a random alpha for the star to vary its brightness
self.alpha = Math.random() * 0.5 + 0.5;
// Set a random speed for the star to move downwards
self.speed = Math.random() * 1 + 0.5;
self.move = function () {
self.y += self.speed;
// Reset star position if it moves off screen
if (self.y > 2732) {
self.y = -10;
self.x = Math.random() * 2048;
}
};
});
// Define the Hero class
var Hero = Container.expand(function () {
var self = Container.call(this);
var heroGraphics = self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 5; // Player must be hit 5 times before dying
self.shootInterval = 27; // 0.45 seconds at 60FPS
self.lastShotTick = 0;
self.update = function () {
if (LK.ticks - self.lastShotTick >= self.shootInterval) {
this.shoot();
self.lastShotTick = LK.ticks;
}
self.setColor = function (color) {
heroGraphics.tint = color; // Change the tint of the hero
};
// Hero update logic
};
self.shoot = function () {
var bullet = new HeroBullet();
bullet.x = this.x;
bullet.y = this.y - 50; // Adjust bullet start position
heroBullets.push(bullet);
game.addChild(bullet);
};
});
// Define the Enemy class
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Initialize health for enemy to take 2 hits
self.health = 2;
// Initialize direction and speed for structured movement
self.directionX = Math.random() < 0.5 ? -1 : 1;
self.directionY = Math.random() < 0.5 ? -1 : 1;
self.speed = 5;
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
// Reverse direction when hitting the screen boundaries
if (self.x <= 100 || self.x >= 1948) {
self.directionX *= -1;
}
if (self.y <= 100 || self.y >= 2732 / 2 - 100) {
self.directionY *= -1;
}
};
});
// Define the HeroBullet class
var HeroBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('heroBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -10;
self.move = function () {
self.y += self.speed;
};
});
// Define the EnemyBullet class
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.move = function () {
self.y += self.speed;
};
});
// Define the BossEnemy class
var BossEnemy = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('bossEnemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Initialize boss-specific properties
self.health = 50; // Boss has more health
self.speed = 2; // Boss moves slower
self.shootInterval = 21; // Boss shoots every 0.35 seconds at 60FPS
self.lastShotTick = 0; // Track the last shot tick
// Initialize direction for structured movement
self.directionX = Math.random() < 0.5 ? -1 : 1;
self.directionY = Math.random() < 0.5 ? -1 : 1;
self.update = function () {
// Boss update logic with structured movement
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
// Reverse direction when hitting the screen boundaries
if (self.x <= 100 || self.x >= 1948) {
self.directionX *= -1;
}
if (self.y <= 100 || self.y >= 2732 / 2 - 100) {
self.directionY *= -1;
}
// Boss specific logic for shooting
self.shoot();
};
self.shoot = function () {
if (LK.ticks - self.lastShotTick >= self.shootInterval) {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 50; // Adjust bullet start position
enemyBullets.push(bullet);
game.addChild(bullet);
self.lastShotTick = LK.ticks;
}
};
});
var WaveManager = Container.expand(function () {
var self = Container.call(this);
self.waveCount = 0;
self.enemiesPerWave = 5;
self.enemies = [];
self.createWave = function () {
if ((self.waveCount + 1) % 5 === 0) {
// Every 5 waves, spawn a BossEnemy instead of regular enemies
var bossEnemy = game.addChild(new BossEnemy());
bossEnemy.x = 2048 / 2; // Start in the middle of the screen
bossEnemy.y = 2732 / 4; // Start in the upper part of the screen
self.enemies.push(bossEnemy);
} else {
// Other waves: Spawn regular enemies
for (var i = 0; i < self.enemiesPerWave; i++) {
var enemy = game.addChild(new Enemy());
enemy.x = Math.random() * (2048 - 100) + 50;
enemy.y = Math.random() * (2732 / 2 - 200) + 100;
self.enemies.push(enemy);
}
}
self.waveCount++;
waveCounterTxt.setText('Wave: ' + (self.waveCount + 1));
};
});
// Define the Block class
var Block = Container.expand(function () {
var self = Container.call(this);
var blockGraphics = self.attachAsset('block', {
anchorX: 0.5,
anchorY: 0.5
});
});
// Define the ArrowSelector class
var ArrowSelector = Container.expand(function () {
var self = Container.call(this);
var colors = [0x4fd54a, 0xff0000, 0x0000ff, 0xffff00]; // Array of colors to choose from
var currentColorIndex = 0; // Start with the first color
var leftArrow = self.attachAsset('block', {
width: 50,
height: 100,
color: 0x777777,
anchorX: 0.5,
anchorY: 0.5
});
var rightArrow = self.attachAsset('block', {
width: 50,
height: 100,
color: 0x777777,
anchorX: 0.5,
anchorY: 0.5
});
leftArrow.x = 100; // Position left arrow
leftArrow.y = 2732 - 200; // Position at the bottom of the screen
rightArrow.x = 2048 - 100; // Position right arrow
rightArrow.y = 2732 - 200; // Position at the bottom of the screen
leftArrow.on('down', function () {
currentColorIndex--;
if (currentColorIndex < 0) {
currentColorIndex = colors.length - 1;
}
hero.setColor(colors[currentColorIndex]); // Update hero color to the left
updateHeroColorText(colors[currentColorIndex]); // Update the text displaying the hero's color
});
rightArrow.on('down', function () {
currentColorIndex++;
if (currentColorIndex >= colors.length) {
currentColorIndex = 0;
}
hero.setColor(colors[currentColorIndex]); // Update hero color to the right
updateHeroColorText(colors[currentColorIndex]); // Update the text displaying the hero's color
});
self.addChild(leftArrow);
self.addChild(rightArrow);
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
var colorSelector = game.addChild(new ArrowSelector());
var stars = [];
for (var i = 0; i < 100; i++) {
var star = new Star();
star.x = Math.random() * 2048;
star.y = Math.random() * 2732;
stars.push(star);
game.addChild(star);
}
// Update the stars in the game tick event
LK.on('tick', function () {
for (var i = 0; i < stars.length; i++) {
stars[i].move();
}
// Existing game tick code...
});
var waveManager = game.addChild(new WaveManager());
var waveCounterTxt = new Text2('Wave: 0', {
size: 100,
fill: "#ffffff"
});
LK.gui.top.addChild(waveCounterTxt);
waveManager.createWave();
// Define assets for the game
// Initialize game elements
var hero = game.addChild(new Hero());
hero.x = 2048 / 2;
hero.y = 2732 - 150;
var enemies = [];
var heroBullets = [];
var enemyBullets = [];
var blocks = [];
// Game tick event
LK.on('tick', function () {
// Update hero
hero.update();
// Update enemies
for (var i = 0; i < waveManager.enemies.length; i++) {
waveManager.enemies[i].update();
}
// Move hero bullets and check for collisions with enemies
for (var i = heroBullets.length - 1; i >= 0; i--) {
var bullet = heroBullets[i];
bullet.move();
// Check for bullet collision with enemies or off-screen
for (var j = waveManager.enemies.length - 1; j >= 0; j--) {
if (bullet.intersects(waveManager.enemies[j])) {
// Decrease enemy health and check if it should be destroyed
waveManager.enemies[j].health--;
LK.effects.flashObject(waveManager.enemies[j], 0xff0000, 500);
if (waveManager.enemies[j].health <= 0) {
waveManager.enemies[j].destroy();
waveManager.enemies.splice(j, 1);
}
bullet.destroy();
heroBullets.splice(i, 1);
break;
}
}
if (bullet.y < 0) {
bullet.destroy();
heroBullets.splice(i, 1);
}
}
// Check if all enemies are defeated to create a new wave
if (waveManager.enemies.length === 0) {
waveManager.createWave();
}
// Enemy shooting logic
if (LK.ticks % 120 == 0) {
waveManager.enemies.forEach(function (enemy) {
var bullet = new EnemyBullet();
bullet.x = enemy.x;
bullet.y = enemy.y;
enemyBullets.push(bullet);
game.addChild(bullet);
});
}
// Move enemy bullets and check for collisions
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
bullet.move();
// Check for bullet collision with hero or off-screen
if (bullet.intersects(hero)) {
hero.health -= 1; // Decrease hero's health by one
LK.effects.flashObject(hero, 0xff0000, 500);
bullet.destroy();
enemyBullets.splice(i, 1);
if (hero.health <= 0) {
// Game over logic
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
}
if (bullet.y > 2732) {
bullet.destroy();
enemyBullets.splice(i, 1);
}
}
});
// Touch event handling for hero movement and shooting
game.on('down', function (obj) {
var pos = obj.event.getLocalPosition(game);
hero.x = pos.x;
});
var heroColorText = new Text2('', {
size: 50,
fill: "#ffffff",
x: 2048 / 2,
y: 2732 - 100
});
LK.gui.bottom.addChild(heroColorText);
function updateHeroColorText(color) {
var colorName = {
0x4fd54a: 'Green',
0xff0000: 'Red',
0x0000ff: 'Blue',
0xffff00: 'Yellow'
};
heroColorText.setText('Hero Color: ' + colorName[color]);
}
// Create a hero bullet when the hero shoots
Hero.prototype.shoot = function () {
var bullet = new HeroBullet();
bullet.x = this.x;
bullet.y = this.y - 50; // Adjust bullet start position
heroBullets.push(bullet);
game.addChild(bullet);
};
// Update the hero's position based on touch movement
game.on('move', function (obj) {
var pos = obj.event.getLocalPosition(game);
hero.x = pos.x;
});
// Ensure the hero stays within the game boundaries
Hero.prototype.update = function () {
this.x = Math.max(50, Math.min(this.x, 2048 - 50));
};