Remix started
Copy Basketball Forge
User prompt
When the ball missed from the hoop, it will not show the game over
User prompt
Avoid ball going off the screen
User prompt
When it touches to the ground or to the walls, it does not show game over display.
User prompt
When you miss the shot of the ball in the hoop, you can still shoot the ball
User prompt
Add timer with 3 minutes on top of the backboard
User prompt
Fix Bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in this line: 'timer.x = self.hoopRimGraphics.x;' Line Number: 135
User prompt
Add timer on top left of the screen
User prompt
Set timer to 3 minutes.
User prompt
The timer should be counting down.
User prompt
When the score is 2024, it shows game over display
User prompt
Change the timer to 30 minutes
User prompt
When you shoot the ball then it hits the hoop then it was in, it gets 2 points instead of 1
User prompt
Migrate to the latest version of LK
User prompt
Set the timer to 1 minute
User prompt
If you reach 25 points, the game is over.
User prompt
For each shot, it gains 1 point
User prompt
A button that teleports the ball back from spawn point whenever the ball is stuck
User prompt
Put the button on top right of the screen
User prompt
Make a reset ball button where the ball can teleport back to the spawn point. Also, make an asset for it and let it show in the top right of the screen.
User prompt
Place the timer on the top middle of the screen
User prompt
Make a text with great bold font that says "2025 Basketball Shooter" under the timer
User prompt
A new year font for the text
User prompt
The backboard can move until the under of the text
User prompt
Add arial black font to the text
===================================================================
--- original.js
+++ change.js
@@ -1,40 +1,22 @@
-var Particle = Container.expand(function () {
- var self = Container.call(this);
- self.interactive = false;
- var particleGraphics = self.createAsset('fireParticle', 'Fire Particle', 0.5, 0.5);
- particleGraphics.blendMode = 1;
- self.lifeSpan = 60;
- self.speed = {
- x: (Math.random() - 0.5) * 2,
- y: (Math.random() - 0.5) * 2
- };
- self.scale.set(Math.random() * 0.6 + 0.2);
- self.rotation = Math.random() * Math.PI * 2;
- self.move = function () {
- self.x += self.speed.x;
- self.y += self.speed.y;
- self.alpha -= 0.03;
- if (self.alpha <= 0) self.destroy();
- };
-});
-var HoopRim = Container.expand(function () {
- var self = Container.call(this);
- var hoopRimGraphics = LK.getAsset('hoopRimSeparate', 'Basketball Hoop Rim Separate', .5, .5);
- self.addChild(hoopRimGraphics);
-});
+/****
+* Classes
+****/
var Ball = Container.expand(function () {
var self = Container.call(this);
self.hasScored = false;
self.hasBounced = false;
- var ballGraphics = LK.getAsset('ball', 'Basketball', .5, .5);
+ var ballGraphics = LK.getAsset('ball', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
self.addChild(ballGraphics);
self.speed = {
x: 0,
y: 0
};
self.hasThrown = false;
- self.move = function () {
+ self._move_migrated = function () {
self.speed.y += 3.2;
self.x += self.speed.x;
if (self.x < self.width / 2) {
self.x = self.width / 2;
@@ -57,9 +39,11 @@
if (self.hasScored) {
self.alpha -= 0.15;
} else {
self.alpha += 0.15;
- if (self.alpha > 1) self.alpha = 1;
+ if (self.alpha > 1) {
+ self.alpha = 1;
+ }
}
};
self.bounceOffPoint = function (x, y, elasticity) {
var dx = self.x - x;
@@ -104,26 +88,41 @@
LK.clearInterval(interval);
}
});
};
- var backboardGraphics = LK.getAsset('backboard', 'Basketball Backboard', .5, .5);
+ var backboardGraphics = LK.getAsset('backboard', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
backboardGraphics.y -= 250;
self.addChild(backboardGraphics);
- self.hoopRimGraphics = LK.getAsset('hoopRim', 'Basketball Hoop Rim', .5, .5);
+ self.hoopRimGraphics = LK.getAsset('hoopRim', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
self.hoopRimGraphics.y = backboardGraphics.height / 2 - 550 + 20 + 120 + 150 + 100;
self.hoopRimGraphics.alpha = 0;
self.addChild(self.hoopRimGraphics);
- self.leftElement = LK.getAsset('leftElement', 'Left Side Element', .5, .5);
+ self.leftElement = LK.getAsset('leftElement', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
self.leftElement.x = self.hoopRimGraphics.x - self.hoopRimGraphics.width / 2 + self.leftElement.width / 2 - 50;
self.leftElement.y = self.hoopRimGraphics.y - 250;
self.leftElement.alpha = 0;
self.addChild(self.leftElement);
- self.rightElement = LK.getAsset('rightElement', 'Right Side Element', .5, .5);
+ self.rightElement = LK.getAsset('rightElement', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
self.rightElement.x = self.hoopRimGraphics.x + self.hoopRimGraphics.width / 2 - self.rightElement.width / 2 + 50;
self.rightElement.y = self.hoopRimGraphics.y - 250;
self.rightElement.alpha = 0;
self.addChild(self.rightElement);
- self.hoopOutlineGraphics = LK.getAsset('hoopOutline', 'Basketball Hoop Outline', 1, .5);
+ self.hoopOutlineGraphics = LK.getAsset('hoopOutline', {
+ anchorX: 1,
+ anchorY: 0.5
+ });
self.hoopOutlineGraphics.y = self.hoopRimGraphics.y - 230;
self.hoopOutlineGraphics.alpha = 1;
self.hoopOutlineGraphics.tint = 0xbb502e;
self.hoopOutlineGraphics.rotation = Math.PI / 2;
@@ -146,182 +145,228 @@
self.scoreLabel.x = self.hoopRimGraphics.x;
self.scoreLabel.y = self.hoopRimGraphics.y - 250 - 20 - 420;
self.addChild(self.scoreLabel);
});
-var Game = Container.expand(function () {
+var HoopRim = Container.expand(function () {
var self = Container.call(this);
- var bg = LK.getAsset('background', 'Background Image', 0.5, 0.5);
- bg.x = 2048 / 2;
- bg.y = 2732 / 2 + 150;
- bg.alpha = 0.7;
- self.addChild(bg);
- var timerTxt = new Text2('00:00', {
- size: 150,
- fill: "#ffffff"
+ var hoopRimGraphics = LK.getAsset('hoopRimSeparate', {
+ anchorX: 0.5,
+ anchorY: 0.5
});
- timerTxt.anchor.set(0, 0);
- timerTxt.x = 50;
- timerTxt.y = 50;
- LK.gui.topLeft.addChild(timerTxt);
- var gameTime = 1800;
- var timerInterval = LK.setInterval(function () {
- gameTime--;
- if (gameTime <= 0) {
- LK.clearInterval(timerInterval);
- LK.showGameOver();
- return;
- }
- var minutes = Math.floor(gameTime / 60);
- var seconds = gameTime % 60;
- timerTxt.setText((minutes < 10 ? '0' : '') + minutes + ':' + (seconds < 10 ? '0' : '') + seconds);
- }, 1000);
- var hoop = self.addChild(new Hoop());
- var score = 0;
- var scoreMultiplier = 1;
- var ballShadow = LK.getAsset('ballShadow', 'Ball Shadow', .5, .5);
- ballShadow.alpha = 0.5;
- self.addChild(ballShadow);
- var ball = self.addChild(new Ball());
- var hoopRim = self.addChild(new HoopRim());
- ball.hitElement = '';
- hoop.x = 2048 / 2;
- hoop.y = 2732 / 2;
- hoopRim.x = hoop.x;
- hoopRim.y = hoop.y + hoop.children[1].y - 250;
- ball.x = 2048 / 2;
- ball.on('down', function (obj) {
- if (!ball.hasThrown) {
- var event = obj.event;
- dragStart = event.getLocalPosition(self);
- }
+ self.addChild(hoopRimGraphics);
+});
+var Particle = Container.expand(function () {
+ var self = Container.call(this);
+ self.interactive = false;
+ var particleGraphics = self.attachAsset('fireParticle', {
+ anchorX: 0.5,
+ anchorY: 0.5
});
- var dragStart = null;
- stage.on('move', function (obj) {
+ particleGraphics.blendMode = 1;
+ self.lifeSpan = 60;
+ self.speed = {
+ x: (Math.random() - 0.5) * 2,
+ y: (Math.random() - 0.5) * 2
+ };
+ self.scale.set(Math.random() * 0.6 + 0.2);
+ self.rotation = Math.random() * Math.PI * 2;
+ self._move_migrated = function () {
+ self.x += self.speed.x;
+ self.y += self.speed.y;
+ self.alpha -= 0.03;
+ if (self.alpha <= 0) {
+ self.destroy();
+ }
+ };
+});
+
+/****
+* Initialize Game
+****/
+var game = new LK.Game({
+ backgroundColor: 0x000000
+});
+
+/****
+* Game Code
+****/
+var bg = LK.getAsset('background', {
+ anchorX: 0.5,
+ anchorY: 0.5
+});
+bg.x = 2048 / 2;
+bg.y = 2732 / 2 + 150;
+bg.alpha = 0.7;
+game.addChild(bg);
+var timerTxt = new Text2('00:00', {
+ size: 150,
+ fill: "#ffffff"
+});
+timerTxt.anchor.set(0, 0);
+timerTxt.x = 50;
+timerTxt.y = 50;
+LK.gui.topLeft.addChild(timerTxt);
+var gameTime = 1800;
+var timerInterval = LK.setInterval(function () {
+ gameTime--;
+ if (gameTime <= 0) {
+ LK.clearInterval(timerInterval);
+ LK.showGameOver();
+ return;
+ }
+ var minutes = Math.floor(gameTime / 60);
+ var seconds = gameTime % 60;
+ timerTxt.setText((minutes < 10 ? '0' : '') + minutes + ':' + (seconds < 10 ? '0' : '') + seconds);
+}, 1000);
+var hoop = game.addChild(new Hoop());
+var score = 0;
+var scoreMultiplier = 1;
+var ballShadow = LK.getAsset('ballShadow', {
+ anchorX: 0.5,
+ anchorY: 0.5
+});
+ballShadow.alpha = 0.5;
+game.addChild(ballShadow);
+var ball = game.addChild(new Ball());
+var hoopRim = game.addChild(new HoopRim());
+ball.hitElement = '';
+hoop.x = 2048 / 2;
+hoop.y = 2732 / 2;
+hoopRim.x = hoop.x;
+hoopRim.y = hoop.y + hoop.children[1].y - 250;
+ball.x = 2048 / 2;
+ball.on('down', function (x, y, obj) {
+ if (!ball.hasThrown) {
+ var event = obj;
+ dragStart = game.toLocal(event.global);
+ }
+});
+var dragStart = null;
+game.on('move', function (x, y, obj) {
+ var event = obj;
+ var pos = game.toLocal(event.global);
+ if (dragStart !== null && ball.distanceTo(pos.x, pos.y) > 400) {
+ game.fireBall(obj);
+ }
+});
+game.fireBall = function (obj) {
+ if (dragStart !== null) {
var event = obj.event;
- var pos = event.getLocalPosition(self);
- if (dragStart !== null && ball.distanceTo(pos.x, pos.y) > 400) {
- self.fireBall(obj);
+ var pos = game.toLocal(event.global);
+ var dx = pos.x - dragStart.x;
+ var dy = pos.y - dragStart.y;
+ var angle = Math.atan2(dy, dx);
+ ball.speed.x = Math.cos(angle) * 72 * 1.76 * 0.9 / 3;
+ ball.speed.y = Math.sin(angle) * 72 * 1.76 * 0.9;
+ ball.hasThrown = true;
+ ball.hitElement = '';
+ game.removeChild(ball);
+ game.addChild(ball);
+ dragStart = null;
+ }
+};
+game.on('up', function (x, y, obj) {
+ if (dragStart !== null) {
+ var event = obj;
+ var pos = game.toLocal(event.global);
+ var distance = Math.sqrt(Math.pow(pos.x - dragStart.x, 2) + Math.pow(pos.y - dragStart.y, 2));
+ if (distance > 150) {
+ game.fireBall(obj);
}
- });
- self.fireBall = function (obj) {
- if (dragStart !== null) {
- var event = obj.event;
- var pos = event.getLocalPosition(self);
- var dx = pos.x - dragStart.x;
- var dy = pos.y - dragStart.y;
- var angle = Math.atan2(dy, dx);
- ball.speed.x = Math.cos(angle) * 72 * 1.76 * 0.9 / 3;
- ball.speed.y = Math.sin(angle) * 72 * 1.76 * 0.9;
- ball.hasThrown = true;
- ball.hitElement = '';
- self.removeChild(ball);
- self.addChild(ball);
- dragStart = null;
+ }
+ dragStart = null;
+});
+var floorY = 2732 - 40 + 900 * (ball.scale.y - 1);
+ball.y = floorY - ball.height;
+LK.on('tick', function () {
+ if (scoreMultiplier === 3) {
+ for (var i = 0; i < 2; i++) {
+ var particle = new Particle();
+ particle.alpha = ball.alpha;
+ var angle = Math.random() * Math.PI * 2;
+ var radius = ball.width * 0.5 * Math.sqrt(Math.random());
+ particle.x = ball.x + Math.cos(angle) * radius;
+ particle.y = ball.y + Math.sin(angle) * radius;
+ game.addChild(particle);
}
- };
- stage.on('up', function (obj) {
- if (dragStart !== null) {
- var event = obj.event;
- var pos = event.getLocalPosition(self);
- var distance = Math.sqrt(Math.pow(pos.x - dragStart.x, 2) + Math.pow(pos.y - dragStart.y, 2));
- if (distance > 150) {
- self.fireBall(obj);
- }
+ }
+ game.children.forEach(function (child) {
+ if (child instanceof Particle) {
+ child._move_migrated();
}
- dragStart = null;
});
var floorY = 2732 - 40 + 900 * (ball.scale.y - 1);
- ball.y = floorY - ball.height;
- LK.on('tick', function () {
- if (scoreMultiplier === 3) {
- for (var i = 0; i < 2; i++) {
- var particle = new Particle();
- particle.alpha = ball.alpha;
- var angle = Math.random() * Math.PI * 2;
- var radius = ball.width * 0.5 * Math.sqrt(Math.random());
- particle.x = ball.x + Math.cos(angle) * radius;
- particle.y = ball.y + Math.sin(angle) * radius;
- self.addChild(particle);
- }
+ ball._move_migrated();
+ if (ball.speed.y > 0) {
+ game.removeChild(hoopRim);
+ game.addChild(hoopRim);
+ if (ball.distanceTo(hoop.x + hoop.leftElement.x, hoop.y + hoop.leftElement.y) < ball.width / 2 + hoop.leftElement.width / 2) {
+ ball.moveToDistance(hoop.x + hoop.leftElement.x, hoop.y + hoop.leftElement.y, ball.width / 2 + hoop.leftElement.width / 2 + 1);
+ ball.bounceOffPoint(hoop.x + hoop.leftElement.x, hoop.y + hoop.leftElement.y, 0.5);
+ ball.hitElement = 'left';
}
- self.children.forEach(function (child) {
- if (child instanceof Particle) {
- child.move();
- }
- });
- var floorY = 2732 - 40 + 900 * (ball.scale.y - 1);
- ball.move();
- if (ball.speed.y > 0) {
- self.removeChild(hoopRim);
- self.addChild(hoopRim);
- if (ball.distanceTo(hoop.x + hoop.leftElement.x, hoop.y + hoop.leftElement.y) < ball.width / 2 + hoop.leftElement.width / 2) {
- ball.moveToDistance(hoop.x + hoop.leftElement.x, hoop.y + hoop.leftElement.y, ball.width / 2 + hoop.leftElement.width / 2 + 1);
- ball.bounceOffPoint(hoop.x + hoop.leftElement.x, hoop.y + hoop.leftElement.y, 0.5);
- ball.hitElement = 'left';
- }
- if (ball.distanceTo(hoop.x + hoop.rightElement.x, hoop.y + hoop.rightElement.y) < ball.width / 2 + hoop.rightElement.width / 2) {
- ball.moveToDistance(hoop.x + hoop.rightElement.x, hoop.y + hoop.rightElement.y, ball.width / 2 + hoop.rightElement.width / 2 + 1);
- ball.bounceOffPoint(hoop.x + hoop.rightElement.x, hoop.y + hoop.rightElement.y, 0.5);
- ball.hitElement = 'right';
- }
+ if (ball.distanceTo(hoop.x + hoop.rightElement.x, hoop.y + hoop.rightElement.y) < ball.width / 2 + hoop.rightElement.width / 2) {
+ ball.moveToDistance(hoop.x + hoop.rightElement.x, hoop.y + hoop.rightElement.y, ball.width / 2 + hoop.rightElement.width / 2 + 1);
+ ball.bounceOffPoint(hoop.x + hoop.rightElement.x, hoop.y + hoop.rightElement.y, 0.5);
+ ball.hitElement = 'right';
}
+ }
+ ballShadow.x = ball.x;
+ ballShadow.y = 1800 + ball.height / 2 + 500 * ball.scale.x;
+ var scale = (1 - 2 * (ball.y - 2732 + ball.height) / 2732) * ball.scale.x;
+ ballShadow.scale.set(scale);
+ ballShadow.alpha = (1 - scale + 1) / 2 * ball.alpha;
+ if (ball.y + ball.height > floorY) {
+ ball.y = floorY - ball.height;
+ ball.speed.y *= -0.75;
ballShadow.x = ball.x;
- ballShadow.y = 1800 + ball.height / 2 + 500 * ball.scale.x;
- var scale = (1 - 2 * (ball.y - 2732 + ball.height) / 2732) * ball.scale.x;
- ballShadow.scale.set(scale);
- ballShadow.alpha = (1 - scale + 1) / 2 * ball.alpha;
- if (ball.y + ball.height > floorY) {
+ ballShadow.visible = true;
+ if (ball.hasThrown && !ball.hasScored) {
+ ball.hasBounced = true;
+ ball.x = 2048 / 2;
ball.y = floorY - ball.height;
- ball.speed.y *= -0.75;
- ballShadow.x = ball.x;
- ballShadow.visible = true;
- if (ball.hasThrown && !ball.hasScored) {
- ball.hasBounced = true;
- ball.x = 2048 / 2;
- ball.y = floorY - ball.height;
- ball.speed.x = 0;
- ball.speed.y = 0;
- ball.hasThrown = false;
- ball.hasBounced = false;
- ball.scale.x = 1;
- ball.scale.y = 1;
- ball.alpha = 1;
- scoreMultiplier = 1;
- hoop.multiplierLabel.setText('');
- hoop.moveTo(Math.random() * (2048 - 1000) + 500, Math.random() * (2732 - 2000) + 1000, hoopRim);
- } else if (ball.hasScored) {
- ball.x = 2048 / 2;
- ball.y = 2532 - ball.height;
- ball.speed.x = 0;
- ball.speed.y = 0;
- ball.hasThrown = false;
- ball.hasScored = false;
- ball.hasBounced = false;
- ball.scale.x = 1;
- ball.scale.y = 1;
- if (ball.hitElement === '') {
- if (scoreMultiplier < 3) {
- scoreMultiplier++;
- }
- } else {
- scoreMultiplier = 1;
+ ball.speed.x = 0;
+ ball.speed.y = 0;
+ ball.hasThrown = false;
+ ball.hasBounced = false;
+ ball.scale.x = 1;
+ ball.scale.y = 1;
+ ball.alpha = 1;
+ scoreMultiplier = 1;
+ hoop.multiplierLabel.setText('');
+ hoop.moveTo(Math.random() * (2048 - 1000) + 500, Math.random() * (2732 - 2000) + 1000, hoopRim);
+ } else if (ball.hasScored) {
+ ball.x = 2048 / 2;
+ ball.y = 2532 - ball.height;
+ ball.speed.x = 0;
+ ball.speed.y = 0;
+ ball.hasThrown = false;
+ ball.hasScored = false;
+ ball.hasBounced = false;
+ ball.scale.x = 1;
+ ball.scale.y = 1;
+ if (ball.hitElement === '') {
+ if (scoreMultiplier < 3) {
+ scoreMultiplier++;
}
- if (scoreMultiplier > 1) {
- hoop.multiplierLabel.setText('x' + scoreMultiplier);
- } else {
- hoop.multiplierLabel.setText('');
- }
- ball.hitElement = '';
- hoop.moveTo(Math.random() * (2048 - 1000) + 500, Math.random() * (2732 - 2000) + 1000, hoopRim);
+ } else {
+ scoreMultiplier = 1;
}
- } else if (ball.hasThrown && ball.intersects(hoop.hoopRimGraphics) && ball.speed.y > 0 && !ball.hasScored && !ball.hasBounced && ball.x > hoop.x + hoop.leftElement.x && ball.x < hoop.x + hoop.rightElement.x) {
- ball.hasScored = true;
- score += scoreMultiplier * 2;
- if (score === 2024) {
- LK.showGameOver();
+ if (scoreMultiplier > 1) {
+ hoop.multiplierLabel.setText('x' + scoreMultiplier);
} else {
- hoop.scoreLabel.setText(score.toString());
- hoop.setScore(score);
+ hoop.multiplierLabel.setText('');
}
+ ball.hitElement = '';
+ hoop.moveTo(Math.random() * (2048 - 1000) + 500, Math.random() * (2732 - 2000) + 1000, hoopRim);
}
- });
-});
+ } else if (ball.hasThrown && ball.intersects(hoop.hoopRimGraphics) && ball.speed.y > 0 && !ball.hasScored && !ball.hasBounced && ball.x > hoop.x + hoop.leftElement.x && ball.x < hoop.x + hoop.rightElement.x) {
+ ball.hasScored = true;
+ score += scoreMultiplier * 2;
+ if (score === 2024) {
+ LK.showGameOver();
+ } else {
+ hoop.scoreLabel.setText(score.toString());
+ hoop.setScore(score);
+ }
+ }
+});
\ No newline at end of file
Basketball, cartoon style Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
4:3 Simple rectangle white outline. Black background
Skull explosion
City, night with moon and stars. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Wide Single Orange metal bar lying down Single Game Texture. In-Game asset. 2d. Pixelart. White background. Blank background. Low detail. High contrast. —ar 2:1
https://kagi.com/proxy/basketball_backboard.png?c=iNrrnnUOe99nVfDGJsYBLujiaX2Hu-zxBFRkvLEyXdRnJ8cU3RjcAYbR-o12E923qVNGy1CEGrQG87ogCD3yUarJdZYt5R03mmEMb7Jrh-8%3D blank backboard Single Game Texture. In-Game asset. 2d. Pixelart. White background. Blank background. Low detail. High contrast.