/****
* 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.