/**** 
* Classes
****/ 
// Assets will be automatically created based on usage in the code.
// Ball class
var Ball = Container.expand(function () {
	var self = Container.call(this);
	var ballGraphics = self.attachAsset('basketball', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.velocity = {
		x: 0,
		y: 0
	};
	self.update = function () {
		if (!isDragging) {
			// Check for left wall bounce
			if (self.x <= 25 + ballGraphics.width / 2) {
				self.velocity.x = Math.abs(self.velocity.x); // Reverse velocity for bounce
				wallBounceCounter++;
			} else if (self.x >= 2023 - ballGraphics.width / 2) {
				self.velocity.x = -Math.abs(self.velocity.x); // Reverse velocity for right wall bounce
				wallBounceCounter++;
			}
			// Check for right wall bounce
			if (self.x >= 2023 - ballGraphics.width / 2) {
				self.velocity.x = -Math.abs(self.velocity.x); // Reverse velocity for bounce
			} else if (self.x <= 25 + ballGraphics.width / 2) {
				self.velocity.x = Math.abs(self.velocity.x); // Reverse velocity for left wall bounce
			}
			self.x += self.velocity.x;
			self.y += self.velocity.y;
			self.velocity.y += 0.98; // Gravity effect
			ballGraphics.rotation += self.velocity.y / 100; // Add rotation to the ball based on its velocity
			if (self.y > 2732) {
				self.velocity.y = 0; // Stop the ball when it hits the floor
				self.y = 2732; // Reset position to the bottom of the screen
				ballGraphics.rotation = 0; // Reset rotation when the ball hits the floor
			}
		}
	};
});
// DragBox class
var DragBox = Container.expand(function () {
	var self = Container.call(this);
	self.visible = false; // Make the box invisible
	self.width = 200; // Set the width of the box
	self.height = 200; // Set the height of the box
});
// Hoop class
var Hoop = Container.expand(function () {
	var self = Container.call(this);
	var hoopGraphics = self.attachAsset('hoop', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.bounceLeft = new Container();
	self.bounceLeft.width = 10;
	self.bounceLeft.height = hoopGraphics.height;
	self.bounceLeft.x = hoopGraphics.x - hoopGraphics.width / 2;
	self.bounceLeft.y = hoopGraphics.y;
	self.addChild(self.bounceLeft);
	self.bounceRight = new Container();
	self.bounceRight.width = 10;
	self.bounceRight.height = hoopGraphics.height;
	self.bounceRight.x = hoopGraphics.x + hoopGraphics.width / 2 - 10;
	self.bounceRight.y = hoopGraphics.y;
	self.addChild(self.bounceRight);
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB // Light blue background to simulate sky
});
/**** 
* Game Code
****/ 
// Add background image
var backgroundImage = game.addChild(LK.getAsset('backgroundImage', {
	anchorX: 0.5,
	// Center anchor horizontally
	anchorY: 0.5,
	// Center anchor vertically
	scaleX: 1,
	scaleY: 1,
	x: 950,
	// Center position horizontally
	y: 1366 // Center position vertically
}));
var wallBounceCounter = 0;
var hoopScoreCounter = 2;
// Variables for hoop movement
var hoopMoving = false;
var hoopDirection = 1;
var hoopSpeed = 2;
// Function to handle the dragging of the ball
function dragBall() {
	// Handle drag start
	game.on('down', function (obj) {
		var pos = obj.event.getLocalPosition(game);
		var dx = pos.x - ball.x;
		var dy = pos.y - ball.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		if (distance < ball.width / 2) {
			dragStart.x = pos.x;
			dragStart.y = pos.y;
			isDragging = true;
			isInPlay = true;
		} else {
			isDragging = false;
			isInPlay = false;
		}
	});
	// Handle drag move
	game.on('move', function (obj) {
		if (isDragging && isInPlay) {
			var pos = obj.event.getLocalPosition(game);
			var dx = pos.x - dragStart.x;
			var dy = pos.y - dragStart.y;
			var distance = Math.sqrt(dx * dx + dy * dy);
			// Calculate the speed
			var speed = Math.sqrt(ball.velocity.x * ball.velocity.x + ball.velocity.y * ball.velocity.y);
			// Limit the speed to a maximum value
			var maxSpeed = 75;
			if (speed > maxSpeed) {
				var ratio = maxSpeed / speed;
				ball.velocity.x *= ratio;
				ball.velocity.y *= ratio;
			}
			// Limit the speed to what it would be at the 500 pixel drag zone
			if (pos.y > 500) {
				pos.y = 500;
			}
		}
	});
	// Handle drag end
	game.on('up', function (obj) {
		if (isDragging) {
			var pos = obj.event.getLocalPosition(game);
			var tempVelocityX = (pos.x - dragStart.x) / 10;
			var tempVelocityY = (pos.y - dragStart.y) / 10;
			var speed = Math.sqrt(tempVelocityX * tempVelocityX + tempVelocityY * tempVelocityY);
			var maxSpeed = 100;
			if (speed > maxSpeed) {
				var ratio = maxSpeed / speed;
				ball.velocity.x = tempVelocityX * ratio;
				ball.velocity.y = tempVelocityY * ratio;
			} else {
				ball.velocity.x = tempVelocityX;
				ball.velocity.y = tempVelocityY;
			}
			isDragging = false;
		}
	});
}
// Call the function to handle the dragging of the ball
dragBall();
// Function to respawn the ball at the top of the screen
function respawnBall() {
	ball = game.addChild(new Ball());
	ball.x = 1024; // Center horizontally
	ball.y = 0; // Start at the top of the screen
	ball.velocity = {
		x: 0,
		y: 0
	}; // Make the ball still when it respawns
	isDragging = true; // Keep the ball still until interacted with
	isInPlay = false;
}
var ball;
var hoop;
var isDragging = false;
var isInPlay = false;
var dragStart = {
	x: 0,
	y: 0
};
var consecutiveBaskets = 0;
var multiplierActive = false;
var streakCooldown = false;
// Initialize ball and hoop
function initGame() {
	ball = game.addChild(new Ball());
	ball.x = 1024; // Center horizontally
	ball.y = 100; // Start 100 pixels down from the top of the screen
	ball.velocity = {
		x: 0,
		y: 0
	}; // Make the ball still when it first spawns
	isDragging = true; // Keep the ball still until interacted with
	hoop = game.addChild(new Hoop());
	hoop.x = 1024; // Center horizontally
	hoop.y = 2632; // Move the hoop up by 100 pixels
	var hoopStartPosition = {
		x: hoop.x,
		y: hoop.y
	}; // Define the starting position of the hoop
}
// Check for scoring
function checkScore() {
	if (ball.intersects(hoop)) {
		consecutiveBaskets++;
		if (consecutiveBaskets >= 8 && !multiplierActive && !streakCooldown && !countdownTxt) {
			LK.setScore(LK.getScore() + 6);
			var countdown = 10;
			countdownTxt = new Text2(countdown.toString(), {
				size: 150,
				fill: "#ffffff"
			});
			countdownTxt.anchor.set(0, 0);
			LK.gui.topLeft.addChild(countdownTxt);
			var countdownInterval = LK.setInterval(function () {
				countdown--;
				if (countdown <= 0) {
					LK.clearInterval(countdownInterval);
					LK.gui.center.removeChild(countdownTxt);
					countdownTxt = null;
					multiplierActive = false;
					streakCooldown = true;
					LK.setTimeout(function () {
						streakCooldown = false;
					}, 30000);
				} else {
					countdownTxt.setText(countdown.toString());
				}
			}, 1000);
		} else {
			LK.setScore(LK.getScore() + hoopScoreCounter + wallBounceCounter);
		}
		// Reset consecutiveBaskets and wall bounce counter after scoring
		consecutiveBaskets = 0;
		wallBounceCounter = 0;
		// Update score text
		scoreTxt.setText(LK.getScore());
		// Start moving the hoop if score is over 25 and hoop is not already moving
		// Increase hoop speed by 1.2x every 25 score after the first 25
		if (LK.getScore() > 25 && !hoopMoving) {
			hoopMoving = true;
		} else if (LK.getScore() % 25 == 0 && LK.getScore() > 25) {
			hoopSpeed *= 1.2;
		}
		// Move the ball back to the respawn position
		ball.x = 1024; // Center horizontally
		ball.y = 100; // Start 100 pixels down from the top of the screen
		ball.velocity = {
			x: 0,
			y: 0
		}; // Make the ball still when it respawns
		isDragging = true; // Keep the ball still until interacted with
		isInPlay = false;
		// Move the hoop to a new location
		var newX = Math.random() * (1848 - 100) + 100; // Random x position between 100 and 1848
		var newY = Math.random() * (2532 - 1200) + 1200; // Random y position between 1200 and 2532
		// Add glide animation to the hoop when it moves to a different location
		var glideTime = 0.5; // Glide time in seconds
		var glideFrames = glideTime * 60; // Convert glide time to frames
		var glideX = (newX - hoop.x) / glideFrames; // Calculate glide distance per frame for x
		var glideY = (newY - hoop.y) / glideFrames; // Calculate glide distance per frame for y
		var glideFrame = 0; // Initialize glide frame counter
		var glideInterval = LK.setInterval(function () {
			hoop.x += glideX;
			hoop.y += glideY;
			glideFrame++;
			if (glideFrame >= glideFrames) {
				LK.clearInterval(glideInterval); // Clear interval when glide animation is done
			}
		}, 1000 / 60); // Set interval to match game frame rate
	}
}
// Game tick
LK.on('tick', function () {
	if (!isDragging) {
		ball.update();
	}
	checkScore();
	// Move the hoop left and right if hoopMoving is true
	if (hoopMoving) {
		hoop.x += hoopDirection * hoopSpeed;
		// Reverse direction if hoop hits screen boundaries
		if (hoop.x <= 100 || hoop.x >= 1948) {
			hoopDirection *= -1;
		}
	}
	// Check if the ball is off the screen or hits the bottom
	if (ball.x <= 2 || ball.x >= 2046 || ball.y >= 2730) {
		if (!multiplierActive) {
			consecutiveBaskets = 0;
		}
		if (LK.getScore() == 0) {
			wallBounceCounter = 0; // Reset wall bounce counter when player fails to get a basket with score = 0
			// Move the ball back to the respawn position
			ball.x = 1024; // Center horizontally
			ball.y = 100; // Start 100 pixels down from the top of the screen
			ball.velocity = {
				x: 0,
				y: 0
			}; // Make the ball still when it respawns
			isDragging = true; // Keep the ball still until interacted with
			isInPlay = false;
			// Create an array of retry messages
			var retryMessages = ['Try Again', 'One More Time', 'Just Click On It', 'How Hard Can It Be?'];
			// Randomly select a retry message
			var retryMessage = retryMessages[Math.floor(Math.random() * retryMessages.length)];
			// Check if a retry message is currently displayed
			if (currentRetryMessage) {
				// Fade out the current retry message
				var fadeOutFrames = fadeOutTime * 60; // Convert fade out time to frames
				var fadeOutAlpha = 1 / fadeOutFrames; // Calculate alpha decrease per frame
				var fadeOutFrame = 0; // Initialize fade out frame counter
				var fadeOutInterval = LK.setInterval(function () {
					currentRetryMessage.alpha -= fadeOutAlpha;
					fadeOutFrame++;
					if (fadeOutFrame >= fadeOutFrames) {
						LK.clearInterval(fadeOutInterval); // Clear interval when fade out animation is done
						LK.gui.center.removeChild(currentRetryMessage);
						currentRetryMessage = null;
					}
				}, 1000 / 60); // Set interval to match game frame rate
			} else {
				currentRetryMessage = null;
			}
			// Display the selected retry message for 3 seconds
			var tryAgainTxt = new Text2(retryMessage, {
				size: 150,
				fill: "#ffffff",
				stroke: "#000000",
				// Black stroke
				strokeThickness: 10 // Stroke thickness of 10
			});
			tryAgainTxt.anchor.set(0.5, 0);
			tryAgainTxt.y = 500;
			tryAgainTxt.alpha = 0; // Set initial alpha to 0 for fade in
			LK.gui.center.addChild(tryAgainTxt);
			currentRetryMessage = tryAgainTxt;
			// Fade in animation
			var fadeInTime = 0.25; // Fade in time in seconds
			var fadeInFrames = fadeInTime * 60; // Convert fade in time to frames
			var fadeInAlpha = 1 / fadeInFrames; // Calculate alpha increase per frame
			var fadeInFrame = 0; // Initialize fade in frame counter
			var fadeInInterval = LK.setInterval(function () {
				tryAgainTxt.alpha += fadeInAlpha;
				fadeInFrame++;
				if (fadeInFrame >= fadeInFrames) {
					LK.clearInterval(fadeInInterval); // Clear interval when fade in animation is done
				}
			}, 1000 / 60); // Set interval to match game frame rate
			// Fade out animation
			var fadeOutTime = 0.25; // Fade out time in seconds
			LK.setTimeout(function () {
				var fadeOutFrames = fadeOutTime * 60; // Convert fade out time to frames
				var fadeOutAlpha = 1 / fadeOutFrames; // Calculate alpha decrease per frame
				var fadeOutFrame = 0; // Initialize fade out frame counter
				var fadeOutInterval = LK.setInterval(function () {
					tryAgainTxt.alpha -= fadeOutAlpha;
					fadeOutFrame++;
					if (fadeOutFrame >= fadeOutFrames) {
						LK.clearInterval(fadeOutInterval); // Clear interval when fade out animation is done
						LK.gui.center.removeChild(tryAgainTxt);
					}
				}, 1000 / 60); // Set interval to match game frame rate
			}, 3000 - fadeOutTime * 1000); // Start fade out animation 0.25 seconds before removing the text
		} else {
			LK.showGameOver();
		}
	}
});
// Initialize game elements
initGame();
// Create score text
var scoreTxt = new Text2('0', {
	size: 150,
	fill: "#ffffff",
	stroke: "#000000",
	// Black stroke
	strokeThickness: 5 // Stroke thickness of 5
});
// Create a variable to store the current retry message text object
var currentRetryMessage;
// Center the score text horizontally, anchor point set at the middle of its top edge.
scoreTxt.anchor.set(0.5, 0);
// Add the score text to the GUI overlay.
// The score text is attached to the top-center of the screen.
LK.gui.center.addChild(scoreTxt); /**** 
* Classes
****/ 
// Assets will be automatically created based on usage in the code.
// Ball class
var Ball = Container.expand(function () {
	var self = Container.call(this);
	var ballGraphics = self.attachAsset('basketball', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.velocity = {
		x: 0,
		y: 0
	};
	self.update = function () {
		if (!isDragging) {
			// Check for left wall bounce
			if (self.x <= 25 + ballGraphics.width / 2) {
				self.velocity.x = Math.abs(self.velocity.x); // Reverse velocity for bounce
				wallBounceCounter++;
			} else if (self.x >= 2023 - ballGraphics.width / 2) {
				self.velocity.x = -Math.abs(self.velocity.x); // Reverse velocity for right wall bounce
				wallBounceCounter++;
			}
			// Check for right wall bounce
			if (self.x >= 2023 - ballGraphics.width / 2) {
				self.velocity.x = -Math.abs(self.velocity.x); // Reverse velocity for bounce
			} else if (self.x <= 25 + ballGraphics.width / 2) {
				self.velocity.x = Math.abs(self.velocity.x); // Reverse velocity for left wall bounce
			}
			self.x += self.velocity.x;
			self.y += self.velocity.y;
			self.velocity.y += 0.98; // Gravity effect
			ballGraphics.rotation += self.velocity.y / 100; // Add rotation to the ball based on its velocity
			if (self.y > 2732) {
				self.velocity.y = 0; // Stop the ball when it hits the floor
				self.y = 2732; // Reset position to the bottom of the screen
				ballGraphics.rotation = 0; // Reset rotation when the ball hits the floor
			}
		}
	};
});
// DragBox class
var DragBox = Container.expand(function () {
	var self = Container.call(this);
	self.visible = false; // Make the box invisible
	self.width = 200; // Set the width of the box
	self.height = 200; // Set the height of the box
});
// Hoop class
var Hoop = Container.expand(function () {
	var self = Container.call(this);
	var hoopGraphics = self.attachAsset('hoop', {
		anchorX: 0.5,
		anchorY: 0.5
	});
	self.bounceLeft = new Container();
	self.bounceLeft.width = 10;
	self.bounceLeft.height = hoopGraphics.height;
	self.bounceLeft.x = hoopGraphics.x - hoopGraphics.width / 2;
	self.bounceLeft.y = hoopGraphics.y;
	self.addChild(self.bounceLeft);
	self.bounceRight = new Container();
	self.bounceRight.width = 10;
	self.bounceRight.height = hoopGraphics.height;
	self.bounceRight.x = hoopGraphics.x + hoopGraphics.width / 2 - 10;
	self.bounceRight.y = hoopGraphics.y;
	self.addChild(self.bounceRight);
});
/**** 
* Initialize Game
****/ 
var game = new LK.Game({
	backgroundColor: 0x87CEEB // Light blue background to simulate sky
});
/**** 
* Game Code
****/ 
// Add background image
var backgroundImage = game.addChild(LK.getAsset('backgroundImage', {
	anchorX: 0.5,
	// Center anchor horizontally
	anchorY: 0.5,
	// Center anchor vertically
	scaleX: 1,
	scaleY: 1,
	x: 950,
	// Center position horizontally
	y: 1366 // Center position vertically
}));
var wallBounceCounter = 0;
var hoopScoreCounter = 2;
// Variables for hoop movement
var hoopMoving = false;
var hoopDirection = 1;
var hoopSpeed = 2;
// Function to handle the dragging of the ball
function dragBall() {
	// Handle drag start
	game.on('down', function (obj) {
		var pos = obj.event.getLocalPosition(game);
		var dx = pos.x - ball.x;
		var dy = pos.y - ball.y;
		var distance = Math.sqrt(dx * dx + dy * dy);
		if (distance < ball.width / 2) {
			dragStart.x = pos.x;
			dragStart.y = pos.y;
			isDragging = true;
			isInPlay = true;
		} else {
			isDragging = false;
			isInPlay = false;
		}
	});
	// Handle drag move
	game.on('move', function (obj) {
		if (isDragging && isInPlay) {
			var pos = obj.event.getLocalPosition(game);
			var dx = pos.x - dragStart.x;
			var dy = pos.y - dragStart.y;
			var distance = Math.sqrt(dx * dx + dy * dy);
			// Calculate the speed
			var speed = Math.sqrt(ball.velocity.x * ball.velocity.x + ball.velocity.y * ball.velocity.y);
			// Limit the speed to a maximum value
			var maxSpeed = 75;
			if (speed > maxSpeed) {
				var ratio = maxSpeed / speed;
				ball.velocity.x *= ratio;
				ball.velocity.y *= ratio;
			}
			// Limit the speed to what it would be at the 500 pixel drag zone
			if (pos.y > 500) {
				pos.y = 500;
			}
		}
	});
	// Handle drag end
	game.on('up', function (obj) {
		if (isDragging) {
			var pos = obj.event.getLocalPosition(game);
			var tempVelocityX = (pos.x - dragStart.x) / 10;
			var tempVelocityY = (pos.y - dragStart.y) / 10;
			var speed = Math.sqrt(tempVelocityX * tempVelocityX + tempVelocityY * tempVelocityY);
			var maxSpeed = 100;
			if (speed > maxSpeed) {
				var ratio = maxSpeed / speed;
				ball.velocity.x = tempVelocityX * ratio;
				ball.velocity.y = tempVelocityY * ratio;
			} else {
				ball.velocity.x = tempVelocityX;
				ball.velocity.y = tempVelocityY;
			}
			isDragging = false;
		}
	});
}
// Call the function to handle the dragging of the ball
dragBall();
// Function to respawn the ball at the top of the screen
function respawnBall() {
	ball = game.addChild(new Ball());
	ball.x = 1024; // Center horizontally
	ball.y = 0; // Start at the top of the screen
	ball.velocity = {
		x: 0,
		y: 0
	}; // Make the ball still when it respawns
	isDragging = true; // Keep the ball still until interacted with
	isInPlay = false;
}
var ball;
var hoop;
var isDragging = false;
var isInPlay = false;
var dragStart = {
	x: 0,
	y: 0
};
var consecutiveBaskets = 0;
var multiplierActive = false;
var streakCooldown = false;
// Initialize ball and hoop
function initGame() {
	ball = game.addChild(new Ball());
	ball.x = 1024; // Center horizontally
	ball.y = 100; // Start 100 pixels down from the top of the screen
	ball.velocity = {
		x: 0,
		y: 0
	}; // Make the ball still when it first spawns
	isDragging = true; // Keep the ball still until interacted with
	hoop = game.addChild(new Hoop());
	hoop.x = 1024; // Center horizontally
	hoop.y = 2632; // Move the hoop up by 100 pixels
	var hoopStartPosition = {
		x: hoop.x,
		y: hoop.y
	}; // Define the starting position of the hoop
}
// Check for scoring
function checkScore() {
	if (ball.intersects(hoop)) {
		consecutiveBaskets++;
		if (consecutiveBaskets >= 8 && !multiplierActive && !streakCooldown && !countdownTxt) {
			LK.setScore(LK.getScore() + 6);
			var countdown = 10;
			countdownTxt = new Text2(countdown.toString(), {
				size: 150,
				fill: "#ffffff"
			});
			countdownTxt.anchor.set(0, 0);
			LK.gui.topLeft.addChild(countdownTxt);
			var countdownInterval = LK.setInterval(function () {
				countdown--;
				if (countdown <= 0) {
					LK.clearInterval(countdownInterval);
					LK.gui.center.removeChild(countdownTxt);
					countdownTxt = null;
					multiplierActive = false;
					streakCooldown = true;
					LK.setTimeout(function () {
						streakCooldown = false;
					}, 30000);
				} else {
					countdownTxt.setText(countdown.toString());
				}
			}, 1000);
		} else {
			LK.setScore(LK.getScore() + hoopScoreCounter + wallBounceCounter);
		}
		// Reset consecutiveBaskets and wall bounce counter after scoring
		consecutiveBaskets = 0;
		wallBounceCounter = 0;
		// Update score text
		scoreTxt.setText(LK.getScore());
		// Start moving the hoop if score is over 25 and hoop is not already moving
		// Increase hoop speed by 1.2x every 25 score after the first 25
		if (LK.getScore() > 25 && !hoopMoving) {
			hoopMoving = true;
		} else if (LK.getScore() % 25 == 0 && LK.getScore() > 25) {
			hoopSpeed *= 1.2;
		}
		// Move the ball back to the respawn position
		ball.x = 1024; // Center horizontally
		ball.y = 100; // Start 100 pixels down from the top of the screen
		ball.velocity = {
			x: 0,
			y: 0
		}; // Make the ball still when it respawns
		isDragging = true; // Keep the ball still until interacted with
		isInPlay = false;
		// Move the hoop to a new location
		var newX = Math.random() * (1848 - 100) + 100; // Random x position between 100 and 1848
		var newY = Math.random() * (2532 - 1200) + 1200; // Random y position between 1200 and 2532
		// Add glide animation to the hoop when it moves to a different location
		var glideTime = 0.5; // Glide time in seconds
		var glideFrames = glideTime * 60; // Convert glide time to frames
		var glideX = (newX - hoop.x) / glideFrames; // Calculate glide distance per frame for x
		var glideY = (newY - hoop.y) / glideFrames; // Calculate glide distance per frame for y
		var glideFrame = 0; // Initialize glide frame counter
		var glideInterval = LK.setInterval(function () {
			hoop.x += glideX;
			hoop.y += glideY;
			glideFrame++;
			if (glideFrame >= glideFrames) {
				LK.clearInterval(glideInterval); // Clear interval when glide animation is done
			}
		}, 1000 / 60); // Set interval to match game frame rate
	}
}
// Game tick
LK.on('tick', function () {
	if (!isDragging) {
		ball.update();
	}
	checkScore();
	// Move the hoop left and right if hoopMoving is true
	if (hoopMoving) {
		hoop.x += hoopDirection * hoopSpeed;
		// Reverse direction if hoop hits screen boundaries
		if (hoop.x <= 100 || hoop.x >= 1948) {
			hoopDirection *= -1;
		}
	}
	// Check if the ball is off the screen or hits the bottom
	if (ball.x <= 2 || ball.x >= 2046 || ball.y >= 2730) {
		if (!multiplierActive) {
			consecutiveBaskets = 0;
		}
		if (LK.getScore() == 0) {
			wallBounceCounter = 0; // Reset wall bounce counter when player fails to get a basket with score = 0
			// Move the ball back to the respawn position
			ball.x = 1024; // Center horizontally
			ball.y = 100; // Start 100 pixels down from the top of the screen
			ball.velocity = {
				x: 0,
				y: 0
			}; // Make the ball still when it respawns
			isDragging = true; // Keep the ball still until interacted with
			isInPlay = false;
			// Create an array of retry messages
			var retryMessages = ['Try Again', 'One More Time', 'Just Click On It', 'How Hard Can It Be?'];
			// Randomly select a retry message
			var retryMessage = retryMessages[Math.floor(Math.random() * retryMessages.length)];
			// Check if a retry message is currently displayed
			if (currentRetryMessage) {
				// Fade out the current retry message
				var fadeOutFrames = fadeOutTime * 60; // Convert fade out time to frames
				var fadeOutAlpha = 1 / fadeOutFrames; // Calculate alpha decrease per frame
				var fadeOutFrame = 0; // Initialize fade out frame counter
				var fadeOutInterval = LK.setInterval(function () {
					currentRetryMessage.alpha -= fadeOutAlpha;
					fadeOutFrame++;
					if (fadeOutFrame >= fadeOutFrames) {
						LK.clearInterval(fadeOutInterval); // Clear interval when fade out animation is done
						LK.gui.center.removeChild(currentRetryMessage);
						currentRetryMessage = null;
					}
				}, 1000 / 60); // Set interval to match game frame rate
			} else {
				currentRetryMessage = null;
			}
			// Display the selected retry message for 3 seconds
			var tryAgainTxt = new Text2(retryMessage, {
				size: 150,
				fill: "#ffffff",
				stroke: "#000000",
				// Black stroke
				strokeThickness: 10 // Stroke thickness of 10
			});
			tryAgainTxt.anchor.set(0.5, 0);
			tryAgainTxt.y = 500;
			tryAgainTxt.alpha = 0; // Set initial alpha to 0 for fade in
			LK.gui.center.addChild(tryAgainTxt);
			currentRetryMessage = tryAgainTxt;
			// Fade in animation
			var fadeInTime = 0.25; // Fade in time in seconds
			var fadeInFrames = fadeInTime * 60; // Convert fade in time to frames
			var fadeInAlpha = 1 / fadeInFrames; // Calculate alpha increase per frame
			var fadeInFrame = 0; // Initialize fade in frame counter
			var fadeInInterval = LK.setInterval(function () {
				tryAgainTxt.alpha += fadeInAlpha;
				fadeInFrame++;
				if (fadeInFrame >= fadeInFrames) {
					LK.clearInterval(fadeInInterval); // Clear interval when fade in animation is done
				}
			}, 1000 / 60); // Set interval to match game frame rate
			// Fade out animation
			var fadeOutTime = 0.25; // Fade out time in seconds
			LK.setTimeout(function () {
				var fadeOutFrames = fadeOutTime * 60; // Convert fade out time to frames
				var fadeOutAlpha = 1 / fadeOutFrames; // Calculate alpha decrease per frame
				var fadeOutFrame = 0; // Initialize fade out frame counter
				var fadeOutInterval = LK.setInterval(function () {
					tryAgainTxt.alpha -= fadeOutAlpha;
					fadeOutFrame++;
					if (fadeOutFrame >= fadeOutFrames) {
						LK.clearInterval(fadeOutInterval); // Clear interval when fade out animation is done
						LK.gui.center.removeChild(tryAgainTxt);
					}
				}, 1000 / 60); // Set interval to match game frame rate
			}, 3000 - fadeOutTime * 1000); // Start fade out animation 0.25 seconds before removing the text
		} else {
			LK.showGameOver();
		}
	}
});
// Initialize game elements
initGame();
// Create score text
var scoreTxt = new Text2('0', {
	size: 150,
	fill: "#ffffff",
	stroke: "#000000",
	// Black stroke
	strokeThickness: 5 // Stroke thickness of 5
});
// Create a variable to store the current retry message text object
var currentRetryMessage;
// Center the score text horizontally, anchor point set at the middle of its top edge.
scoreTxt.anchor.set(0.5, 0);
// Add the score text to the GUI overlay.
// The score text is attached to the top-center of the screen.
LK.gui.center.addChild(scoreTxt);
 8-Bit basketball. No lighting is present on the ball. The lighting does not affect the look of the ball.. Single Game Texture. In-Game asset. 2d. Transparent background. High contrast. No shadows.
 8-Bit hula hoop. The color is red. The hoop is flat facing towards the ground. Single Game Texture. In-Game asset. 2d. Transparent background. High contrast. No shadows.
 Basketball court. One basketball hoop with background and net is shown. Facing downcourt. 8-Bit style.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.