/****
* 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));
};