/**** 
* Classes
****/
// 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 = 9;
	self.jumpPower = -18;
	self.gravity = 0.5;
	self.isJumping = false;
	self.velocityY = 0;
	self.update = function () {
		// Apply gravity
		if (self.isJumping || self.isFalling) {
			self.velocityY += self.gravity;
			self.y += self.velocityY;
			if (self.y > game.height - heroGraphics.height / 2) {
				self.isJumping = false;
				self.isFalling = false;
				self.jumpCount = 0;
				self.y = game.height - heroGraphics.height / 2;
			}
		}
		self.isFalling = false;
	};
	self.jumpCount = 0;
	self.maxJumps = 2;
	self.isFalling = false;
	self.jump = function () {
		if (self.jumpCount < self.maxJumps) {
			self.jumpCount++;
			self.isJumping = true;
			self.velocityY = self.jumpPower;
		}
	};
	self.fallQuickly = function () {
		self.isFalling = true;
		self.velocityY = self.gravity * 50;
	};
});
// Obstacle class
var Obstacle = Container.expand(function () {
	var self = Container.call(this);
	var obstacleGraphics = self.createAsset('obstacle', 'Obstacle', 0.5, 1);
	self.speed = -10;
	self.move = function () {
		self.x += self.speed;
	};
});
// Bullet class
var HeroBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.createAsset('heroBullet', 'Hero Bullet', 0.5, 0.5);
	bulletGraphics.scale.set(1 / 5);
	self.speed = 15;
	self.move = function () {
		self.x += self.speed;
		if (self.x > game.width) {
			self.destroy();
		}
	};
	self.checkCollisionWithObstacles = function (obstacles) {
		for (var i = obstacles.length - 1; i >= 0; i--) {
			if (self.intersects(obstacles[i])) {
				obstacles[i].destroy();
				obstacles.splice(i, 1);
				self.destroy();
				break;
			}
		}
	};
});
/**** 
* Initialize Game
****/
var game = new LK.Game({
	backgroundColor: 0x000000 // Init game with black background
});
/**** 
* Game Code
****/
// Initialize hero
var hero = game.addChild(new Hero());
hero.x = game.width / 4;
hero.y = game.height - hero.height / 2;
// Initialize hero bullets array
var heroBullets = [];
// Initialize obstacles array
var obstacles = [];
// Initialize score
var score = 0;
var scoreTxt = new Text2(score.toString(), {
	size: 150,
	fill: "#ffffff"
}); // Create shoot button
var shootButton = game.addChild(LK.getAsset('shootButton', 'Shoot Button', 1, 1));
shootButton.scale.set(5);
shootButton.x = game.width - shootButton.width * shootButton.scale.x / 2;
shootButton.y = game.height - shootButton.height * shootButton.scale.y / 2;
var canShoot = true;
shootButton.on('down', function (obj) {
	if (canShoot) {
		canShoot = false;
		var newBullet = new HeroBullet();
		newBullet.x = hero.x + hero.width / 2;
		newBullet.y = hero.y;
		heroBullets.push(newBullet);
		game.addChild(newBullet);
		LK.setTimeout(function () {
			canShoot = true;
		}, 300);
	}
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Game tick event
LK.on('tick', function () {
	// Update hero
	hero.update();
	// Move and check obstacles
	for (var i = obstacles.length - 1; i >= 0; i--) {
		obstacles[i].move();
		// Check for collision with hero
		if (hero.intersects(obstacles[i])) {
			// Check if hero jumps on top of the obstacle
			if (hero.y + hero.height / 2 <= obstacles[i].y - obstacles[i].height / 2 && hero.velocityY > 0) {
				// Remove the obstacle if jumped on top
				obstacles[i].destroy();
				obstacles.splice(i, 1);
			} else {
				// Game over if collided from the side
				LK.effects.flashScreen(0xff0000, 1000);
				LK.showGameOver();
				return;
			}
		}
		// Remove off-screen obstacles
		if (obstacles[i].x < -obstacles[i].width) {
			obstacles[i].destroy();
			obstacles.splice(i, 1);
		}
	}
	// Move and check collisions for hero bullets
	for (var b = heroBullets.length - 1; b >= 0; b--) {
		heroBullets[b].move();
		heroBullets[b].checkCollisionWithObstacles(obstacles);
		// Remove bullets that are off-screen or destroyed
		if (!heroBullets[b].parent) {
			heroBullets.splice(b, 1);
		}
	}
	// Increment score
	score++;
	scoreTxt.setText(score.toString());
	// Add new obstacles
	if (LK.ticks % 100 == 0) {
		var obstacle = new Obstacle();
		obstacle.x = game.width;
		obstacle.y = game.height;
		obstacles.push(obstacle);
		game.addChild(obstacle);
	}
});
// Prepare for swipe detection
var swipeStart = null;
var swipeThreshold = 50; // Minimum distance for a swipe to count
// Touch start event to record the start position of a swipe
game.on('down', function (obj) {
	var event = obj.event;
	swipeStart = event.getLocalPosition(game);
});
// Touch end event to detect a swipe
game.on('up', function (obj) {
	var event = obj.event;
	var swipeEnd = event.getLocalPosition(game);
	if (swipeStart) {
		if (Math.abs(swipeEnd.y - swipeStart.y) > swipeThreshold) {
			if (swipeStart.y > swipeEnd.y) {
				hero.jump();
			} else if (swipeStart.y < swipeEnd.y) {
				hero.fallQuickly();
			}
		}
	}
	swipeStart = null; // Reset swipe start position
}); /**** 
* Classes
****/
// 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 = 9;
	self.jumpPower = -18;
	self.gravity = 0.5;
	self.isJumping = false;
	self.velocityY = 0;
	self.update = function () {
		// Apply gravity
		if (self.isJumping || self.isFalling) {
			self.velocityY += self.gravity;
			self.y += self.velocityY;
			if (self.y > game.height - heroGraphics.height / 2) {
				self.isJumping = false;
				self.isFalling = false;
				self.jumpCount = 0;
				self.y = game.height - heroGraphics.height / 2;
			}
		}
		self.isFalling = false;
	};
	self.jumpCount = 0;
	self.maxJumps = 2;
	self.isFalling = false;
	self.jump = function () {
		if (self.jumpCount < self.maxJumps) {
			self.jumpCount++;
			self.isJumping = true;
			self.velocityY = self.jumpPower;
		}
	};
	self.fallQuickly = function () {
		self.isFalling = true;
		self.velocityY = self.gravity * 50;
	};
});
// Obstacle class
var Obstacle = Container.expand(function () {
	var self = Container.call(this);
	var obstacleGraphics = self.createAsset('obstacle', 'Obstacle', 0.5, 1);
	self.speed = -10;
	self.move = function () {
		self.x += self.speed;
	};
});
// Bullet class
var HeroBullet = Container.expand(function () {
	var self = Container.call(this);
	var bulletGraphics = self.createAsset('heroBullet', 'Hero Bullet', 0.5, 0.5);
	bulletGraphics.scale.set(1 / 5);
	self.speed = 15;
	self.move = function () {
		self.x += self.speed;
		if (self.x > game.width) {
			self.destroy();
		}
	};
	self.checkCollisionWithObstacles = function (obstacles) {
		for (var i = obstacles.length - 1; i >= 0; i--) {
			if (self.intersects(obstacles[i])) {
				obstacles[i].destroy();
				obstacles.splice(i, 1);
				self.destroy();
				break;
			}
		}
	};
});
/**** 
* Initialize Game
****/
var game = new LK.Game({
	backgroundColor: 0x000000 // Init game with black background
});
/**** 
* Game Code
****/
// Initialize hero
var hero = game.addChild(new Hero());
hero.x = game.width / 4;
hero.y = game.height - hero.height / 2;
// Initialize hero bullets array
var heroBullets = [];
// Initialize obstacles array
var obstacles = [];
// Initialize score
var score = 0;
var scoreTxt = new Text2(score.toString(), {
	size: 150,
	fill: "#ffffff"
}); // Create shoot button
var shootButton = game.addChild(LK.getAsset('shootButton', 'Shoot Button', 1, 1));
shootButton.scale.set(5);
shootButton.x = game.width - shootButton.width * shootButton.scale.x / 2;
shootButton.y = game.height - shootButton.height * shootButton.scale.y / 2;
var canShoot = true;
shootButton.on('down', function (obj) {
	if (canShoot) {
		canShoot = false;
		var newBullet = new HeroBullet();
		newBullet.x = hero.x + hero.width / 2;
		newBullet.y = hero.y;
		heroBullets.push(newBullet);
		game.addChild(newBullet);
		LK.setTimeout(function () {
			canShoot = true;
		}, 300);
	}
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Game tick event
LK.on('tick', function () {
	// Update hero
	hero.update();
	// Move and check obstacles
	for (var i = obstacles.length - 1; i >= 0; i--) {
		obstacles[i].move();
		// Check for collision with hero
		if (hero.intersects(obstacles[i])) {
			// Check if hero jumps on top of the obstacle
			if (hero.y + hero.height / 2 <= obstacles[i].y - obstacles[i].height / 2 && hero.velocityY > 0) {
				// Remove the obstacle if jumped on top
				obstacles[i].destroy();
				obstacles.splice(i, 1);
			} else {
				// Game over if collided from the side
				LK.effects.flashScreen(0xff0000, 1000);
				LK.showGameOver();
				return;
			}
		}
		// Remove off-screen obstacles
		if (obstacles[i].x < -obstacles[i].width) {
			obstacles[i].destroy();
			obstacles.splice(i, 1);
		}
	}
	// Move and check collisions for hero bullets
	for (var b = heroBullets.length - 1; b >= 0; b--) {
		heroBullets[b].move();
		heroBullets[b].checkCollisionWithObstacles(obstacles);
		// Remove bullets that are off-screen or destroyed
		if (!heroBullets[b].parent) {
			heroBullets.splice(b, 1);
		}
	}
	// Increment score
	score++;
	scoreTxt.setText(score.toString());
	// Add new obstacles
	if (LK.ticks % 100 == 0) {
		var obstacle = new Obstacle();
		obstacle.x = game.width;
		obstacle.y = game.height;
		obstacles.push(obstacle);
		game.addChild(obstacle);
	}
});
// Prepare for swipe detection
var swipeStart = null;
var swipeThreshold = 50; // Minimum distance for a swipe to count
// Touch start event to record the start position of a swipe
game.on('down', function (obj) {
	var event = obj.event;
	swipeStart = event.getLocalPosition(game);
});
// Touch end event to detect a swipe
game.on('up', function (obj) {
	var event = obj.event;
	var swipeEnd = event.getLocalPosition(game);
	if (swipeStart) {
		if (Math.abs(swipeEnd.y - swipeStart.y) > swipeThreshold) {
			if (swipeStart.y > swipeEnd.y) {
				hero.jump();
			} else if (swipeStart.y < swipeEnd.y) {
				hero.fallQuickly();
			}
		}
	}
	swipeStart = null; // Reset swipe start position
});