User prompt
Half the wave counter size
User prompt
Move the Wave: text next to the pause button.
User prompt
Move the Wave: text closer to the pause button.
User prompt
Move the Wave: text next to the pause button.
User prompt
Move the Wave: text to the topright corner of the map
User prompt
Place the Wave: text to the left bottom corner of the map
User prompt
Remove block from the game
User prompt
Remove boss enemy from the game
User prompt
Ensure hero is not shoot from the center of the asset but from the left and right edge of the asset
User prompt
Migrate to the latest version of LK
Remix started
Copy Air Force War (UPDATE 3.5)
/****
* 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));
};