/**** 
* Classes
****/ 
// BackButton class
var BackButton = Container.expand(function () {
	var self = Container.call(this);
	var buttonGraphics = self.attachAsset('backButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		scaleY: 2
	});
	// Add 'Back' text to the button
	var backText = new Text2('Back', {
		size: 50,
		fill: "#ffffff"
	});
	backText.anchor.set(0.5, 0.5);
	self.addChild(backText);
	self.up = function (x, y, obj) {
		var startButton = new StartButton();
		game.addChild(startButton);
		self.destroy();
		var menuPage = game.children.find(function (child) {
			return child instanceof MenuPage;
		});
		if (menuPage) {
			menuPage.destroy();
		}
	};
});
// Enemy class
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		scaleY: 2
	});
	self.speed = 5;
	self.update = function () {
		self.y += self.speed;
		if (self.y > 2732) {
			self.destroy();
		}
	};
});
//<Assets used in the game will automatically appear here>
// Hero class
var Hero = Container.expand(function () {
	var self = Container.call(this);
	var heroGraphics = self.attachAsset('hero', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 3,
		scaleY: 3
	});
	self.speed = 10;
	self.update = function () {
		// Update logic for hero
	};
	self.shoot = function () {
		var bullet = new HeroBullet();
		bullet.x = self.x;
		bullet.y = self.y - heroGraphics.height / 2;
		game.addChild(bullet);
		heroBullets.push(bullet);
		LK.getSound('firingSound').play();
	};
});
// 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 = -15;
	self.update = function () {
		self.y += self.speed;
		if (self.y < 0) {
			self.destroy();
		}
	};
});
// Level class
var Level = Container.expand(function () {
	var self = Container.call(this);
	var levelGraphics = self.attachAsset('level', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 4,
		scaleY: 4
	});
	// Add 'level' text to the button
	var levelText = new Text2('Level ' + currentLevel, {
		// Update the level text to reflect the current level
		size: 50,
		fill: "#ffffff"
	});
	levelText.anchor.set(0.5, 0.5);
	self.addChild(levelText);
	self.x = 2048 / 2;
	self.y = 2732 / 2;
	self.up = function (x, y, obj) {
		initGame();
		currentLevel++; // Increase the level after each level
		self.destroy();
	};
});
// MenuButton class
var MenuButton = Container.expand(function () {
	var self = Container.call(this);
	var buttonGraphics = self.attachAsset('menuButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		scaleY: 2
	});
	// Add 'Menu' text to the button
	var menuText = new Text2('Menu', {
		size: 50,
		fill: "#ffffff"
	});
	menuText.anchor.set(0.5, 0.5);
	self.addChild(menuText);
	self.up = function (x, y, obj) {
		var menuPage = new MenuPage();
		game.addChild(menuPage);
		self.destroy();
	};
});
// MenuPage class
var MenuPage = Container.expand(function () {
	var self = Container.call(this);
	var background = new Container();
	background.width = 2048;
	background.height = 2732;
	background.color = 0x000000;
	self.addChild(background);
	// Add 'Sound' button to the menu page
	var soundButton = new SoundButton();
	soundButton.x = 2048 / 2;
	soundButton.y = 2732 / 2 - 100;
	self.addChild(soundButton);
	// Add 'Back' button to the menu page
	var backButton = new BackButton();
	backButton.x = 2048 / 2;
	backButton.y = 2732 / 2 + 100;
	self.addChild(backButton);
	// Toggle sound on/off
	soundButton.up = function (x, y, obj) {
		if (LK.isMusicPlaying()) {
			LK.stopMusic();
			LK.muteSound();
			soundButton.setText('Sound: Off');
		} else {
			LK.unmuteSound();
			LK.playMusic('backgroundMusic');
			soundButton.setText('Sound: On');
		}
	};
	// Go back to the start button page
	backButton.up = function (x, y, obj) {
		var startButton = new StartButton();
		game.addChild(startButton);
		self.destroy();
	};
});
// SoundButton class
var SoundButton = Container.expand(function () {
	var self = Container.call(this);
	var buttonGraphics = self.attachAsset('menuButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		scaleY: 2
	});
	// Add 'Sound: On' text to the button
	var soundText = new Text2('Sound: On', {
		size: 50,
		fill: "#ffffff"
	});
	soundText.anchor.set(0.5, 0.5);
	self.addChild(soundText);
	self.up = function (x, y, obj) {
		// Toggle sound
		if (LK.isMusicPlaying()) {
			LK.stopMusic();
			LK.muteSound();
			soundText.setText('Sound: Off');
		} else {
			LK.unmuteSound();
			LK.playMusic('backgroundMusic');
			soundText.setText('Sound: On');
		}
	};
});
// StartButton class
var StartButton = Container.expand(function () {
	var self = Container.call(this);
	var buttonGraphics = self.attachAsset('startButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 8,
		scaleY: 8
	});
	// Add 'start' text to the button
	var startText = new Text2('Start', {
		size: 100,
		fill: "#ffffff"
	});
	startText.anchor.set(0.5, 0.5);
	self.addChild(startText);
	self.x = 2048 / 2;
	self.y = 2732 / 2;
	self.up = function (x, y, obj) {
		// Initialize level
		var level = new Level();
		game.addChild(level);
		self.destroy();
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000 //Init game with black background
});
/**** 
* Game Code
****/ 
// Add background image
var background = LK.getAsset('background', {
	anchorX: 0.5,
	anchorY: 0.5,
	scaleX: 2048 / 2048,
	scaleY: 2732 / 2048,
	x: 2048 / 2,
	y: 2732 / 2
});
game.addChildAt(background, 0);
// Initialize variables
var hero;
var enemies = [];
var heroBullets = [];
var score = 0;
var scoreTxt;
var currentLevel = 1; // Add a variable to store the current level
// Initialize game elements
function initGame() {
	hero = new Hero();
	LK.playMusic('backgroundMusic');
	LK.playMusic('backgroundMusic');
	hero.x = 2048 / 2;
	hero.y = 2732 - 200;
	game.addChild(hero);
	// Create a score board at the top of the screen
	scoreTxt = new Text2('Score: 0', {
		size: 150,
		fill: "#ffffff"
	});
	// Initialize menu button
	var menuButton = new MenuButton();
	menuButton.x = 2048 - 100; // Position it at the top right corner
	menuButton.y = 100; // A little bit down from the top edge
	game.addChild(menuButton);
	menuButton.up = function (x, y, obj) {
		var menuPage = new MenuPage();
		game.addChild(menuPage);
		menuButton.destroy();
	};
	scoreTxt.anchor.set(0.5, 0);
	LK.gui.top.addChild(scoreTxt);
	// Create a board to display the score
	var scoreBoard = new Container();
	scoreBoard.x = 2048 / 2;
	scoreBoard.y = 2732 / 2;
	game.addChild(scoreBoard);
	// Add the score text to the score board
	scoreBoard.addChild(scoreTxt);
	// Create a variable to store the score target for each level and increase it after each level
	var scoreTarget = currentLevel * 10 + currentLevel; // For example, the score target for each level could be 10 times the current level plus the current level
	// Spawn enemies at intervals
	LK.setInterval(function () {
		var enemy = new Enemy();
		enemy.x = Math.random() * 2048;
		enemy.y = -100;
		game.addChild(enemy);
		enemies.push(enemy);
	}, 970 / (currentLevel * 1.96)); // Decrease the spawn rate and speed with each level by 4 percent
}
// Update game state
game.update = function () {
	if (hero) {
		hero.update();
	}
	for (var i = enemies.length - 1; i >= 0; i--) {
		enemies[i].update();
		if (enemies[i].intersects(hero)) {
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
		}
	}
	for (var j = heroBullets.length - 1; j >= 0; j--) {
		heroBullets[j].update();
		for (var k = enemies.length - 1; k >= 0; k--) {
			if (heroBullets[j].intersects(enemies[k])) {
				enemies[k].destroy();
				enemies.splice(k, 1);
				heroBullets[j].destroy();
				heroBullets.splice(j, 1);
				score++;
				scoreTxt.setText('Score: ' + score);
				// Check if the score has reached the target for the current level
				if (score >= scoreTarget) {
					// If so, move to the next level
					currentLevel++;
					// Show the level page
					var level = new Level();
					game.addChild(level);
					// Increase game difficulty by 1.5 percent when player score reaches 20 and by 2 times when score reaches 40
					if (score == 20) {
						currentLevel += currentLevel * 0.015;
					} else if (score == 40) {
						currentLevel *= 2;
					}
				}
				break;
			}
		}
	}
};
// Handle touch events
game.down = function (x, y, obj) {
	if (hero) {
		hero.shoot();
	}
	hero.x = x;
};
// Handle keyboard events
game.on('keydown', function (event) {
	switch (event.key) {
		case ' ':
			if (hero) {
				hero.shoot();
			}
			break;
		case 'a':
			if (hero) {
				hero.x -= hero.speed;
			}
			break;
		case 'd':
			if (hero) {
				hero.x += hero.speed;
			}
			break;
	}
});
// Initialize start button
var startButton = new StartButton();
game.addChild(startButton); /**** 
* Classes
****/ 
// BackButton class
var BackButton = Container.expand(function () {
	var self = Container.call(this);
	var buttonGraphics = self.attachAsset('backButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		scaleY: 2
	});
	// Add 'Back' text to the button
	var backText = new Text2('Back', {
		size: 50,
		fill: "#ffffff"
	});
	backText.anchor.set(0.5, 0.5);
	self.addChild(backText);
	self.up = function (x, y, obj) {
		var startButton = new StartButton();
		game.addChild(startButton);
		self.destroy();
		var menuPage = game.children.find(function (child) {
			return child instanceof MenuPage;
		});
		if (menuPage) {
			menuPage.destroy();
		}
	};
});
// Enemy class
var Enemy = Container.expand(function () {
	var self = Container.call(this);
	var enemyGraphics = self.attachAsset('enemy', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		scaleY: 2
	});
	self.speed = 5;
	self.update = function () {
		self.y += self.speed;
		if (self.y > 2732) {
			self.destroy();
		}
	};
});
//<Assets used in the game will automatically appear here>
// Hero class
var Hero = Container.expand(function () {
	var self = Container.call(this);
	var heroGraphics = self.attachAsset('hero', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 3,
		scaleY: 3
	});
	self.speed = 10;
	self.update = function () {
		// Update logic for hero
	};
	self.shoot = function () {
		var bullet = new HeroBullet();
		bullet.x = self.x;
		bullet.y = self.y - heroGraphics.height / 2;
		game.addChild(bullet);
		heroBullets.push(bullet);
		LK.getSound('firingSound').play();
	};
});
// 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 = -15;
	self.update = function () {
		self.y += self.speed;
		if (self.y < 0) {
			self.destroy();
		}
	};
});
// Level class
var Level = Container.expand(function () {
	var self = Container.call(this);
	var levelGraphics = self.attachAsset('level', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 4,
		scaleY: 4
	});
	// Add 'level' text to the button
	var levelText = new Text2('Level ' + currentLevel, {
		// Update the level text to reflect the current level
		size: 50,
		fill: "#ffffff"
	});
	levelText.anchor.set(0.5, 0.5);
	self.addChild(levelText);
	self.x = 2048 / 2;
	self.y = 2732 / 2;
	self.up = function (x, y, obj) {
		initGame();
		currentLevel++; // Increase the level after each level
		self.destroy();
	};
});
// MenuButton class
var MenuButton = Container.expand(function () {
	var self = Container.call(this);
	var buttonGraphics = self.attachAsset('menuButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		scaleY: 2
	});
	// Add 'Menu' text to the button
	var menuText = new Text2('Menu', {
		size: 50,
		fill: "#ffffff"
	});
	menuText.anchor.set(0.5, 0.5);
	self.addChild(menuText);
	self.up = function (x, y, obj) {
		var menuPage = new MenuPage();
		game.addChild(menuPage);
		self.destroy();
	};
});
// MenuPage class
var MenuPage = Container.expand(function () {
	var self = Container.call(this);
	var background = new Container();
	background.width = 2048;
	background.height = 2732;
	background.color = 0x000000;
	self.addChild(background);
	// Add 'Sound' button to the menu page
	var soundButton = new SoundButton();
	soundButton.x = 2048 / 2;
	soundButton.y = 2732 / 2 - 100;
	self.addChild(soundButton);
	// Add 'Back' button to the menu page
	var backButton = new BackButton();
	backButton.x = 2048 / 2;
	backButton.y = 2732 / 2 + 100;
	self.addChild(backButton);
	// Toggle sound on/off
	soundButton.up = function (x, y, obj) {
		if (LK.isMusicPlaying()) {
			LK.stopMusic();
			LK.muteSound();
			soundButton.setText('Sound: Off');
		} else {
			LK.unmuteSound();
			LK.playMusic('backgroundMusic');
			soundButton.setText('Sound: On');
		}
	};
	// Go back to the start button page
	backButton.up = function (x, y, obj) {
		var startButton = new StartButton();
		game.addChild(startButton);
		self.destroy();
	};
});
// SoundButton class
var SoundButton = Container.expand(function () {
	var self = Container.call(this);
	var buttonGraphics = self.attachAsset('menuButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 2,
		scaleY: 2
	});
	// Add 'Sound: On' text to the button
	var soundText = new Text2('Sound: On', {
		size: 50,
		fill: "#ffffff"
	});
	soundText.anchor.set(0.5, 0.5);
	self.addChild(soundText);
	self.up = function (x, y, obj) {
		// Toggle sound
		if (LK.isMusicPlaying()) {
			LK.stopMusic();
			LK.muteSound();
			soundText.setText('Sound: Off');
		} else {
			LK.unmuteSound();
			LK.playMusic('backgroundMusic');
			soundText.setText('Sound: On');
		}
	};
});
// StartButton class
var StartButton = Container.expand(function () {
	var self = Container.call(this);
	var buttonGraphics = self.attachAsset('startButton', {
		anchorX: 0.5,
		anchorY: 0.5,
		scaleX: 8,
		scaleY: 8
	});
	// Add 'start' text to the button
	var startText = new Text2('Start', {
		size: 100,
		fill: "#ffffff"
	});
	startText.anchor.set(0.5, 0.5);
	self.addChild(startText);
	self.x = 2048 / 2;
	self.y = 2732 / 2;
	self.up = function (x, y, obj) {
		// Initialize level
		var level = new Level();
		game.addChild(level);
		self.destroy();
	};
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x000000 //Init game with black background
});
/**** 
* Game Code
****/ 
// Add background image
var background = LK.getAsset('background', {
	anchorX: 0.5,
	anchorY: 0.5,
	scaleX: 2048 / 2048,
	scaleY: 2732 / 2048,
	x: 2048 / 2,
	y: 2732 / 2
});
game.addChildAt(background, 0);
// Initialize variables
var hero;
var enemies = [];
var heroBullets = [];
var score = 0;
var scoreTxt;
var currentLevel = 1; // Add a variable to store the current level
// Initialize game elements
function initGame() {
	hero = new Hero();
	LK.playMusic('backgroundMusic');
	LK.playMusic('backgroundMusic');
	hero.x = 2048 / 2;
	hero.y = 2732 - 200;
	game.addChild(hero);
	// Create a score board at the top of the screen
	scoreTxt = new Text2('Score: 0', {
		size: 150,
		fill: "#ffffff"
	});
	// Initialize menu button
	var menuButton = new MenuButton();
	menuButton.x = 2048 - 100; // Position it at the top right corner
	menuButton.y = 100; // A little bit down from the top edge
	game.addChild(menuButton);
	menuButton.up = function (x, y, obj) {
		var menuPage = new MenuPage();
		game.addChild(menuPage);
		menuButton.destroy();
	};
	scoreTxt.anchor.set(0.5, 0);
	LK.gui.top.addChild(scoreTxt);
	// Create a board to display the score
	var scoreBoard = new Container();
	scoreBoard.x = 2048 / 2;
	scoreBoard.y = 2732 / 2;
	game.addChild(scoreBoard);
	// Add the score text to the score board
	scoreBoard.addChild(scoreTxt);
	// Create a variable to store the score target for each level and increase it after each level
	var scoreTarget = currentLevel * 10 + currentLevel; // For example, the score target for each level could be 10 times the current level plus the current level
	// Spawn enemies at intervals
	LK.setInterval(function () {
		var enemy = new Enemy();
		enemy.x = Math.random() * 2048;
		enemy.y = -100;
		game.addChild(enemy);
		enemies.push(enemy);
	}, 970 / (currentLevel * 1.96)); // Decrease the spawn rate and speed with each level by 4 percent
}
// Update game state
game.update = function () {
	if (hero) {
		hero.update();
	}
	for (var i = enemies.length - 1; i >= 0; i--) {
		enemies[i].update();
		if (enemies[i].intersects(hero)) {
			LK.effects.flashScreen(0xff0000, 1000);
			LK.showGameOver();
		}
	}
	for (var j = heroBullets.length - 1; j >= 0; j--) {
		heroBullets[j].update();
		for (var k = enemies.length - 1; k >= 0; k--) {
			if (heroBullets[j].intersects(enemies[k])) {
				enemies[k].destroy();
				enemies.splice(k, 1);
				heroBullets[j].destroy();
				heroBullets.splice(j, 1);
				score++;
				scoreTxt.setText('Score: ' + score);
				// Check if the score has reached the target for the current level
				if (score >= scoreTarget) {
					// If so, move to the next level
					currentLevel++;
					// Show the level page
					var level = new Level();
					game.addChild(level);
					// Increase game difficulty by 1.5 percent when player score reaches 20 and by 2 times when score reaches 40
					if (score == 20) {
						currentLevel += currentLevel * 0.015;
					} else if (score == 40) {
						currentLevel *= 2;
					}
				}
				break;
			}
		}
	}
};
// Handle touch events
game.down = function (x, y, obj) {
	if (hero) {
		hero.shoot();
	}
	hero.x = x;
};
// Handle keyboard events
game.on('keydown', function (event) {
	switch (event.key) {
		case ' ':
			if (hero) {
				hero.shoot();
			}
			break;
		case 'a':
			if (hero) {
				hero.x -= hero.speed;
			}
			break;
		case 'd':
			if (hero) {
				hero.x += hero.speed;
			}
			break;
	}
});
// Initialize start button
var startButton = new StartButton();
game.addChild(startButton);
 make a fighter jet. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
 make fighter jets bullets. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
 make a level logo. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
 make a space type background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
 make a menu button logo. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
 make a start button logo. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
 make a back button logo. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.